# OpenPencil Open-source design editor. Opens `.fig` and `.pen` design files, includes built-in AI, and ships as a programmable toolkit with a headless Vue SDK for building custom editors. > **Status:** Active development. Not ready for production use. > > **Note:** There is another open-source project with the same name — [OpenPencil by ZSeven-W](https://github.com/ZSeven-W/openpencil), focused on AI-native design-to-code workflows. This project focuses on Figma-compatible visual design with real-time collaboration. **[Try it online →](https://app.openpencil.dev/demo)** · [Download](https://github.com/open-pencil/open-pencil/releases/latest) · [Documentation](https://openpencil.dev) · [llms.txt](https://openpencil.dev/llms.txt) ![OpenPencil](packages/docs/public/screenshot.png) ## Installation **macOS (Homebrew):** ```sh brew install open-pencil/tap/open-pencil ``` Or download from the [releases page](https://github.com/open-pencil/open-pencil/releases/latest), or [use the web app](https://app.openpencil.dev) — no install needed. ## What it does - **Opens `.fig` and `.pen` files** — read and write native Figma files, open supported Pencil documents from the app or OS file browser, copy & paste nodes between apps - **AI builds designs** — describe what you want in chat, 90+ tools create and modify nodes. Connect OpenRouter, Anthropic, OpenAI, Google AI, Z.ai, MiniMax, or compatible endpoints - **Fully programmable** — headless CLI, XPath queries, Figma Plugin API via `eval`, MCP server for AI agents, and desktop agent integrations for Claude Code, Codex, and Gemini CLI - **Lint, convert, and extract tokens** — inspect documents, lint naming/layout/accessibility, convert between supported formats, analyze colors/typography/spacing/clusters, and extract design tokens - **Components and variants** — create reusable components, group variants into component sets, insert local assets as instances, and switch variants from the inspector - **Design-to-code export** — export selections as JSX/Tailwind, generate token outputs, and map designs into component-oriented code workflows - **Vue SDK for custom editors** — headless components and composables for embedding OpenPencil into other apps or building workflow-specific editing surfaces. [Read the SDK docs →](https://openpencil.dev/programmable/sdk/) - **Real-time collaboration** — P2P via WebRTC, no server, no account. Cursors, presence, follow mode - **Auto layout & CSS Grid** — flex and grid layout via Yoga WASM, with gap, padding, alignment, track sizing - **~7 MB desktop app** — Tauri v2 for macOS, Windows, Linux. Also runs in the browser as a PWA ## CLI ```sh npm install -g @open-pencil/cli # or: bun add -g @open-pencil/cli ``` ### Inspect design files Browse node trees, search by name or type, dig into properties — all without opening the editor: ```sh open-pencil tree design.fig open-pencil find design.pen --type TEXT open-pencil node design.fig --id 1:23 open-pencil info design.fig ``` ``` [0] [page] "Getting started" (0:46566) [0] [section] "" (0:46567) [0] [frame] "Body" (0:46568) [0] [frame] "Introduction" (0:46569) [0] [frame] "Introduction Card" (0:46570) [0] [frame] "Guidance" (0:46571) ``` ### Query with XPath Use XPath selectors to find nodes by type, attributes, and structure: ```sh open-pencil query design.fig "//FRAME" # All frames open-pencil query design.fig "//FRAME[@width < 300]" # Frames under 300px open-pencil query design.fig "//TEXT[contains(@name, 'Button')]" # Text with 'Button' in name open-pencil query design.fig "//*[@cornerRadius > 0]" # Rounded corners open-pencil query design.fig "//SECTION//TEXT" # Text inside sections ``` ### Export Render to PNG, JPG, WEBP, SVG, `.fig`, or JSX — or export selections/pages as `.fig` and convert whole documents between supported formats: ```sh open-pencil export design.fig # PNG open-pencil export design.fig -f jpg -s 2 -q 90 # JPG at 2x, quality 90 open-pencil export design.fig -f fig --page "Page 1" # Export a page as .fig open-pencil export design.fig -f jsx --style tailwind # Tailwind JSX open-pencil convert design.pen output.fig # Convert between document formats ``` ```html

