The world's first open-source AI-native vector design tool and the first to feature concurrent Agent Teams. Design-as-Code. Turn prompts into UI directly on the live canvas. A modern alternative to Pencil.
Find a file
Kayshen Xu 370e51c0f7
V0.5.1 (#78)
* fix(docker): support multi-platform builds and fix monorepo paths

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* perf(renderer): cache pre-rasterized paragraph images to avoid per-frame glyph rasterization   (#76)

* fix(canvas): stabilize frame label size during zoom

  Draw frame labels in screen-space after the viewport transform
  restore, converting scene coords manually. Previously fontSize=12/zoom
  fed into Math.ceil caused integer-boundary jumps that made labels
  flicker during zoom. Also skip shadow rendering while actively
  zooming for smoother performance.

* perf(renderer): cache pre-rasterized paragraph images to avoid per-frame glyph rasterization

   - Add paraImageCache (SkImage, 128 MB LRU limit) keyed on the same key as paraCache
   - Use drawImageRect instead of drawParagraph on cache hit, skipping per-frame glyph shaping and rasterization
   - Fall back to direct drawParagraph only when off-screen surface creation (MakeSurface) fails
   - Extract _dpr getter to deduplicate device-pixel-ratio resolution logic across draw paths
   - Evict oldest entries when cache exceeds byte limit; delete SkImage on eviction and dispose()

* feat(cli): introduce OpenPencil CLI for terminal control of the design tool

- Added a new CLI application under `apps/cli` to manage OpenPencil from the terminal.
- Implemented commands for app control (`start`, `stop`, `status`), document operations (`open`, `save`, `get`, `selection`), and design manipulation (`design`, `import`).
- Enhanced documentation with usage instructions and platform support details.
- Updated build scripts to include CLI compilation and publishing processes.
- Introduced a new GitHub Actions workflow for publishing the CLI to npm.
- Updated existing workflows to integrate CLI build steps and ensure proper versioning across packages.

* docs: update README files to include CLI tool details and multi-platform code export

- Added CLI section to README files in multiple languages, detailing commands for terminal control of the design tool.
- Included instructions for global installation and usage examples for the CLI.
- Expanded documentation on multi-platform code export capabilities from a single `.op` file to various frameworks.
- Updated CLAUDE.md to reference the new CLI documentation and its integration with the design tool.

* chore(bun.lock): update package dependencies to specific versions

- Removed workspace references for several packages in the bun.lock file.
- Updated dependencies for `@zseven-w/pen-core`, `@zseven-w/pen-types`, `@zseven-w/pen-codegen`, `@zseven-w/pen-figma`, and `@zseven-w/pen-renderer` to version `0.5.1-beta.1`.
- Ensured consistency in dependency management across the project.

* fix(docker): add missing CLI package.json to build context

The Dockerfile was missing COPY for apps/cli/package.json, causing
bun install --frozen-lockfile to fail because the CLI workspace
dependency could not be resolved.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: add unpublish script and enhance CLI publish workflow

- Introduced a new `unpublish` script to manage unpublishing of all @zseven-w packages from npm, with options for specific versions, all versions, or deprecation.
- Updated the GitHub Actions workflow to check if a version is already published before proceeding with the publish step, ensuring better error handling and preventing conflicts.
- Removed the fallback for npm publish commands to fail fast on errors, improving the reliability of the publishing process.

* chore(bun.lock): update package versions and configuration

- Bumped the configVersion from 0 to 1 in bun.lock.
- Updated several package dependencies to their latest versions, including:
  - @anthropic-ai/claude-agent-sdk to 0.2.81
  - @babel/helpers to 7.29.2
  - @babel/parser to 7.29.2
  - @babel/runtime to 7.29.2
  - @csstools/color-helpers to 6.0.2
  - @csstools/css-color-parser to 4.0.2
- Ensured consistency in dependency management across the project.

* docs: restore Feishu group QR code in Chinese README

* chore: update dependencies and add workspace references

- Added "h3" package with version "^2.0.1-rc.18" to bun.lock, package.json, and apps/web/package.json.
- Updated dependencies in multiple packages to use "workspace:*" for better management and consistency across the project.
- Ensured all relevant packages are aligned with the latest workspace structure.

* chore: update package versions in bun.lock and package.json

- Updated several @tanstack packages to their latest versions, including:
  - @tanstack/react-devtools to 0.10.0
  - @tanstack/react-router to 1.168.1
  - @tanstack/react-router-devtools to 1.166.11
  - @tanstack/react-router-ssr-query to 1.166.10
  - @tanstack/react-start to 1.167.2
  - @tanstack/router-plugin to 1.167.1
- Bumped @tanstack/devtools-vite to 0.6.0 in devDependencies.
- Mocked 'paper' module in security tests to prevent crashes in jsdom environment.

* chore: update CLI and MCP compile scripts to include package aliases

- Enhanced the `mcp:compile` and `cli:compile` scripts in `package.json` and `apps/cli/package.json` to include additional package aliases for better module resolution.
- This change improves the build process by ensuring that the correct paths are used for various dependencies.

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: leinaldo <60176594+leinaldo@users.noreply.github.com>
Co-authored-by: Fini <fini.yang@gmail.com>
2026-03-23 22:31:06 +08:00
.githooks V0.5.0 (#67) 2026-03-22 09:44:04 +08:00
.github V0.5.1 (#78) 2026-03-23 22:31:06 +08:00
.vscode V0.2.1 (#23) 2026-03-06 21:00:42 +08:00
apps V0.5.1 (#78) 2026-03-23 22:31:06 +08:00
packages V0.5.1 (#78) 2026-03-23 22:31:06 +08:00
screenshot V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
scripts V0.5.1 (#78) 2026-03-23 22:31:06 +08:00
.cta.json Initialize OpenPencil project with essential files and configurations 2026-02-17 21:14:16 +08:00
.dockerignore V0.5.0 (#71) 2026-03-22 10:09:26 +08:00
.gitignore V0.5.0 (#71) 2026-03-22 10:09:26 +08:00
bun.lock V0.5.1 (#78) 2026-03-23 22:31:06 +08:00
CLAUDE.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
Dockerfile V0.5.1 (#78) 2026-03-23 22:31:06 +08:00
LICENSE chore: update documentation and add MIT License 2026-02-18 22:35:17 +08:00
package.json V0.5.1 (#78) 2026-03-23 22:31:06 +08:00
README.de.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.es.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.fr.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.hi.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.id.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.ja.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.ko.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.pt.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.ru.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.th.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.tr.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.vi.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.zh-TW.md V0.5.1 (#77) 2026-03-23 21:20:59 +08:00
README.zh.md V0.5.1 (#78) 2026-03-23 22:31:06 +08:00
tsconfig.base.json V0.5.0 (#67) 2026-03-22 09:44:04 +08:00
tsconfig.json V0.5.0 (#67) 2026-03-22 09:44:04 +08:00

OpenPencil

OpenPencil

The world's first open-source AI-native vector design tool.
Concurrent Agent Teams • Design-as-Code • Built-in MCP Server • Multi-model Intelligence

English · 简体中文 · 繁體中文 · 日本語 · 한국어 · Français · Español · Deutsch · Português · Русский · हिन्दी · Türkçe · ไทย · Tiếng Việt · Bahasa Indonesia

Stars License CI Discord


OpenPencil — click to watch demo

Click the image to watch the demo video


Why OpenPencil

🎨 Prompt → Canvas

Describe any UI in natural language. Watch it appear on the infinite canvas in real-time with streaming animation. Modify existing designs by selecting elements and chatting.

🤖 Concurrent Agent Teams

The orchestrator decomposes complex pages into spatial sub-tasks. Multiple AI agents work on different sections simultaneously — hero, features, footer — all streaming in parallel.

🧠 Multi-Model Intelligence

Automatically adapts to each model's capabilities. Claude gets full prompts with thinking; GPT-4o/Gemini disable thinking; smaller models (MiniMax, Qwen, Llama) get simplified prompts for reliable output.

🔌 MCP Server

One-click install into Claude Code, Codex, Gemini, OpenCode, Kiro, or Copilot CLIs. Design from your terminal — read, create, and modify .op files through any MCP-compatible agent.

📦 Design-as-Code

.op files are JSON — human-readable, Git-friendly, diffable. Design variables generate CSS custom properties. Code export to React + Tailwind or HTML + CSS.

🖥️ Runs Everywhere

Web app + native desktop on macOS, Windows, and Linux via Electron. Auto-updates from GitHub Releases. .op file association — double-click to open.

⌨️ CLI — op

Control the design tool from your terminal. op design, op insert, op export — batch design DSL, node manipulation, code export. Pipe in from files or stdin. Works with desktop app or web server.

🎯 Multi-Platform Code Export

Export to React + Tailwind, HTML + CSS, Vue, Svelte, Flutter, SwiftUI, Jetpack Compose, React Native — all from one .op file. Design variables become CSS custom properties.

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

Prerequisites: Bun >= 1.0 and Node.js >= 18

Docker

Multiple image variants are available — pick the one that fits your needs:

Image Size Includes
openpencil:latest ~226 MB Web app only
openpencil-claude:latest + Claude Code CLI
openpencil-codex:latest + Codex CLI
openpencil-opencode:latest + OpenCode CLI
openpencil-copilot:latest + GitHub Copilot CLI
openpencil-gemini:latest + Gemini CLI
openpencil-full:latest ~1 GB All CLI tools

Run (web only):

docker run -d -p 3000:3000 ghcr.io/zseven-w/openpencil:latest

Run with AI CLI (e.g. Claude Code):

The AI chat relies on Claude CLI OAuth login. Use a Docker volume to persist the login session:

# Step 1 — Login (one-time)
docker volume create openpencil-claude-auth
docker run -it --rm \
  -v openpencil-claude-auth:/root/.claude \
  ghcr.io/zseven-w/openpencil-claude:latest claude login

# Step 2 — Start
docker run -d -p 3000:3000 \
  -v openpencil-claude-auth:/root/.claude \
  ghcr.io/zseven-w/openpencil-claude:latest

Build locally:

# Base (web only)
docker build --target base -t openpencil .

# With a specific CLI
docker build --target with-claude -t openpencil-claude .

# Full (all CLIs)
docker build --target full -t openpencil-full .

AI-Native Design

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+,)
GitHub Copilot copilot login then connect in Agent Settings (Cmd+,)
Gemini CLI Connect in Agent Settings (Cmd+,)

Model Capability Profiles — automatically adapts prompts, thinking mode, and timeouts per model tier. Full-tier models (Claude) get complete prompts; standard-tier (GPT-4o, Gemini, DeepSeek) disable thinking; basic-tier (MiniMax, Qwen, Llama, Mistral) get simplified nested-JSON prompts for maximum reliability.

MCP Server

  • Built-in MCP server — one-click install into Claude Code / Codex / Gemini / OpenCode / Kiro / Copilot CLIs
  • Auto-detects Node.js — if not installed, falls back to HTTP transport and auto-starts the MCP HTTP server
  • Design automation from terminal: read, create, and modify .op files via any MCP-compatible agent
  • Layered design workflowdesign_skeletondesign_contentdesign_refine for higher-fidelity multi-section designs
  • Segmented prompt retrieval — load only the design knowledge you need (schema, layout, roles, icons, planning, etc.)
  • Multi-page support — create, rename, reorder, and duplicate pages via MCP tools

Code Generation

  • React + Tailwind CSS, HTML + CSS, CSS Variables
  • Vue, Svelte, Flutter, SwiftUI, Jetpack Compose, React Native

CLI — op

Install globally and control the design tool from your terminal:

npm install -g @zseven-w/openpencil
op start                     # Launch desktop app
op design @landing.txt       # Batch design from file
op insert '{"type":"RECT"}'  # Insert a node
op export react --out .      # Export to React + Tailwind
op import:figma design.fig   # Import Figma file
cat design.dsl | op design - # Pipe from stdin

Supports three input methods: inline string, @filepath (read from file), or - (read from stdin). Works with desktop app or web dev server. See CLI README for full command reference.

Features

Canvas & Drawing

  • Infinite canvas with pan, zoom, smart alignment guides, and snapping
  • Rectangle, Ellipse, Line, Polygon, Pen (Bezier), Frame, Text
  • Boolean operations — union, subtract, intersect with contextual toolbar
  • 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 $variable references
  • 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 .fig files with layout, fills, strokes, effects, text, images, and vectors preserved

Desktop App

  • Native macOS, Windows, and Linux via Electron
  • .op file association — double-click to open, single-instance lock
  • Auto-update from GitHub Releases
  • Native application menu and file dialogs

Tech Stack

Frontend React 19 · TanStack Start · Tailwind CSS v4 · shadcn/ui
Canvas CanvasKit/Skia (WASM, GPU-accelerated)
State Zustand v5
Server Nitro
Desktop Electron 35
CLI op — terminal control, batch design DSL, code export
AI Anthropic SDK · Claude Agent SDK · OpenCode SDK · Copilot SDK
Runtime Bun · Vite 7
File format .op — JSON-based, human-readable, Git-friendly

Project Structure

openpencil/
├── apps/
│   ├── web/                 TanStack Start web app
│   │   ├── src/
│   │   │   ├── canvas/      CanvasKit/Skia engine — drawing, sync, layout
│   │   │   ├── components/  React UI — editor, panels, shared dialogs, icons
│   │   │   ├── services/ai/ AI chat, orchestrator, design generation, streaming
│   │   │   ├── stores/      Zustand — canvas, document, pages, history, AI
│   │   │   ├── mcp/         MCP server tools for external CLI integration
│   │   │   ├── hooks/       Keyboard shortcuts, file drop, Figma paste
│   │   │   └── uikit/       Reusable component kit system
│   │   └── server/
│   │       ├── api/ai/      Nitro API — streaming chat, generation, validation
│   │       └── utils/       Claude CLI, OpenCode, Codex, Copilot wrappers
│   ├── desktop/             Electron desktop app
│   │   ├── main.ts          Window, Nitro fork, native menu, auto-updater
│   │   ├── ipc-handlers.ts  Native file dialogs, theme sync, prefs IPC
│   │   └── preload.ts       IPC bridge
│   └── cli/                 CLI tool — `op` command
│       ├── src/commands/    Design, document, export, import, node, page, variable commands
│       ├── connection.ts    WebSocket connection to running app
│       └── launcher.ts      Auto-detect and launch desktop app or web server
├── packages/
│   ├── pen-types/           Type definitions for PenDocument model
│   ├── pen-core/            Document tree ops, layout engine, variables
│   ├── pen-codegen/         Code generators (React, HTML, Vue, Flutter, ...)
│   ├── pen-figma/           Figma .fig file parser and converter
│   ├── pen-renderer/        Standalone CanvasKit/Skia renderer
│   └── pen-sdk/             Umbrella SDK (re-exports all packages)
└── .githooks/               Pre-commit version sync from branch name

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
Cmd+Alt+U Boolean union Cmd+Alt+S Boolean subtract
Cmd+Alt+I Boolean intersect

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 bump <version>     # Sync version across all package.json
bun run electron:dev       # Electron dev
bun run electron:build     # Electron package
bun run cli:dev            # Run CLI from source
bun run cli:compile        # Compile CLI to dist

Contributing

Contributions are welcome! See CLAUDE.md for architecture details and code style.

  1. Fork and clone
  2. Set up version sync: git config core.hooksPath .githooks
  3. Create a branch: git checkout -b feat/my-feature
  4. Run checks: npx tsc --noEmit && bun --bun run test
  5. Commit with Conventional Commits: feat(canvas): add rotation snapping
  6. Open a PR against main

Roadmap

  • Design variables & tokens with CSS sync
  • Component system (instances & overrides)
  • AI design generation with orchestrator
  • MCP server integration with layered design workflow
  • Multi-page support
  • Figma .fig import
  • Boolean operations (union, subtract, intersect)
  • Multi-model capability profiles
  • Monorepo restructure with reusable packages
  • CLI tool (op) for terminal control
  • Collaborative editing
  • Plugin system

Contributors

Contributors

Community

Discord Join our Discord — Ask questions, share designs, suggest features.

Star History

Star History Chart

License

MIT — Copyright (c) 2026 ZSeven-W