Find a file
2026-03-01 10:19:38 +03:00
.github/workflows Add GitHub Actions workflow for Windows + macOS builds 2026-02-28 20:55:26 +03:00
.vscode Initial commit: Tauri + CanvasKit + React editor scaffold 2026-02-27 15:48:29 +03:00
desktop Preload system fonts on app startup 2026-03-01 02:57:58 +03:00
packages CLI: add analyze, node, pages, and variables commands 2026-03-01 10:19:38 +03:00
public Fix .fig import/export round-trip 2026-02-28 15:12:24 +03:00
src Rich text style runs with per-selection bold/italic/underline 2026-03-01 09:03:38 +03:00
tests Add .fig test fixtures (LFS) and fix O(n²) import bottleneck 2026-03-01 09:55:07 +03:00
.gitattributes Add .fig test fixtures (LFS) and fix O(n²) import bottleneck 2026-03-01 09:55:07 +03:00
.gitignore Remove .env from tracking, add to .gitignore 2026-03-01 10:14:48 +03:00
.oxfmtrc.json Add oxlint, oxfmt, typescript-go 2026-02-27 15:52:55 +03:00
AGENTS.md Reference plan.md from AGENTS.md 2026-03-01 10:19:38 +03:00
bun.lock Use TanStack Table for variables dialog with resizable columns 2026-03-01 02:12:19 +03:00
COMPARISON.md Fix text disappearing on window resize 2026-02-28 19:08:16 +03:00
components.d.ts Rich text style runs with per-selection bold/italic/underline 2026-03-01 09:03:38 +03:00
index.html Add minimalist splash loader during WASM initialization 2026-03-01 01:30:01 +03:00
oxlint.json Fix all lint, typecheck, and formatting issues 2026-02-28 22:57:33 +03:00
package.json Add test:coverage script 2026-03-01 10:19:38 +03:00
PLAN.md Move AI chat design into plan.md Phase 5 2026-03-01 10:14:40 +03:00
playwright.config.ts Skip stability check: toMatchSnapshot, 2.1s → 1.3s 2026-02-28 07:44:20 +03:00
README.md Update README and AGENTS.md for monorepo structure and CLI 2026-03-01 01:28:24 +03:00
screenshot.png Add screenshot to README 2026-02-28 23:36:55 +03:00
tsconfig.json Replace relative imports with @/ alias 2026-02-28 23:08:45 +03:00
tsconfig.node.json Initial commit: Tauri + CanvasKit + React editor scaffold 2026-02-27 15:48:29 +03:00
vite.config.ts Replace relative imports with @/ alias 2026-02-28 23:08:45 +03:00

OpenPencil

Open-source, AI-native design editor. Figma alternative built from scratch with full .fig file compatibility.

Status: Active development. Not ready for production use.

OpenPencil

Features

  • Figma .fig file import — open native Figma files directly
  • Figma clipboard — copy/paste between OpenPencil and Figma
  • Vector networks — complex boolean shapes and open paths, like Figma
  • Auto-layout — constraint-based layout matching Figma behavior
  • Components & instances — with live sync, overrides, component sets
  • Pen tool — bezier curves with tangent handles
  • Inline text editing — multi-line text with system fonts
  • Image export — PNG, JPG, WEBP at any scale
  • Headless CLI — inspect, search, and render .fig files without a GUI
  • Undo/redo — all operations are undoable
  • Snap guides — edge and center snapping
  • Color picker — HSV, hue/alpha sliders, hex input, gradients
  • ~5 MB install, works fully offline — no account, no server, no internet required

Tech Stack

Layer Tech
UI Vue 3, VueUse, Reka UI
Styling Tailwind CSS 4
Rendering Skia (CanvasKit WASM)
Layout Yoga WASM
File format Kiwi binary (vendored) + Zstd + ZIP
Color culori
Desktop Tauri v2
CLI citty, agentfmt
Testing Playwright (visual regression), bun:test (unit)
Tooling Vite 7, oxlint, oxfmt, typescript-go

Getting Started

bun install
bun run dev

CLI

Headless .fig file operations — no GUI needed:

bun open-pencil info design.fig         # Document stats, node types, fonts
bun open-pencil tree design.fig         # Visual node tree
bun open-pencil find design.fig --type TEXT  # Search by name or type
bun open-pencil export design.fig       # Render to PNG
bun open-pencil export design.fig -f jpg -s 2 -q 90  # JPG at 2x

All commands support --json for machine-readable output.

Scripts

Command Description
bun run dev Dev server at http://localhost:1420
bun run build Production build
bun run check Lint + typecheck
bun run test E2E visual regression
bun run test:update Regenerate screenshot baselines
bun run test:unit Unit tests
bun run tauri dev Desktop app (requires Rust)

Desktop App

Requires Rust, the Tauri CLI, and platform-specific prerequisites (Tauri v2 guide).

cargo install tauri-cli --version "^2"
bun run tauri dev                      # Dev mode with hot reload
bun run tauri build                    # Production build
bun run tauri build --target universal-apple-darwin  # macOS universal

Cross-compilation to other platforms requires their respective toolchains or CI (e.g. GitHub Actions).

Project Structure

packages/
  core/           @open-pencil/core — engine (scene graph, renderer, layout, codec)
  cli/            @open-pencil/cli — headless CLI (info, tree, find, export)
src/
  components/     Vue SFCs (canvas, panels, toolbar, color picker)
  composables/    Canvas input, keyboard shortcuts, rendering
  stores/         Editor state (Vue reactivity)
  engine/         Re-export shims from @open-pencil/core
  kiwi/           Re-export shims from @open-pencil/core
  types.ts        Shared types
  constants.ts    App-specific constants + re-exports from core
desktop/          Tauri v2 (Rust + config)
tests/
  e2e/            Playwright visual regression
  engine/         Unit tests

License

MIT