Find a file
Danila Poyarkov 326f5d194d Preload system fonts on app startup
Cache font list in Rust via OnceLock, fire preload request from
main.ts so the font list is ready before user opens the picker.
2026-03-01 02:57:58 +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 Add system font enumeration via font-kit 2026-03-01 02:56:12 +03:00
public Fix .fig import/export round-trip 2026-02-28 15:12:24 +03:00
src Preload system fonts on app startup 2026-03-01 02:57:58 +03:00
tests Add variables support: collections, modes, bindings, UI panel 2026-03-01 01:47:52 +03:00
.gitignore Pages support: multi-page documents like Figma 2026-02-28 13:12:27 +03:00
.oxfmtrc.json Add oxlint, oxfmt, typescript-go 2026-02-27 15:52:55 +03:00
AGENTS.md Update README and AGENTS.md for monorepo structure and CLI 2026-03-01 01:28:24 +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 Extract ColorInput component, fix alpha slider checkerboard 2026-03-01 02:18:23 +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 Use TanStack Table for variables dialog with resizable columns 2026-03-01 02:12:19 +03:00
PLAN.md Add types/shared code and test strategy to CLI plan 2026-03-01 00:03:26 +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