Card Title

Description text

``` ### Lint design files Catch naming, layout, structure, and accessibility issues from the terminal: ```sh open-pencil lint design.fig open-pencil lint design.pen --preset strict open-pencil lint design.fig --rule color-contrast open-pencil lint design.fig --list-rules ``` ### Analyze and extract design tokens Audit an entire design system from the terminal — find inconsistencies, extract the real palette, and spot components waiting to be extracted: ```sh open-pencil analyze colors design.fig open-pencil analyze typography design.fig open-pencil analyze spacing design.fig open-pencil analyze clusters design.fig open-pencil variables design.fig ``` ``` #1d1b20 ██████████████████████████████ 17155× #49454f ██████████████████████████████ 9814× #ffffff ██████████████████████████████ 8620× #6750a4 ██████████████████████████████ 3967× 3771× frame "container" (100% match) size: 40×40, structure: Frame > [Frame] 2982× instance "Checkboxes" (100% match) size: 48×48, structure: Instance > [Frame] ``` ### Script with Figma Plugin API `eval` gives you the full Figma Plugin API. Modify the file, write it back: ```sh open-pencil eval design.fig -c "figma.currentPage.children.length" open-pencil eval design.fig -c "figma.currentPage.selection.forEach(n => n.opacity = 0.5)" -w ``` ### Control the running app When the desktop app is running, omit the file argument — the CLI connects via RPC and operates on the live canvas. Useful for automation scripts, CI pipelines, or AI agents that need to interact with the editor: ```sh open-pencil tree # Inspect the live document open-pencil export -f png # Screenshot the current canvas open-pencil eval -c "figma.currentPage.name" # Query the editor ``` All commands support `--json` for machine-readable output. ## AI & MCP ### Built-in chat Press J to open the AI assistant. It has 100+ tools that can create shapes, set fills and strokes, manage auto-layout, work with components and variables, run boolean operations, analyze design tokens, and export assets. Bring your own API key for OpenRouter, Anthropic, OpenAI, Google AI, Z.ai, MiniMax, or compatible endpoints. No backend, no account. ### Coding agents (desktop) Use Claude Code, Codex, or Gemini CLI directly in the chat panel. The agent connects to the editor's MCP server and uses all 100+ design tools. Requires the desktop app and the agent CLI installed locally. **Setup (Claude Code):** 1. Install the ACP adapter: `npm install -g @agentclientprotocol/claude-agent-acp` 2. Add MCP permission to `~/.claude/settings.json`: ```json { "permissions": { "allow": ["mcp__open-pencil__*"] } } ``` 3. Open the desktop app → CtrlJ → select **Claude Code** from the provider dropdown ### MCP server Connect Claude Code, Cursor, Windsurf, or any MCP client to inspect, modify, and export design documents headlessly. 100+ tools. [Full docs →](https://openpencil.dev/reference/mcp-tools) **Stdio** (Claude Code, Cursor, Windsurf): ```sh npm install -g @open-pencil/mcp claude mcp add --scope user open-pencil -- openpencil-mcp ``` For other MCP clients: ```json { "mcpServers": { "open-pencil": { "command": "openpencil-mcp" } } } ``` **HTTP** (scripts, CI): ```sh openpencil-mcp-http # http://localhost:3100/mcp ``` **File access:** Set `OPENPENCIL_MCP_ROOT` to scope file operations (`open_file`, `new_document`, export `path` param) to a directory. Defaults to the current working directory. ### AI agent skill Teach your AI coding agent to use OpenPencil — inspect designs, export assets, analyze tokens, modify .fig files: ```sh npx skills add open-pencil/skills@open-pencil ``` Works with Claude Code, Cursor, Windsurf, Codex, and any agent that supports [skills](https://skills.sh). For documentation-aware agents, the docs site publishes [llms.txt](https://openpencil.dev/llms.txt), [llms-full.txt](https://openpencil.dev/llms-full.txt), and per-page Markdown files generated from the VitePress docs. ## Collaboration Share a link to co-edit in real time. No server, no account — peers connect directly via WebRTC. 1. Click the share button in the top-right panel 2. Share the generated link (`app.openpencil.dev/share/`) 3. Collaborators see your cursor, selection, and edits in real time 4. Click a peer's avatar to follow their viewport ## Why Figma is a closed platform that actively fights programmatic access. Their MCP server is read-only. [figma-use](https://github.com/dannote/figma-use) added full read/write automation via CDP — then [Figma 126 killed CDP](https://forum.figma.com/report-a-problem-6/remote-debugging-port-not-working-in-figma-desktop-126-1-2-50858). Your design files are in a proprietary binary format that only their software can fully read. Your workflows break when they decide to ship a point release. OpenPencil is the alternative: open source (MIT), reads .fig files natively, every operation is scriptable, and your data never leaves your machine. ## Roadmap OpenPencil is moving toward production-grade Figma compatibility while keeping every workflow scriptable and local-first. ### Compatibility and fidelity - Improve `.fig` import/export parity across large real-world design systems, including component sets, variants, nested instances, variables, auto layout, vector networks, and derived Figma text - Expand automated visual compatibility coverage across full multi-page documents, not just isolated fixtures - Continue renderer parity work for Skia/CanvasKit output: strokes, effects, gradients, image fills, text outlines, masks, blend modes, export bounds, and raster export compositing - Build focused regression fixtures for every discovered Figma compatibility edge case before broadening behavior ### Editor capabilities - Prototyping — frame transitions, interaction triggers, overlay management, and preview mode - Component libraries — publish, share, and consume design systems across files - Grid authoring UI — column/row span controls, grid overlays on canvas, and richer inspector controls - Variables UI — complete variable collection editing, binding discovery, and token-oriented workflows ### Performance and scale - Raster tile caching for instant zoom/pan on complex documents - Renderer profiling tools for isolating slow nodes, effects, masks, and large imported documents - Incremental layout/render invalidation for large documents and collaborative sessions ### Automation and CI - CI tools for design linting, code export, visual regression, and design-token checks in pipelines - Deeper MCP/CLI workflows for headless inspection, migration, and batch editing of `.fig` and `.pen` files - More deterministic export and comparison utilities for compatibility testing ### Platform polish - Shader effects (SkSL) — custom visual effects via GPU shaders - Windows code signing with Azure Authenticode certificates - Packaged desktop-side MCP integration so agent workflows do not require global installs ## Contributing ### Setup ```sh bun install bun run dev # Dev server at localhost:1420 bun run tauri dev # Desktop app (requires Rust) ``` ### Quality gates | Command | Description | |---------|-------------| | `bun run check` | Lint + typecheck | | `bun run test` | E2E visual regression | | `bun run test:unit` | Unit tests | | `bun run format` | Code formatting | ### Project structure ``` packages/ core/ @open-pencil/core — engine (scene graph, renderer, layout, file formats, tools) vue/ @open-pencil/vue — headless Vue SDK cli/ @open-pencil/cli — headless CLI mcp/ @open-pencil/mcp — MCP server (stdio + HTTP) docs/ Documentation site (openpencil.dev) src/ Vue app (components, composables, stores) desktop/ Tauri v2 (Rust + config) tests/ E2E (188 tests) + unit (764 tests) ``` ### Tech stack | Layer | Tech | |-------|------| | Rendering | Skia (CanvasKit WASM) | | Layout | Yoga WASM (flex + grid via [fork](https://github.com/open-pencil/yoga/tree/grid)) | | UI | Vue 3, Reka UI, Tailwind CSS 4 | | File format | Kiwi binary + Zstd + ZIP | | Collaboration | Trystero (WebRTC P2P) + Yjs (CRDT) | | Desktop | Tauri v2 | | AI/MCP | Multi-provider (Anthropic, OpenAI, Google AI, OpenRouter), MCP SDK, Hono | ### Desktop builds Requires [Rust](https://rustup.rs/) and platform-specific prerequisites ([Tauri v2 guide](https://v2.tauri.app/start/prerequisites/)). ```sh bun run tauri build ``` ## Acknowledgments Thanks to [@sld0Ant](https://github.com/sld0Ant) (Anton Soldatov) for creating and maintaining the [documentation site](https://openpencil.dev). ## License MIT