* feat(ai): add agent identity system with visual indicators for concurrent generation - Agent identity: assign unique colors and names to each sub-agent - Canvas indicators: breathing glow border + name pill above streaming nodes - Preview effect: outline appears 500ms before element materializes - Screen grouping: subtasks with same `screen` field share one root frame, fixing multi-page apps being split into too many frames - Screen-level parallelism: subtasks within same screen run sequentially (preserving section order), different screens run in parallel * fix(canvas): make agent indicator visual effect much more dramatic - Outer glow: 8px soft border for visible halo effect - Inner border: 2.5px sharp crisp border at high alpha - Preview fill: 10-15% alpha (was ~1% before, essentially invisible) - Breathing: faster cycle (400ms), higher range [0.35, 0.95] - Name pill: larger font (11px), bold 700, drop shadow - Pill dedup: only draw one name pill per agent (not per node) - Rounded rect helper for polished pill rendering * fix(canvas): use globalThis for agent indicator state to prevent module isolation Vite module splitting can create separate module instances for the same file when imported from different chunks. This causes the indicator Map written by the orchestrator (services/ai/) to be a different instance than the one read by the canvas hook (canvas/). Using globalThis guarantees a single shared instance across all chunks. * feat(i18n): enhance internationalization support by integrating i18next for translation in various components. Added new dependencies: i18next, i18next-browser-languagedetector, and react-i18next. Updated UI elements in the editor, toolbar, and status bar to utilize translation keys for improved localization. Enhanced README with language options for better accessibility. * feat(auto-update): implement auto-update functionality with settings management - Added auto-update feature to check for updates at app startup and periodically while running. - Introduced settings for enabling/disabling auto-update, stored in a JSON file. - Integrated IPC handlers to manage auto-update settings from the renderer process. - Created new API endpoints for managing MCP server status, including start/stop functionality. - Enhanced the UI to support theme presets, allowing users to save and load variable presets. - Updated internationalization support for new UI elements related to auto-update and presets. * feat(ai): add element boundaries to orchestrator subtask planning Orchestrator now outputs an "elements" field per subtask listing the specific UI elements it owns. Sub-agent prompts display these boundaries so each agent knows exactly what to generate and what belongs to other sections, preventing content duplication across subtasks. Also includes: sequential cascade reveal animation, agent indicator recursive tagging, delayed indicator removal, single-agent identity for sequential mode, model name truncation fix. --------- Co-authored-by: Fini <fini.yang@gmail.com> |
||
|---|---|---|
| .github/workflows | ||
| .vscode | ||
| build | ||
| electron | ||
| public | ||
| screenshot | ||
| scripts | ||
| server | ||
| src | ||
| .cta.json | ||
| .gitignore | ||
| bun.lock | ||
| CLAUDE.md | ||
| components.json | ||
| electron-builder.yml | ||
| LICENSE | ||
| package.json | ||
| README.de.md | ||
| README.es.md | ||
| README.fr.md | ||
| README.hi.md | ||
| README.id.md | ||
| README.ja.md | ||
| README.ko.md | ||
| README.md | ||
| README.pt.md | ||
| README.ru.md | ||
| README.th.md | ||
| README.tr.md | ||
| README.vi.md | ||
| README.zh-TW.md | ||
| README.zh.md | ||
| tsconfig.json | ||
| vite.config.ts | ||
OpenPencil
AI-native open-source design tool. Design-as-Code.
Prompt to UI on canvas. Multi-agent orchestration. Built-in MCP server. Code generation.
English · 简体中文 · 繁體中文 · 日本語 · 한국어 · Français · Español · Deutsch · Português · Русский · हिन्दी · Türkçe · ไทย · Tiếng Việt · Bahasa Indonesia
Quick Start · AI · Features · Discord · Contributing
Click the image to watch the demo video
Quick Start
# Install dependencies
bun install
# Start dev server at http://localhost:3000
bun --bun run dev
Or run as a desktop app:
bun run electron:dev
AI-Native Design
OpenPencil is built around AI from the ground up — not as a plugin, but as a core workflow.
Prompt to UI
- Text-to-design — describe a page, get it generated on canvas in real-time with streaming animation
- Orchestrator — decomposes complex pages into spatial sub-tasks for parallel generation
- Design modification — select elements, then describe changes in natural language
- Vision input — attach screenshots or mockups for reference-based design
Multi-Agent Support
| Agent | Setup |
|---|---|
| Claude Code | No config — uses Claude Agent SDK with local OAuth |
| Codex CLI | Connect in Agent Settings (Cmd+,) |
| OpenCode | Connect in Agent Settings (Cmd+,) |
MCP Server
- Built-in MCP server — one-click install into Claude Code / Codex / Gemini / OpenCode / Kiro CLIs
- Design automation from terminal: read, create, and modify
.opfiles via any MCP-compatible agent
Code Generation
- React + Tailwind CSS
- HTML + CSS
- CSS Variables from design tokens
Features
Canvas & Drawing
- Infinite canvas with pan, zoom, smart alignment guides, and snapping
- Rectangle, Ellipse, Line, Polygon, Pen (Bezier), Frame, Text
- Icon picker (Iconify) and image import (PNG/JPEG/SVG/WebP/GIF)
- Auto-layout — vertical/horizontal with gap, padding, justify, align
- Multi-page documents with tab navigation
Design System
- Design variables — color, number, string tokens with
$variablereferences - Multi-theme support — multiple axes, each with variants (Light/Dark, Compact/Comfortable)
- Component system — reusable components with instances and overrides
- CSS sync — auto-generated custom properties,
var(--name)in code output
Figma Import
- Import
.figfiles with layout, fills, strokes, effects, text, images, and vectors preserved
Desktop App
- Native macOS, Windows, and Linux via Electron
- Auto-update from GitHub Releases
- Native application menu and file dialogs
Tech Stack
| Frontend | React 19 · TanStack Start · Tailwind CSS v4 · shadcn/ui |
| Canvas | Fabric.js v7 |
| State | Zustand v5 |
| Server | Nitro |
| Desktop | Electron 35 |
| AI | Anthropic SDK · Claude Agent SDK · OpenCode SDK |
| Runtime | Bun · Vite 7 |
| File format | .op — JSON-based, human-readable, Git-friendly |
Project Structure
src/
canvas/ Fabric.js engine — drawing, sync, layout, guides, pen tool
components/ React UI — editor, panels, shared dialogs, icons
services/ai/ AI chat, orchestrator, design generation, streaming
services/figma/ Figma .fig binary import pipeline
services/codegen React+Tailwind and HTML+CSS code generators
stores/ Zustand — canvas, document, pages, history, AI, settings
variables/ Design token resolution and reference management
mcp/ MCP server tools for external CLI integration
uikit/ Reusable component kit system
server/
api/ai/ Nitro API — streaming chat, generation, validation
utils/ Claude CLI, OpenCode, Codex client wrappers
electron/
main.ts Window, Nitro fork, native menu, auto-updater
preload.ts IPC bridge
Keyboard Shortcuts
| Key | Action | Key | Action | |
|---|---|---|---|---|
V |
Select | Cmd+S |
Save | |
R |
Rectangle | Cmd+Z |
Undo | |
O |
Ellipse | Cmd+Shift+Z |
Redo | |
L |
Line | Cmd+C/X/V/D |
Copy/Cut/Paste/Duplicate | |
T |
Text | Cmd+G |
Group | |
F |
Frame | Cmd+Shift+G |
Ungroup | |
P |
Pen tool | Cmd+Shift+E |
Export | |
H |
Hand (pan) | Cmd+Shift+C |
Code panel | |
Del |
Delete | Cmd+Shift+V |
Variables panel | |
[ / ] |
Reorder | Cmd+J |
AI chat | |
| Arrows | Nudge 1px | Cmd+, |
Agent settings |
Scripts
bun --bun run dev # Dev server (port 3000)
bun --bun run build # Production build
bun --bun run test # Run tests (Vitest)
npx tsc --noEmit # Type check
bun run electron:dev # Electron dev
bun run electron:build # Electron package
Contributing
Contributions are welcome! See CLAUDE.md for architecture details and code style.
- Fork and clone
- Create a branch:
git checkout -b feat/my-feature - Run checks:
npx tsc --noEmit && bun --bun run test - Commit with Conventional Commits:
feat(canvas): add rotation snapping - Open a PR against
main
Roadmap
- Design variables & tokens with CSS sync
- Component system (instances & overrides)
- AI design generation with orchestrator
- MCP server integration
- Multi-page support
- Figma
.figimport - Boolean operations (union, subtract, intersect)
- Collaborative editing
- Plugin system
Contributors
Community
License
MIT — Copyright (c) 2026 ZSeven-W