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 ebe1346d24
V0.4.1 (#45)
* feat(canvas): enhance font handling and text measurement

- Introduced a new `cssFontFamily` utility to ensure proper quoting of font family names in canvas text rendering.
- Updated text measurement functions to utilize `cssFontFamily`, improving compatibility with various font formats.
- Added a `systemFontFamilies` set in `SkiaFontManager` to manage system fonts that cannot be loaded into CanvasKit, ensuring fallback to bitmap rendering.
- Implemented a hook to enumerate system fonts, enhancing the font selection experience in the UI.
- Added a new `FontPicker` component for improved font selection, integrating bundled and system fonts with search functionality.
- Updated translations for new font-related UI elements across multiple languages.

This update significantly improves text rendering accuracy and user experience when selecting fonts.

* feat(figma): enhance clipboard data processing and font handling

- Introduced a new mechanism to identify and handle known non-Google fonts, preventing unnecessary requests to the Google Fonts CDN for system and proprietary fonts.
- Improved the Figma clipboard data extraction process by simplifying error handling and removing excessive debug logs, enhancing performance and readability.
- Added functionality to convert unresolved image references in Figma clipboard data into placeholder rectangles, ensuring better visual fidelity when images are missing.
- Enhanced instance conversion logic to merge symbol properties into instances, ensuring that clipboard data retains necessary layout and visual properties.

This update significantly improves the handling of Figma clipboard data and font management, leading to a more robust user experience.

* refactor(figma): enhance clipboard data processing and style resolution

- Improved the Figma clipboard data extraction by adding optional HTML parsing to enrich nodes with style hints, ensuring better fidelity in text rendering.
- Updated the `figmaClipboardToNodes` function to log conversion results and handle unresolved image references more effectively.
- Refactored style resolution logic to ensure inline properties are correctly applied from style references, enhancing the overall rendering accuracy of Figma imports.

This update significantly enhances the handling of Figma clipboard data and style management, leading to a more robust user experience.

* feat(canvas): add image fill support and enhancements to fill section

- Introduced support for image fills in the SkiaRenderer, allowing for dynamic image rendering with various fit modes and adjustments.
- Added a new ImageFillPopover component for managing image fill properties, including exposure, contrast, and saturation adjustments.
- Updated the FillSection component to include an option for image fills, enhancing the user interface for fill selection.
- Improved localization for new image-related features across multiple languages.

This update significantly enhances the capabilities of the canvas rendering system, providing users with more options for fill types and customization.

* feat(canvas): enhance text shadow rendering and fill section UI

- Implemented a new method for drawing text shadows as blurred copies of glyphs, aligning with Figma's drop-shadow behavior.
- Updated the `drawText` method to incorporate shadow effects for text nodes, improving visual fidelity.
- Adjusted the FillSection component to use a fixed width for better layout consistency.

This update significantly enhances text rendering capabilities and improves the user interface for fill options.

* refactor(figma): simplify arc ellipse conversion logic

- Removed unnecessary position adjustments for flipped nodes, as the extractPosition function already computes the correct visual top-left.
- Cleaned up comments to clarify the handling of arc properties without rotation adjustments, streamlining the conversion process for arc ellipses.

This update enhances the clarity and efficiency of the arc ellipse conversion logic in the Figma node converters.

* fix(canvas): use drawImageRect for image fill modes instead of broken shader scaling

CanvasKit's Image.makeShaderOptions() fails to render when the localMatrix
contains scaling factors with Clamp/Decal tile modes. Only Repeat mode
works reliably with shader scaling.

- Tile mode: keep shader + TileMode.Repeat (works correctly)
- Fill/Fit/Crop/Stretch: use drawImageRect with canvas clipping
- Add drawImageFillRect() for non-tile image fill rendering
- makeFillPaint() returns optional imageFillDraw info for drawRect

* fix(panels): fix image adjustment reset button not working

The reset button called onAdjustmentChange in a loop, but each call
spread from the same stale fill reference, so only the last adjustment
was actually reset. Added onResetAdjustments callback that resets all
adjustment values in a single atomic update.

---------

Co-authored-by: Fini <fini.yang@gmail.com>
2026-03-16 09:33:57 +08:00
.github V0.3.3 (#33) 2026-03-11 21:18:49 +08:00
.vscode V0.2.1 (#23) 2026-03-06 21:00:42 +08:00
build V0.0.3 (#11) 2026-02-26 21:33:48 +08:00
electron V0.3.3 (#33) 2026-03-11 21:18:49 +08:00
public V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
screenshot V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
scripts V0.3.3 (#33) 2026-03-11 21:18:49 +08:00
server V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
src V0.4.1 (#45) 2026-03-16 09:33:57 +08:00
.cta.json Initialize OpenPencil project with essential files and configurations 2026-02-17 21:14:16 +08:00
.gitignore V0.1.0 (#13) 2026-03-01 09:33:52 +08:00
bun.lock V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
CLAUDE.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
components.json feat(editor): scaffold core canvas engine and editor layout 2026-02-18 21:49:16 +08:00
electron-builder.yml build: Remove publisher name from Windows build config 2026-03-11 21:41:40 +08:00
LICENSE chore: update documentation and add MIT License 2026-02-18 22:35:17 +08:00
package.json V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.de.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.es.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.fr.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.hi.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.id.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.ja.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.ko.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.pt.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.ru.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.th.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.tr.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.vi.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.zh-TW.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
README.zh.md V0.4.0 (#44) 2026-03-15 10:01:35 +08:00
tsconfig.json Initialize OpenPencil project with essential files and configurations 2026-02-17 21:14:16 +08:00
vite.config.ts V0.4.0 (#44) 2026-03-15 10:01:35 +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.

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

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+,)

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

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
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

src/
  canvas/          CanvasKit/Skia 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 Multi-platform code generators (React, HTML, Vue, Svelte, Flutter, SwiftUI, Compose, React Native)
  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, Copilot 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
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 electron:dev       # Electron dev
bun run electron:build     # Electron package

Contributing

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

  1. Fork and clone
  2. Create a branch: git checkout -b feat/my-feature
  3. Run checks: npx tsc --noEmit && bun --bun run test
  4. Commit with Conventional Commits: feat(canvas): add rotation snapping
  5. 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
  • 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