2026-02-28 05:12:18 +00:00
# OpenPencil
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
2026-09-18 12:54:27 +00:00
[](LICENSE)
[](https://www.npmjs.com/package/@open-pencil/cli)
[](https://discord.gg/4wXc9fuZfm)
[](https://github.com/open-pencil/open-pencil/discussions)
2026-03-28 12:42:21 +00:00
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.
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
2026-06-30 06:53:29 +00:00
> **Status:** Active development. Usable today, with some rough edges as features evolve.
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
2026-08-13 10:50:28 +00:00
**[Try it online →](https://app.openpencil.dev/demo)** · [Download ](https://github.com/open-pencil/open-pencil/releases/latest ) · [Documentation ](https://openpencil.dev ) · [Roadmap ](https://openpencil.dev/development/roadmap ) · [llms.txt ](https://openpencil.dev/llms.txt )
2026-03-01 13:03:25 +00:00
2026-03-01 12:57:01 +00:00

2026-02-28 20:36:55 +00:00
2026-03-08 07:47:42 +00:00
## Installation
**macOS (Homebrew):**
```sh
2026-09-17 10:36:17 +00:00
brew install --cask openpencil
2026-03-08 07:47:42 +00:00
```
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.
fix: explain unsupported browsers instead of a blank window (#745)
* fix: explain unsupported browsers instead of a blank window
The desktop app on macOS 13 with WebKit older than Safari 17.4 opened an
empty window because startup called Promise.withResolvers, which Vite lowers
nothing for: build.target only rewrites syntax and never polyfills APIs, and
the target itself was an implicit Vite default (#744).
Make the supported baseline explicit in src/app/shell/support/baseline.ts and
feed it to build.target, a lint rule that rejects newer static built-ins in
browser-shipped sources, and the documented system requirements. Replace
Promise.withResolvers with a createDeferred() helper.
Turn src/main.ts into a small gate that checks sentinel features before
dynamically importing the app, so an old engine still evaluates enough code
to render platform-specific update guidance: macOS/Safari via Software
Update, WebKitGTK and WebView2 on Linux and Windows, and each browser's
own update path on the web, with a prefilled bug report link. Render-blocking
errors during the first route are captured through app.config.errorHandler
and shown the same way instead of leaving the window blank.
Desktop facts come from tauri-plugin-os and a webview_version command; the
bundle now declares macOS 13 as its minimum system version.
* build: enforce the browser baseline from compatibility data
Replace the hand-maintained list of built-ins newer than the baseline with
two data-driven checks. The app and browser-shipped packages pin their
TypeScript lib to ES2023, the last edition Chrome 111, Firefox 128 and
Safari 16.4 implement in full, so a newer built-in such as
Promise.withResolvers fails type-checking. Web APIs, which lib.dom does not
version, go through eslint-plugin-compat under oxlint with the same browsers
in settings.browsers, scoped to sources that ship to a browser.
A unit test keeps the oxlint browser list and the tsconfig libs derived from
src/app/shell/support/baseline.ts, so the three cannot drift apart.
* fix: recognise production error codes in the boot observer
Vue passes the error reference URL as the errorHandler info argument in
production builds instead of the development string, so the observer never
classified a setup or render failure as fatal in the shipped app and the
boot-failure notice only appeared on the dev server. Match Vue's exported
ErrorCodes in both forms, and cover the component-setup path in the E2E
spec; the scenario was also verified against a production build.
2026-09-22 10:40:59 +00:00
Requires macOS 13 or later with current Safari updates, Windows 10 or later, or Linux with WebKitGTK 2.40+; the web app needs Chrome 111, Edge 111, Firefox 128, or Safari 16.4 or later. See [system requirements ](https://openpencil.dev/getting-started#system-requirements ).
2026-03-08 07:46:38 +00:00
## What it does
2026-02-28 05:12:18 +00:00
2026-05-12 13:12:16 +00:00
- **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
2026-09-18 12:54:16 +00:00
- **AI builds designs** — describe what you want in chat, 100+ tools create and modify nodes. Connect OpenRouter, Anthropic, OpenAI, Google AI, DeepSeek, Z.ai, MiniMax, or compatible endpoints
2026-03-31 15:34:01 +00:00
- **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
2026-05-12 14:30:35 +00:00
- **Components and variants** — create reusable components, group variants into component sets, insert local assets as instances, and switch variants from the inspector
2026-07-27 13:22:05 +00:00
- **Image vectorization** — convert image layers into editable vector layers with Recraft or fal.ai
2026-03-31 15:34:01 +00:00
- **Design-to-code export** — export selections as JSX/Tailwind, generate token outputs, and map designs into component-oriented code workflows
2026-03-28 12:42:21 +00:00
- **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/ )
2026-03-08 07:46:38 +00:00
- **Real-time collaboration** — P2P via WebRTC, no server, no account. Cursors, presence, follow mode
2026-03-08 15:29:44 +00:00
- **Auto layout & CSS Grid** — flex and grid layout via Yoga WASM, with gap, padding, alignment, track sizing
2026-09-18 12:54:16 +00:00
- **~15 MB desktop app** — Tauri v2 for macOS, Windows, Linux. Also runs in the browser as a PWA
P2P collaboration: cursors, follow mode, cleanup
- Broadcast cursor position from canvas mouse move via awareness
- Broadcast selection changes via reactive watcher on selectedIds
- Follow mode: click peer avatar to track their viewport (pan + zoom)
- Zoom broadcast via watcher on store.state.zoom, not just mouse move
- Figma-style cursor arrows: colored fill, white border, name pill
- Stale cursor cleanup: removeAwarenessStates on peer leave
- MQTT signaling (replace Nostr), STUN + TURN ICE servers
- Collab constants extracted to src/constants.ts
- crypto.getRandomValues() replaces Math.random() everywhere
- Provide/inject for collab composable (COLLAB_KEY)
- Update README (collab section, tech stack), CHANGELOG, AGENTS.md
- AGENTS.md: release process, CI workflows, documentation guidelines
2026-03-01 15:11:07 +00:00
2026-02-28 22:28:24 +00:00
## CLI
2026-03-08 06:50:01 +00:00
```sh
2026-05-21 13:53:38 +00:00
npm install -g @open -pencil/cli
# or: bun add -g @open-pencil/cli
2026-03-08 06:50:01 +00:00
```
2026-03-28 12:42:21 +00:00
### Inspect design files
2026-03-08 06:50:01 +00:00
Browse node trees, search by name or type, dig into properties — all without opening the editor:
```sh
2026-05-29 12:56:52 +00:00
openpencil tree design.fig
openpencil find design.pen --type TEXT
openpencil node design.fig --id 1:23
openpencil info design.fig
2026-03-08 06:50:01 +00:00
```
```
[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)
```
XPath query for node selection (#82)
* Add XPath query for node selection
- packages/core/src/xpath.ts: XPath engine using fontoxpath with custom
DOM facade over SceneGraph nodes
- RPC command: 'query' with selector, page, limit params
- CLI command: 'open-pencil query <file> <xpath>' with --json, --page, --limit
- AI/MCP tool: 'query_nodes' with XPath examples in description
- Queryable attributes: name, width, height, x, y, visible, opacity,
cornerRadius, fontSize, fontFamily, fontWeight, layoutMode, itemSpacing,
padding*, strokeWeight, rotation, locked, blendMode, text, lineHeight,
letterSpacing
* Add tests and docs for XPath query
- 9 unit tests for queryByXPath/matchByXPath core functions
- 6 tool tests for query_nodes AI/MCP tool
- README: query examples in CLI section
- VitePress docs: patterns, queryable attributes, example output
- CHANGELOG: feature entry
* Lazy-load fontoxpath to avoid bundling in desktop app
- Dynamic import() instead of static import for fontoxpath
- queryByXPath/matchByXPath now async (they were sync before)
- RpcCommand.execute allows R | Promise<R> for async commands
- Fix 2 lint errors (unnecessary optional chain, always-truthy)
- Update all tests and CLI to await results
2026-03-09 12:32:27 +00:00
### Query with XPath
2026-10-04 16:38:28 +00:00
Find nodes by type, attributes, and structure:
XPath query for node selection (#82)
* Add XPath query for node selection
- packages/core/src/xpath.ts: XPath engine using fontoxpath with custom
DOM facade over SceneGraph nodes
- RPC command: 'query' with selector, page, limit params
- CLI command: 'open-pencil query <file> <xpath>' with --json, --page, --limit
- AI/MCP tool: 'query_nodes' with XPath examples in description
- Queryable attributes: name, width, height, x, y, visible, opacity,
cornerRadius, fontSize, fontFamily, fontWeight, layoutMode, itemSpacing,
padding*, strokeWeight, rotation, locked, blendMode, text, lineHeight,
letterSpacing
* Add tests and docs for XPath query
- 9 unit tests for queryByXPath/matchByXPath core functions
- 6 tool tests for query_nodes AI/MCP tool
- README: query examples in CLI section
- VitePress docs: patterns, queryable attributes, example output
- CHANGELOG: feature entry
* Lazy-load fontoxpath to avoid bundling in desktop app
- Dynamic import() instead of static import for fontoxpath
- queryByXPath/matchByXPath now async (they were sync before)
- RpcCommand.execute allows R | Promise<R> for async commands
- Fix 2 lint errors (unnecessary optional chain, always-truthy)
- Update all tests and CLI to await results
2026-03-09 12:32:27 +00:00
```sh
2026-10-04 16:38:28 +00:00
openpencil query design.fig "//FRAME[@width < 300 ] " # Frames under 300px
openpencil query design.fig "//SECTION//TEXT" # Text inside sections
XPath query for node selection (#82)
* Add XPath query for node selection
- packages/core/src/xpath.ts: XPath engine using fontoxpath with custom
DOM facade over SceneGraph nodes
- RPC command: 'query' with selector, page, limit params
- CLI command: 'open-pencil query <file> <xpath>' with --json, --page, --limit
- AI/MCP tool: 'query_nodes' with XPath examples in description
- Queryable attributes: name, width, height, x, y, visible, opacity,
cornerRadius, fontSize, fontFamily, fontWeight, layoutMode, itemSpacing,
padding*, strokeWeight, rotation, locked, blendMode, text, lineHeight,
letterSpacing
* Add tests and docs for XPath query
- 9 unit tests for queryByXPath/matchByXPath core functions
- 6 tool tests for query_nodes AI/MCP tool
- README: query examples in CLI section
- VitePress docs: patterns, queryable attributes, example output
- CHANGELOG: feature entry
* Lazy-load fontoxpath to avoid bundling in desktop app
- Dynamic import() instead of static import for fontoxpath
- queryByXPath/matchByXPath now async (they were sync before)
- RpcCommand.execute allows R | Promise<R> for async commands
- Fix 2 lint errors (unnecessary optional chain, always-truthy)
- Update all tests and CLI to await results
2026-03-09 12:32:27 +00:00
```
2026-10-04 16:38:28 +00:00
### Export, convert, and import
2026-03-08 06:50:01 +00:00
2026-10-04 16:38:28 +00:00
Render to PNG, JPG, WEBP, SVG, PDF, PPTX, HTML, JSX, Storybook stories, or `.fig` , convert between document formats, and turn HTML/CSS into editable layers:
2026-03-08 06:50:01 +00:00
```sh
2026-10-04 16:38:28 +00:00
openpencil export design.fig # PNG
openpencil export design.fig -f jpg -s 2 # JPG at 2x
openpencil export design.fig -f tailwind-jsx # Tailwind JSX
openpencil export design.fig -f storybook # Storybook stories per component
openpencil convert design.pen design.fig # Between document formats
openpencil import card.html --css card.css # HTML/CSS → editable .fig
2026-06-03 17:36:27 +00:00
```
2026-10-04 16:38:28 +00:00
### Lint and analyze
2026-06-03 17:36:27 +00:00
2026-10-04 16:38:28 +00:00
Catch naming, layout, and accessibility issues, and audit a design system's real palette, type scale, spacing, and repeated components:
2026-03-08 06:50:01 +00:00
```sh
2026-10-04 16:38:28 +00:00
openpencil lint design.fig --preset strict # Naming, layout, accessibility
openpencil analyze colors design.fig # Also typography, spacing, clusters
openpencil variables design.fig # Variables and collections
2026-03-08 06:50:01 +00:00
```
```
#1d1b20 ██████████████████████████████ 17155×
#49454f ██████████████████████████████ 9814×
#ffffff ██████████████████████████████ 8620×
#6750a4 ██████████████████████████████ 3967×
```
2026-10-04 16:38:28 +00:00
### Script with the Figma Plugin API
2026-03-08 06:50:01 +00:00
2026-10-04 16:38:28 +00:00
`eval` runs JavaScript against the document with Figma's Plugin API; `-w` writes the result back:
2026-03-08 06:50:01 +00:00
```sh
2026-05-29 12:56:52 +00:00
openpencil eval design.fig -c "figma.currentPage.selection.forEach(n => n.opacity = 0.5)" -w
2026-03-08 06:50:01 +00:00
```
### Control the running app
2026-10-04 16:38:28 +00:00
Omit the file argument and the CLI works on the document open in the editor:
2026-02-28 22:28:24 +00:00
```sh
2026-10-04 16:38:28 +00:00
openpencil tree # Inspect the live document
openpencil documents list # Also open, new, save, close, activate
openpencil tool call get_selection # Run any MCP tool
openpencil undo # Undo the newest automation change
openpencil settings set appearance.theme light # Change editor settings
2026-02-28 22:28:24 +00:00
```
2026-10-04 16:38:28 +00:00
Every command supports `--json` . See the [CLI reference ](https://openpencil.dev/reference/cli ) for all commands and options.
2026-02-28 22:28:24 +00:00
2026-03-08 07:46:38 +00:00
## AI & MCP
### Built-in chat
2026-09-18 12:54:16 +00:00
Press < kbd > ⌘< / kbd > < kbd > J< / kbd > (< kbd > Ctrl< / kbd > < kbd > J< / kbd > on Windows and Linux) 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, DeepSeek, Z.ai, MiniMax, or compatible endpoints. No backend, no account.
2026-03-02 10:57:03 +00:00
2026-08-05 13:23:23 +00:00
Not every provider works in the browser, and not every model streams tool calls correctly. See [BYOK provider & model compatibility ](packages/docs/programmable/byok-provider-compatibility.md ) for measured results — contributions welcome.
2026-07-31 03:19:51 +00:00
Harden ACP transport, MCP server, and add permission dialog
- Extract mapUpdate to testable module, dynamic import for @tauri-apps/plugin-shell
- Add warnings for unhandled ACP content types and empty tool titles
- MCP server: session limit (max 10), fix null WS comparison, guard JSX preprocessing
- MCP server: read version from package.json instead of hardcoded 0.0.0
- MCP tests: use port 0 (OS-assigned) to prevent collision
- Connection error handling with user-friendly messages, stale session recovery
- Agent crash detection via close handler, destroying flag, buildCrashChunks
- Port collision: detect EADDRINUSE in vite-plugin stderr and log clear error
- Production Tauri: spawn openpencil-mcp via shell plugin, orphan reuse via health check
- Permission confirmation dialog (reka-ui AlertDialog) with queue, 60s auto-reject timeout
- Health check in ProviderSelect hides ACP agents when MCP server unavailable
- Move DESIGN_CONTEXT to app constants, add ACP_PERMISSION_TIMEOUT_MS
- 36 tests across 3 files (acp-transport, acp-permission, mcp-server)
- Update CHANGELOG, README, CONTRIBUTING, AGENTS.md
2026-03-15 13:37:15 +00:00
### Coding agents (desktop)
2026-04-22 15:12:15 +00:00
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.
Harden ACP transport, MCP server, and add permission dialog
- Extract mapUpdate to testable module, dynamic import for @tauri-apps/plugin-shell
- Add warnings for unhandled ACP content types and empty tool titles
- MCP server: session limit (max 10), fix null WS comparison, guard JSX preprocessing
- MCP server: read version from package.json instead of hardcoded 0.0.0
- MCP tests: use port 0 (OS-assigned) to prevent collision
- Connection error handling with user-friendly messages, stale session recovery
- Agent crash detection via close handler, destroying flag, buildCrashChunks
- Port collision: detect EADDRINUSE in vite-plugin stderr and log clear error
- Production Tauri: spawn openpencil-mcp via shell plugin, orphan reuse via health check
- Permission confirmation dialog (reka-ui AlertDialog) with queue, 60s auto-reject timeout
- Health check in ProviderSelect hides ACP agents when MCP server unavailable
- Move DESIGN_CONTEXT to app constants, add ACP_PERMISSION_TIMEOUT_MS
- 36 tests across 3 files (acp-transport, acp-permission, mcp-server)
- Update CHANGELOG, README, CONTRIBUTING, AGENTS.md
2026-03-15 13:37:15 +00:00
2026-10-04 16:38:28 +00:00
Pi works too: install `@open-pencil/harness` globally, then add a **Pi** model profile in **Settings → AI & agents** .
2026-08-19 17:04:35 +00:00
2026-03-15 15:13:29 +00:00
**Setup (Claude Code):**
2026-05-19 14:58:08 +00:00
1. Install the ACP adapter: `npm install -g @agentclientprotocol/claude-agent-acp`
2026-03-15 15:13:29 +00:00
2. Add MCP permission to `~/.claude/settings.json` :
```json
{
"permissions": {
2026-05-19 14:58:08 +00:00
"allow": ["mcp__open-pencil__*"]
2026-03-15 15:13:29 +00:00
}
}
```
2026-09-18 12:54:16 +00:00
3. Open the desktop app → < kbd > ⌘</ kbd >< kbd > J</ kbd > → select **Claude Code** from the provider dropdown
2026-03-15 15:13:29 +00:00
2026-03-08 07:46:38 +00:00
### MCP server
2026-03-02 10:57:03 +00:00
2026-09-18 12:54:16 +00:00
Connect Claude Code, Cursor, Windsurf, or any MCP client to inspect, modify, and export design documents headlessly. 100+ tools. [Full docs → ](https://openpencil.dev/programmable/mcp-server )
2026-03-08 07:46:38 +00:00
**Stdio** (Claude Code, Cursor, Windsurf):
2026-03-02 10:57:03 +00:00
2026-03-02 11:28:56 +00:00
```sh
2026-05-19 14:58:08 +00:00
npm install -g @open -pencil/mcp
claude mcp add --scope user open-pencil -- openpencil-mcp
2026-03-02 11:28:56 +00:00
```
2026-05-19 14:58:08 +00:00
For other MCP clients:
2026-03-02 10:57:03 +00:00
```json
{
"mcpServers": {
"open-pencil": {
2026-03-02 11:28:56 +00:00
"command": "openpencil-mcp"
2026-03-02 10:57:03 +00:00
}
}
}
```
2026-03-08 07:46:38 +00:00
**HTTP** (scripts, CI):
2026-03-02 10:57:03 +00:00
```sh
2026-07-25 18:29:03 +00:00
openpencil-mcp-http # Unix socket on macOS/Linux + http://127.0.0.1:7600/mcp
2026-03-02 10:57:03 +00:00
```
2026-10-04 16:38:28 +00:00
Set `OPENPENCIL_MCP_ROOT` to limit file access to one directory; it defaults to the current working directory.
2026-04-22 15:12:15 +00:00
2026-09-13 16:08:27 +00:00
### [AI agent skill](skills/open-pencil/SKILL.md)
Add AI agent skill to README and docs
- README: new 'AI Agent Skill' section with install command
- MCP tools reference: skill section, fix tool count 78→90,
add 10 missing tools (export_image, export_svg, flatten_nodes,
list_fonts, page_bounds, set_layout_child, set_text_properties,
viewport_get, viewport_set, viewport_zoom_to_fit)
- Features page: mention skill with install command
- All 6 locales updated
2026-03-07 22:08:28 +00:00
Teach your AI coding agent to use OpenPencil — inspect designs, export assets, analyze tokens, modify .fig files:
```sh
2026-09-13 14:29:33 +00:00
npx skills add open-pencil/open-pencil
Add AI agent skill to README and docs
- README: new 'AI Agent Skill' section with install command
- MCP tools reference: skill section, fix tool count 78→90,
add 10 missing tools (export_image, export_svg, flatten_nodes,
list_fonts, page_bounds, set_layout_child, set_text_properties,
viewport_get, viewport_set, viewport_zoom_to_fit)
- Features page: mention skill with install command
- All 6 locales updated
2026-03-07 22:08:28 +00:00
```
Works with Claude Code, Cursor, Windsurf, Codex, and any agent that supports [skills ](https://skills.sh ).
2026-05-22 12:00:44 +00:00
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.
2026-03-08 07:46:38 +00:00
## Collaboration
2026-02-28 05:12:18 +00:00
2026-03-08 07:46:38 +00:00
Share a link to co-edit in real time. No server, no account — peers connect directly via WebRTC.
2026-02-28 05:14:28 +00:00
2026-03-08 07:46:38 +00:00
1. Click the share button in the top-right panel
2. Share the generated link (`app.openpencil.dev/share/< room-id > `)
3. Collaborators see your cursor, selection, and edits in real time
4. Click a peer's avatar to follow their viewport
2026-02-28 05:14:28 +00:00
2026-03-08 07:46:38 +00:00
## Why
2026-02-28 05:14:28 +00:00
2026-03-08 07:46:38 +00:00
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.
2026-02-28 05:12:18 +00:00
2026-03-08 07:46:38 +00:00
OpenPencil is the alternative: open source (MIT), reads .fig files natively, every operation is scriptable, and your data never leaves your machine.
2026-02-28 05:14:28 +00:00
2026-05-22 17:02:05 +00:00
See the [roadmap ](https://openpencil.dev/development/roadmap ) for product direction and current Figma compatibility gaps.
2026-09-18 12:54:27 +00:00
## Community
- **[Discord](https://discord.gg/4wXc9fuZfm)** — chat, quick questions, and showing a problem live
- **[GitHub Discussions](https://github.com/open-pencil/open-pencil/discussions)** — [Q&A ](https://github.com/open-pencil/open-pencil/discussions/categories/q-a ) for help, [Ideas ](https://github.com/open-pencil/open-pencil/discussions/categories/ideas ) for feature proposals, [Show and tell ](https://github.com/open-pencil/open-pencil/discussions/categories/show-and-tell ) for what you built; maintainers post [Announcements ](https://github.com/open-pencil/open-pencil/discussions/categories/announcements ) there
- **[Issues](https://github.com/open-pencil/open-pencil/issues)** — reproducible bugs; report security problems through a [private advisory ](https://github.com/open-pencil/open-pencil/security/advisories/new )
2026-03-08 07:46:38 +00:00
## Contributing
2026-02-28 08:38:27 +00:00
```sh
2026-03-08 07:46:38 +00:00
bun install
2026-08-20 05:15:54 +00:00
bun run dev:portless # Web editor at https://open-pencil.localhost
bun run tauri dev # Desktop app (requires Rust)
2026-02-28 08:38:27 +00:00
```
2026-09-28 21:02:06 +00:00
[CONTRIBUTING.md ](CONTRIBUTING.md ) covers setup, quality gates, pull requests, and commits. [AGENTS.md ](AGENTS.md ) maps the repository and links the guide inside each package. Desktop builds need [Rust ](https://rustup.rs/ ) and the [Tauri v2 prerequisites ](https://v2.tauri.app/start/prerequisites/ ); run `bun run tauri build` .
2026-03-08 07:46:38 +00:00
### Tech stack
2026-07-31 03:19:51 +00:00
| 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 |
2026-09-18 12:54:16 +00:00
| AI/MCP | Vercel AI SDK (multi-provider BYOK), MCP SDK, Hono |
2026-03-08 07:46:38 +00:00
2026-03-02 09:27:05 +00:00
## Acknowledgments
Thanks to [@sld0Ant ](https://github.com/sld0Ant ) (Anton Soldatov) for creating and maintaining the [documentation site ](https://openpencil.dev ).
2026-02-28 05:12:18 +00:00
## License
2026-08-31 06:11:10 +00:00
OpenPencil is licensed under the [MIT License ](./LICENSE ).
Copyright (c) 2026 Danila Poyarkov and OpenPencil contributors.