* docs: add image search & generation design spec and implementation plan - Spec: dual-source image search (Openverse + Wikimedia), multi-provider image generation - Plan: 16 tasks covering types, server endpoints, settings UI, property panel, auto-search pipeline, MCP integration * feat(types): add image service types and imagePrompt to ImageNode * feat(server): add image service API key validation endpoint Adds POST /api/ai/image-service-test that validates credentials for openverse (client_credentials), openai/custom (Bearer + /v1/models), gemini (API key + v1beta/models), and replicate (Bearer + /v1/models). * feat(server): add multi-provider image generation endpoint * feat(server): add dual-source image search endpoint (Openverse + Wikimedia) POST /api/ai/image-search searches freely-licensed images via Openverse with automatic fallback to Wikimedia Commons on 429 rate-limit responses. Supports optional OAuth credentials for authenticated Openverse requests. * feat(store): add imageSearchStatuses to canvas store for runtime status tracking * feat(store): add image generation config and Openverse OAuth to agent settings * feat(editor): add Images tab to agent settings dialog Adds Popover primitive, ImagesPage component with Image Search (Openverse OAuth, test) and Image Generation (provider select, API key, model, base URL) sections, and wires them into the settings dialog sidebar. * feat(panels): add image search popover with Openverse/Wikimedia results grid * feat(panels): add image generate popover with multi-provider support * feat(panels): add Search and Generate buttons to image property section * feat(ai): update prompts to use imagePrompt instead of src for image nodes * feat(ai): add auto-search pipeline with Openverse/Wikimedia fallback * feat(ai): trigger auto image search after design generation completes * feat(mcp): implement G() operation for image search in batch design DSL Adds the G(parent, mode, prompt) operation to batch_design DSL that creates an image node and optionally fetches a real image URL via the image-search API when mode is "search". Converts executeLine to async to support the network call. * feat(mcp): auto-fill images after design refinement in layered pipeline * feat(ai): split imageSearchQuery and imagePrompt for search vs generation - ImageNode now has both imageSearchQuery (short keywords for search) and imagePrompt (long description for AI image generation) - AI prompts instruct LLM to generate both fields - Search pipeline and popovers use imageSearchQuery - Generate popover uses imagePrompt - Server-side simplifySearchQuery kept as fallback for manual input * fix(ai): hook auto image search into orchestrator completion path The primary generation path uses executeOrchestration -> insertStreamingNode, not applyNodesToCanvas/animateNodesToCanvas. Added scanAndFillImages call to orchestrator.ts after all sub-agents complete. Added debug logging. Removed plan/spec docs from git. * style(editor): remove provider names from image search ready status * fix(panels): clean up image gen error display and settings UI - Parse API error response to show concise message instead of raw JSON - Limit error text to 2 lines with line-clamp - Fix image gen test button sending wrong service name - Inline Image Search ready indicator with section header - Remove debug logging from image search pipeline * style(panels): allow up to 4 lines for image gen error message * fix: avoid 1-frame delay when resizing canvas (#60) rAF callbacks run before ResizeObserver in the same frame. Scheduling render in ResizeObserver via rAF defers it to the next frame. Invoke render() synchronously to leverage ResizeObserver's pre-paint timing and ensure immediate visual update. * feat(electron): implement desktop application structure and auto-updater - Introduced a new Electron desktop application with a structured directory for apps and packages. - Added auto-updater functionality to manage application updates seamlessly. - Created a comprehensive menu system for the desktop app. - Implemented logging capabilities for better debugging and error tracking. - Configured build settings for various platforms (macOS, Windows, Linux) using electron-builder. - Established TypeScript configurations for both the desktop and web applications. - Integrated Vite for the web application with support for React and Tailwind CSS. - Added icons and assets for the desktop application. * chore: update package versions to 0.5.0 across all package.json files and add pre-commit hook for version synchronization - Bumped version to 0.5.0 in package.json files for the main project, desktop app, web app, and all packages. - Introduced a pre-commit hook to automatically sync version numbers from branch names to all package.json files. * chore: update package versions to 0.5.0 and refactor Skia components - Bumped version to 0.5.0 in bun.lock and all relevant package.json files. - Refactored Skia components to utilize shared functionality from @zseven-w/pen-renderer, including image loading, hit testing, and path utilities. - Removed redundant code and improved modularity by re-exporting necessary functions and classes from the renderer package. * fix(panels): handle string fill values in icon nodes (#61) AI-generated icon/path nodes may have fill stored as a raw string instead of a PenFill[] array, causing "Cannot use 'in' operator" crash when selecting the node in the property panel. * chore: update documentation and project structure for monorepo organization - Added a new version bump command to synchronize all package.json files. - Updated the project structure to reflect a monorepo setup with organized workspaces for apps and packages. - Enhanced README files in multiple languages to include the new structure and commands. - Adjusted image paths in documentation to point to the correct locations for the desktop application. * feat(ai): incremental image search and improved image generation prompts - Refactor image search from batch post-generation to incremental queue: enqueueImageForSearch() triggers as each image node is inserted during streaming, so images appear progressively instead of all at once after generation completes. scanAndFillImages() remains as a final sweep. - Update imagePrompt guidance to avoid "transparent background" and similar phrases that many models cannot reliably produce. - Pass node width/height from image panel to generation endpoint for aspect-ratio-aware output (Gemini aspect ratio mapping, OpenAI size selection, Replicate dimensions). * feat(ai): multi-profile image generation config and cleaner error messages - Support multiple image generation profiles with active selection; first configured profile becomes default. Old single-config migrated automatically on hydrate. - Fix Gemini aspect ratio: move to generationConfig.imageConfig per API spec. - Extract clean error messages from provider JSON responses (Gemini error.message, OpenAI error.message, Replicate detail) instead of returning raw JSON text. - Remove destructive client-side regex that mangled error display. * feat(design-md): integrate design system panel and functionality - Added a new DesignMdPanel component for managing design system specifications. - Implemented functionality to toggle the design system panel in the editor layout and toolbar. - Introduced new commands for importing, exporting, and auto-generating design.md content. - Updated AI chat handlers to utilize design.md data for enhanced design generation. - Enhanced localization support for design system features across multiple languages. * perf(canvas): skip draw calls for nodes outside the viewport (#64) Add viewport culling in render() to avoid issuing CanvasKit draw calls for off-screen nodes. A 64px screen-space buffer is kept around the viewport edges so nearby nodes are pre-rendered, preventing pop-in during fast panning. * feat(utils): enhance Windows process spawning for CLI scripts - Updated the buildSpawnClaudeCodeProcess function to handle .cmd and .ps1 scripts appropriately. - Implemented PowerShell invocation for .ps1 files and ensured safe defaults for .cmd and .exe files. - Improved handling of command execution to avoid limitations of cmd.exe. * feat(ai): add support for Gemini CLI integration - Extended the AI provider options to include 'gemini' across various components and APIs. - Implemented functions for generating, validating, and connecting to the Gemini CLI. - Added Gemini-specific error handling and model fetching logic. - Updated UI components to display Gemini as a selectable provider with appropriate icons and labels. - Enhanced localization support for Gemini-related features in multiple languages. * feat(editor): warn before closing with unsaved changes Intercept window/tab close when isDirty is true: - Electron: native dialog with Save / Don't Save / Cancel - Web: beforeunload handler + confirm on New/Open actions - i18n: close-confirm strings for all 15 locales * feat(ipc): extract IPC handlers to a dedicated module - Moved IPC dialog handling and updater functions from main.ts to ipc-handlers.ts for better organization and maintainability. - Implemented file open/save dialogs, theme setting, and preferences management through IPC. - Enhanced updater functionality with state management and auto-update settings. - Improved code structure by separating concerns, making it easier to manage IPC-related logic. * feat(docs): update CLAUDE documentation and add new files for desktop and web apps - Enhanced CLAUDE.md with detailed module documentation references for `packages/` and `apps/`. - Updated `pen-core` description to include clone utilities in `pen-core`. - Added new documentation files for the desktop and web applications, outlining their structure, components, and functionalities. - Included IPC handler details in the desktop app documentation for better clarity on file dialogs and theme synchronization. * feat(docker): add Gemini CLI support and update documentation - Introduced a new Docker build stage for the Gemini CLI, allowing users to install and run it. - Updated the Dockerfile to include the installation of the Gemini CLI alongside existing CLI tools. - Enhanced README files in multiple languages to document the new `openpencil-gemini` image variant. - Added Gemini CLI connection instructions to the main README for better user guidance. * feat(docs): add Gemini CLI connection instructions to multiple language READMEs - Updated README files in German, Spanish, French, Hindi, Indonesian, Japanese, Korean, Portuguese, Russian, Thai, Turkish, Vietnamese, and both Traditional and Simplified Chinese to include connection instructions for the Gemini CLI. - Enhanced documentation to improve user guidance for connecting the Gemini CLI in agent settings. * perf(renderer): replace count-based text cache limits with memory-based eviction (#66) previous limits (PARA_CACHE_MAX=200, TEXT_CACHE_MAX=300) were too small for scenes with many nodes, causing constant cache churn and paragraph rebuilds every frame, which dropped FPS significantly during canvas pan. - switch to byte-budget limits (64 MB paragraphs, 256 MB bitmaps) - bitmap size measured exactly as cw*ch*4; paragraph WASM heap estimated as content.length*64+4096 - eviction uses Map insertion order (FIFO) instead of a separate string[] array, replacing O(n) array.shift() with O(1) Map.entries().next() - evict before insert so the budget check includes the incoming entry --------- Co-authored-by: Fini <fini.yang@gmail.com> Co-authored-by: leinaldo <60176594+leinaldo@users.noreply.github.com>
15 KiB
OpenPencil
Công cụ thiết kế vector mã nguồn mở thuần AI đầu tiên trên thế giới.
Đội Tác nhân Đồng thời • Design-as-Code • Máy chủ MCP Tích hợp • Trí tuệ Đa mô hình
English · 简体中文 · 繁體中文 · 日本語 · 한국어 · Français · Español · Deutsch · Português · Русский · हिन्दी · Türkçe · ไทย · Tiếng Việt · Bahasa Indonesia
Nhấp vào hình ảnh để xem video demo
Tại sao chọn OpenPencil
🎨 Prompt → CanvasMô tả bất kỳ giao diện nào bằng ngôn ngữ tự nhiên. Xem nó xuất hiện trên canvas vô hạn theo thời gian thực với hiệu ứng streaming. Chỉnh sửa thiết kế hiện có bằng cách chọn các phần tử và trò chuyện. |
🤖 Đội Tác nhân Đồng thờiBộ điều phối phân rã các trang phức tạp thành các tác vụ con theo không gian. Nhiều tác nhân AI làm việc trên các phần khác nhau đồng thời — hero, features, footer — tất cả streaming song song. |
🧠 Trí tuệ Đa mô hìnhTự động thích ứng với khả năng của từng mô hình. Claude nhận prompt đầy đủ với thinking; GPT-4o/Gemini tắt thinking; các mô hình nhỏ hơn (MiniMax, Qwen, Llama) nhận prompt đơn giản hóa cho đầu ra đáng tin cậy. |
🔌 Máy chủ MCPCài đặt một cú nhấp vào Claude Code, Codex, Gemini, OpenCode, Kiro hoặc Copilot CLI. Thiết kế từ terminal — đọc, tạo và chỉnh sửa tệp |
📦 Design-as-CodeTệp |
🖥️ Chạy Mọi nơiỨng dụng web + desktop gốc trên macOS, Windows và Linux qua Electron. Tự động cập nhật từ GitHub Releases. Liên kết tệp |
Bắt đầu nhanh
# Cài đặt các phụ thuộc
bun install
# Khởi động máy chủ phát triển tại http://localhost:3000
bun --bun run dev
Hoặc chạy dưới dạng ứng dụng desktop:
bun run electron:dev
Docker
Có nhiều biến thể image khác nhau — chọn loại phù hợp với nhu cầu của bạn:
| Image | Kích thước | Bao gồm |
|---|---|---|
openpencil:latest |
~226 MB | Chỉ ứng dụng web |
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 | Tất cả công cụ CLI |
Chạy (chỉ web):
docker run -d -p 3000:3000 ghcr.io/zseven-w/openpencil:latest
Chạy với AI CLI (ví dụ Claude Code):
Chat AI dựa vào đăng nhập OAuth của Claude CLI. Sử dụng Docker volume để lưu phiên đăng nhập:
# Bước 1 — Đăng nhập (một lần)
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
# Bước 2 — Khởi động
docker run -d -p 3000:3000 \
-v openpencil-claude-auth:/root/.claude \
ghcr.io/zseven-w/openpencil-claude:latest
Build cục bộ:
# Cơ bản (chỉ web)
docker build --target base -t openpencil .
# Với một CLI cụ thể
docker build --target with-claude -t openpencil-claude .
# Đầy đủ (tất cả CLI)
docker build --target full -t openpencil-full .
Thiết kế thuần AI
Từ Prompt đến Giao diện
- Văn bản thành thiết kế — mô tả một trang, nhận kết quả được tạo ra trên canvas theo thời gian thực với hiệu ứng streaming
- Orchestrator — phân rã các trang phức tạp thành các tác vụ con không gian để tạo song song
- Chỉnh sửa thiết kế — chọn các phần tử, sau đó mô tả thay đổi bằng ngôn ngữ tự nhiên
- Đầu vào hình ảnh — đính kèm ảnh chụp màn hình hoặc bản phác thảo để thiết kế dựa trên tham chiếu
Hỗ trợ Đa tác nhân
| Tác nhân | Cài đặt |
|---|---|
| Claude Code | Không cần cấu hình — sử dụng Claude Agent SDK với OAuth cục bộ |
| Codex CLI | Kết nối trong Cài đặt tác nhân (Cmd+,) |
| OpenCode | Kết nối trong Cài đặt tác nhân (Cmd+,) |
| GitHub Copilot | copilot login rồi kết nối trong Cài đặt tác nhân (Cmd+,) |
| Gemini CLI | Kết nối trong Cài đặt tác nhân (Cmd+,) |
Hồ sơ Năng lực Mô hình — tự động thích ứng prompt, chế độ thinking và thời gian chờ theo từng cấp mô hình. Mô hình cấp đầy đủ (Claude) nhận prompt hoàn chỉnh; cấp tiêu chuẩn (GPT-4o, Gemini, DeepSeek) tắt thinking; cấp cơ bản (MiniMax, Qwen, Llama, Mistral) nhận prompt JSON lồng nhau đơn giản hóa để đảm bảo độ tin cậy tối đa.
Máy chủ MCP
- Máy chủ MCP tích hợp sẵn — cài đặt một cú nhấp vào Claude Code / Codex / Gemini / OpenCode / Kiro / Copilot CLI
- Tự động phát hiện Node.js — nếu chưa cài đặt, tự động chuyển sang HTTP transport và khởi động MCP HTTP server
- Tự động hóa thiết kế từ terminal: đọc, tạo và chỉnh sửa các tệp
.opqua bất kỳ tác nhân tương thích MCP nào - Quy trình thiết kế phân lớp —
design_skeleton→design_content→design_refinecho thiết kế đa phần có độ trung thực cao hơn - Truy xuất prompt phân đoạn — chỉ tải kiến thức thiết kế cần thiết (schema, layout, roles, icons, planning, v.v.)
- Hỗ trợ nhiều trang — tạo, đổi tên, sắp xếp lại và nhân bản trang qua các công cụ MCP
Tạo mã nguồn
- React + Tailwind CSS, HTML + CSS, CSS Variables
- Vue, Svelte, Flutter, SwiftUI, Jetpack Compose, React Native
Tính năng
Canvas và Vẽ
- Canvas vô hạn với pan, zoom, hướng dẫn căn chỉnh thông minh và snapping
- Hình chữ nhật, Hình ellipse, Đường thẳng, Đa giác, Bút (Bezier), Frame, Văn bản
- Phép toán Boolean — hợp nhất, trừ, giao nhau với thanh công cụ ngữ cảnh
- Trình chọn icon (Iconify) và nhập hình ảnh (PNG/JPEG/SVG/WebP/GIF)
- Auto-layout — dọc/ngang với gap, padding, justify, align
- Tài liệu nhiều trang với điều hướng bằng tab
Hệ thống Thiết kế
- Biến thiết kế — token màu sắc, số, chuỗi với tham chiếu
$variable - Hỗ trợ đa chủ đề — nhiều trục, mỗi trục có các biến thể (Sáng/Tối, Thu gọn/Thoải mái)
- Hệ thống component — các component có thể tái sử dụng với instances và overrides
- Đồng bộ CSS — thuộc tính tùy chỉnh tự động tạo,
var(--name)trong đầu ra mã
Nhập từ Figma
- Nhập tệp
.figvới layout, fills, strokes, effects, văn bản, hình ảnh và vector được bảo toàn
Ứng dụng Desktop
- macOS, Windows và Linux gốc qua Electron
- Liên kết tệp
.op— nhấp đúp để mở, khóa phiên bản đơn - Tự động cập nhật từ GitHub Releases
- Menu ứng dụng gốc và hộp thoại tệp
Công nghệ
| Frontend | React 19 · TanStack Start · Tailwind CSS v4 · shadcn/ui |
| Canvas | CanvasKit/Skia (WASM, tăng tốc GPU) |
| Trạng thái | Zustand v5 |
| Máy chủ | Nitro |
| Desktop | Electron 35 |
| AI | Anthropic SDK · Claude Agent SDK · OpenCode SDK · Copilot SDK |
| Runtime | Bun · Vite 7 |
| Định dạng tệp | .op — dựa trên JSON, dễ đọc, thân thiện với Git |
Cấu trúc dự án
openpencil/
├── apps/
│ ├── web/ Ứng dụng web TanStack Start
│ │ ├── src/
│ │ │ ├── canvas/ Engine CanvasKit/Skia — vẽ, đồng bộ, layout
│ │ │ ├── components/ React UI — editor, panels, hộp thoại dùng chung, icons
│ │ │ ├── services/ai/ AI chat, orchestrator, tạo thiết kế, streaming
│ │ │ ├── stores/ Zustand — canvas, document, pages, history, AI
│ │ │ ├── mcp/ Công cụ máy chủ MCP để tích hợp CLI bên ngoài
│ │ │ ├── hooks/ Phím tắt, kéo thả tệp, dán từ Figma
│ │ │ └── uikit/ Hệ thống kit component có thể tái sử dụng
│ │ └── server/
│ │ ├── api/ai/ Nitro API — streaming chat, generation, validation
│ │ └── utils/ Claude CLI, OpenCode, Codex, Copilot wrappers
│ └── desktop/ Ứng dụng desktop Electron
│ ├── main.ts Cửa sổ, Nitro fork, menu gốc, auto-updater
│ ├── ipc-handlers.ts Hộp thoại file gốc, đồng bộ theme, tùy chọn IPC
│ └── preload.ts IPC bridge
├── packages/
│ ├── pen-types/ Định nghĩa kiểu cho mô hình PenDocument
│ ├── pen-core/ Thao tác cây tài liệu, layout engine, biến
│ ├── pen-codegen/ Bộ tạo mã (React, HTML, Vue, Flutter, ...)
│ ├── pen-figma/ Trình phân tích và chuyển đổi tệp Figma .fig
│ ├── pen-renderer/ Bộ dựng hình CanvasKit/Skia độc lập
│ └── pen-sdk/ SDK tổng hợp (tái xuất tất cả các gói)
└── .githooks/ Pre-commit đồng bộ phiên bản từ tên nhánh
Phím tắt
| Phím | Hành động | Phím | Hành động | |
|---|---|---|---|---|
V |
Chọn | Cmd+S |
Lưu | |
R |
Hình chữ nhật | Cmd+Z |
Hoàn tác | |
O |
Hình ellipse | Cmd+Shift+Z |
Làm lại | |
L |
Đường thẳng | Cmd+C/X/V/D |
Sao chép/Cắt/Dán/Nhân bản | |
T |
Văn bản | Cmd+G |
Nhóm | |
F |
Frame | Cmd+Shift+G |
Bỏ nhóm | |
P |
Công cụ bút | Cmd+Shift+E |
Xuất | |
H |
Tay (pan) | Cmd+Shift+C |
Bảng mã | |
Del |
Xóa | Cmd+Shift+V |
Bảng biến | |
[ / ] |
Sắp xếp lại | Cmd+J |
AI chat | |
| Mũi tên | Dịch chuyển 1px | Cmd+, |
Cài đặt tác nhân | |
Cmd+Alt+U |
Hợp nhất Boolean | Cmd+Alt+S |
Trừ Boolean | |
Cmd+Alt+I |
Giao nhau Boolean |
Scripts
bun --bun run dev # Máy chủ phát triển (cổng 3000)
bun --bun run build # Build production
bun --bun run test # Chạy kiểm thử (Vitest)
npx tsc --noEmit # Kiểm tra kiểu
bun run bump <version> # Đồng bộ phiên bản trên tất cả package.json
bun run electron:dev # Electron dev
bun run electron:build # Đóng gói Electron
Đóng góp
Chào mừng đóng góp! Xem CLAUDE.md để biết chi tiết về kiến trúc và phong cách mã.
- Fork và clone
- Thiết lập đồng bộ phiên bản:
git config core.hooksPath .githooks - Tạo branch:
git checkout -b feat/my-feature - Chạy kiểm tra:
npx tsc --noEmit && bun --bun run test - Commit theo Conventional Commits:
feat(canvas): add rotation snapping - Mở PR vào nhánh
main
Lộ trình
- Biến thiết kế & token với đồng bộ CSS
- Hệ thống component (instances & overrides)
- Tạo thiết kế AI với orchestrator
- Tích hợp máy chủ MCP với quy trình thiết kế phân lớp
- Hỗ trợ nhiều trang
- Nhập Figma
.fig - Phép toán Boolean (hợp nhất, trừ, giao)
- Hồ sơ năng lực đa mô hình
- Tái cấu trúc monorepo với các gói tái sử dụng
- Chỉnh sửa cộng tác
- Hệ thống plugin
Người đóng góp
Cộng đồng
Star History
Giấy phép
MIT — Copyright (c) 2026 ZSeven-W