Features
- XPath query command —
open-pencil query design.fig "//FRAME[@width < 300]"to find nodes by type, attributes, and tree structure using XPath selectors - CSS Grid layout mode — select a frame, click the grid icon in the auto layout toolbar to switch from flex to grid. Configure column/row tracks (fr, fixed px, auto), column and row gaps, and per-side padding. Powered by a Yoga fork with cherry-picked CSS Grid PRs from upstream
- JSX and Tailwind CSS export for grid layouts —
grid grid-cols-N,gap-x-*/gap-y-*, childcol-start-*/row-start-*/col-span-*/row-span-* - Multi-provider AI support — connect to Anthropic, OpenAI, Google AI, or any OpenAI-compatible endpoint directly, in addition to OpenRouter. Per-provider API key storage, provider settings popover, automatic migration from single OpenRouter key
- Anthropic-compatible provider for custom API endpoints
- New AI tools:
get_jsx(JSX roundtrip view),diff_jsx(structural diff),describe(semantic role, visual style, layout, design issues) - AI visual verification —
export_imagereturns image content to the model for vision-based review - API type toggle (Completions/Responses) for OpenAI-compatible providers
- Figma zoom shortcuts — ⌘0 (100%), ⌘1 (zoom to fit), ⌘2 (zoom to selection), ⇧1/⇧2 alternatives
- XPath query tool —
query_nodesfor AI/MCP with attribute selectors, tree traversal, and type filtering
Fixes
- Serialize variables, collections, and bindings to
.figfiles — previously lost on save (#65) - Text nodes created via MCP now render in Figma — emit
derivedTextDatawith font metadata and layout size (#64) - Double-click on layer tree no longer toggles expand/collapse — use the chevron instead
- Page rename input matches layer rename styling
- Fix
w="fill"/h="fill"in JSX renderer — now direction-aware based on parent flex axis - Fix text auto-resize defaulting to fixed 100×100 — text without explicit width uses
WIDTH_AND_HEIGHT - Fix
clipsContentnot propagated to Yoga — frames with clip enabled now setOverflow.Hidden - Fix
COUNTER_ALIGN_MAPmapping stretch toMINinstead ofSTRETCH - Fix JSX export omitting x/y for absolute-positioned children
- Fix JSX export ignoring
textAutoResizefor text sizing - Fix drag terminating on mouseleave — drags now continue outside the canvas
- Fix
export_imagestack overflow on large nodes — chunked base64 encoding - Undo support for auto-layout reorder, layer tree reorder, and drag reparent
- Page snapshot undo for AI tool mutations
- Fix collab sync for same-parent reorder —
node:reorderedevents now propagated to Yjs peers - Fix orphaned instances on clipboard paste — detach to FRAME when component is missing
- Fix text typography lost on Figma clipboard import — preserve fontFamily, fontWeight, fontSize, lineHeight
- Fix
copyFillmissinggradientTransformandimageTransform— gradient fills now round-trip correctly
Performance
- Event-driven rendering and component sync —
SceneGraphemits typed events on mutations;requestRender()calls reduced from 94 to 22, component instance sync uses microtask batching with deduplication - Replace
structuredClonewith typed copy helpers for fills, strokes, effects, and style runs (~24× faster in hot paths) - Filter .fig unzip to only decompress canvas and image entries, skipping metadata cruft
- Instance population uses a work queue instead of repeated full graph scans
Improvements
- Padding on a frame auto-enables vertical auto-layout
- AI tools run
computeAllLayoutsafter execution — layout updates immediately - Enhanced AI system prompt with full JSX prop reference and verification workflow
- Chat panel preserves messages when toggling UI visibility
- SceneGraph event bus (nanoevents) —
node:created,node:updated,node:deleted,node:reparented,node:reorderedevents replace monkey-patching in collab sync and manual render invalidation - Replace esbuild-wasm (14 MB) with sucrase (201 KB) for JSX transform —
buildComponent()andrenderJSX()now synchronous and browser-compatible useMagicKeyskeyboard shortcut system — replaces tinykeys with VueUse built-in, cross-platform Meta/Control handling, modifier exclusion for combo conflicts- Dev-only debug toolbar for copying chat logs
- Auto-layout icons in layer tree — vertical (rows), horizontal (columns), and grid icons for auto-layout frames; components keep their purple diamond
- Frame titles on canvas are now draggable — clicking a selected top-level frame's name label starts a drag
- Compact layout controls — icon-based gap (↔/↕) and padding (T/R/B/L) inputs instead of text labels
- Auto-detect horizontal vs vertical direction when wrapping in auto layout (Shift+A)
- Fix alignment grid for vertical layouts — visual positions now match spatial axes
- Fix grid switch from HUG-sized frames — frame expands to fit children
- Remove unwanted white fill when wrapping in auto layout