Find a file
Kayshen Xu 3e6d8bc672 V0.3.1 (#27)
* feat(mcp): enhance document management and design tools

- Updated `openDocument` to always re-fetch the live canvas, ensuring user edits are captured.
- Introduced new tools: `get_design_prompt` for retrieving design guidelines and `batch_design` for executing multiple design operations using a DSL.
- Improved `handleInsertNode` and `handleUpdateNode` to include validation for node data and return the final node state after operations.
- Enhanced design prompt with detailed PenNode schema and layout rules for better AI-generated designs.
- Added validation functions to ensure node data integrity during CRUD operations.
- Updated `handleOpenDocument` to provide context-aware design prompts based on document content.

* feat(electron): enhance build configuration and auto-update functionality

- Updated `electron-builder.yml` to include artifact naming conventions for Windows and Linux builds.
- Enhanced NSIS installer settings to create desktop and start menu shortcuts.
- Improved path handling for GUI applications on Windows to ensure proper environment variable inheritance.
- Refactored auto-update logic in `main.ts` to streamline update checks and improve error handling.
- Added new IPC handlers for managing pending file paths and improved file handling during application startup.
- Updated `use-electron-menu` hook to handle additional menu structures and improve document loading logic.

* chore: bump version to 0.3.1 and update project description

- Updated version in package.json to 0.3.1.
- Enhanced project description to highlight OpenPencil as the world's first open-source AI-native vector design tool featuring concurrent Agent Teams and Design-as-Code capabilities.
- Refactored auto-updater to utilize constants for GitHub repository details, improving maintainability.
- Introduced a new constants file to centralize shared values for the Electron application, enhancing code clarity and reducing duplication.
- Updated various components to use new constants for port file handling and window dimensions, ensuring consistency across the application.

* feat(ai): clarify mobile design guidelines and mockup usage

- Updated design guidelines to emphasize that "mobile" requests should generate actual mobile-sized screens (375x812) instead of desktop mockups.
- Added critical notes regarding the use of phone mockups, specifying they should only be used for marketing showcases and not for functional mobile screens.
- Enhanced clarity on sizing and layout rules for mobile and web designs to ensure consistent application of design principles.

* fix(canvas): improve text centering, layout inference, and Pencil format rendering

- Resolve fit-content parent dimensions in computeLayoutPositions instead of
  using 0 (which caused negative available space and broken child positioning)
- Reduce text width estimation minimum from 20px to 1px to fix centering of
  narrow single-character text in fixed-size centered frames
- Add inferLayout() to detect padding-only frames as layout containers, so
  padding offsets are applied to children (fixes badge text ignoring padding)
- Use Fabric's fontSize * 1.13 for single-line text height in centering
  calculations instead of fontSize * lineHeight
- Add fontWeight propagation to text width/height estimation functions
- Refine defaultLineHeight() tiers for better Pencil format compatibility
- Support Pencil's singular `effect` property alongside `effects` array
- Handle plain color strings in fill/stroke resolution for Pencil format
- Add directional stroke rendering as synthetic border rectangles
- Add icon_font node type rendering via lookupIconByName
- Fix z-order reconciliation to use fresh canvas object map after text recreation
- Fix canvas initialization race: defer reference tracking until canvas is ready
- Resolve $variable references with circular reference guards

* feat(types): add icon_font node type with panel and store support

- Add IconFontNode type to pen.ts for icon_font nodes storing iconFontName
- Extend property panel and icon section to recognize icon_font nodes
- Add icon_font type icon in layer panel
- Support icon_font in document tree utilities

* feat(ai): improve design generation accuracy and validation

- Add pre-validation pass to fix text with explicit pixel height to fit_content
- Enhance validation tree dump with textGrowth and lineHeight fields
- Update orchestrator prompts with structural patterns from Pencil analysis
- Simplify role-resolver defaults to match Pencil conventions
- Only force textGrowth=fixed-width on text >15 chars in streaming insertion

* feat(ai): optimize generation pipeline and fix streaming layout

- Disable LLM validation layer (pre-validation heuristics still run)
- Remove visual-ref pipeline (3 fewer LLM calls per generation)
- Compress sub-agent prompt and design principles (~70% smaller)
- Remove width>480 guards so mobile gets root frame height expansion
- Add gap field to orchestrator rootFrame format and guidance
- Default icon_font nodes to lucide family in generation heuristics

* feat(ai): load full Lucide icon set and default icon_font to lucide

- Load all 1,729 Lucide icons as primary set (replaces 286 hand-picked)
- Keep Feather as fallback for unmatched names
- Default iconFontFamily to 'lucide' during .pen file normalization

* feat(codegen): add icon_font support to all 8 code generators

Output Lucide icon references instead of 'Unknown node' comments.
React/RN use component syntax, HTML/Vue/Svelte use data-lucide,
Flutter/SwiftUI/Compose use framework-native icon APIs.

* feat(panels): replace product card quick action with food app homepage

* feat(electron): implement preferences management and app storage abstraction

- Introduced a new preferences management system in Electron, replacing localStorage with a JSON-based preferences file.
- Added IPC handlers for getting, setting, and removing preferences, ensuring data persistence across sessions.
- Created an app storage utility to provide a consistent API for accessing preferences in both Electron and web environments.
- Updated various components and stores to utilize the new app storage system for improved data handling and synchronization.
- Enhanced the initialization process to load preferences at startup, ensuring a seamless user experience.

* fix(electron): update desktop entry configuration for OpenPencil

- Enhanced the desktop entry in electron-builder.yml to include detailed application metadata.
- Added fields for Name, Exec, Terminal, Type, Icon, Categories, and MimeType to improve application integration on Linux systems.

* fix(electron): prevent automatic publishing during build

- Updated the Electron app build command to include the `--publish never` flag, ensuring that builds do not automatically publish to the repository.

* refactor(electron): remove GitHub publish configuration from electron-builder.yml

- Deleted the publish section to prevent automatic publishing during builds, aligning with recent changes to the build process.

---------

Co-authored-by: Fini <fini.yang@gmail.com>
2026-03-09 22:40:15 +08:00
.github/workflows V0.3.1 (#27) 2026-03-09 22:40:15 +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.1 (#25) 2026-03-09 22:02:43 +08:00
public V0.0.3 (#11) 2026-02-26 21:33:48 +08:00
screenshot V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
scripts V0.3.1 (#25) 2026-03-09 22:02:43 +08:00
server V0.3.1 (#25) 2026-03-09 22:02:43 +08:00
src V0.3.1 (#25) 2026-03-09 22:02:43 +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.3.0 (#24) 2026-03-08 11:55:35 +08:00
CLAUDE.md V0.3.0 (#24) 2026-03-08 11:55: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 V0.3.1 (#27) 2026-03-09 22:40:15 +08:00
LICENSE chore: update documentation and add MIT License 2026-02-18 22:35:15 +08:00
package.json V0.3.1 (#25) 2026-03-09 22:02:43 +08:00
README.de.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.es.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.fr.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.hi.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.id.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.ja.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.ko.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.pt.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.ru.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.th.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.tr.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.vi.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.zh-TW.md V0.3.0 (#24) 2026-03-08 11:55:35 +08:00
README.zh.md V0.3.0 (#24) 2026-03-08 11:55: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.3.0 (#24) 2026-03-08 11:55:35 +08:00

OpenPencil

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

Stars License CI Discord

Quick Start · AI · Features · Discord · Contributing


OpenPencil — click to watch demo

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

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

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

MCP Server

  • Built-in MCP server — one-click install into Claude Code / Codex / Gemini / OpenCode / Kiro / Copilot CLIs
  • Design automation from terminal: read, create, and modify .op files via any MCP-compatible agent
  • Multi-page support — create, rename, reorder, and duplicate pages via MCP tools

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
  • 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 Fabric.js v7
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/          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, 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
  • Multi-page support
  • Figma .fig import
  • Boolean operations (union, subtract, intersect)
  • Collaborative editing
  • Plugin system

Contributors

Contributors

Community

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

License

MIT — Copyright (c) 2026 ZSeven-W