figcraft/docs/gaps.md

22 KiB
Raw Blame History

Where FigCraft falls short of Figma

Last reviewed: 2026-10-10 · Last updated: 2026-10-11 · Change: minor (branches: create, update from main, review and merge; animated GIF fills and TIFF images; Open recent, outlines for the selection and mask outlines: menu breadth 100%; extended collections, variables import/export, gradient stop and variant bindings: gap 14 down to its tail) · Target: Figma Design (desktop app 126.10.7)

Every known shortfall against Figma, one entry each, ranked by how much it stops a Figma user from doing real work in FigCraft. Agents: pick work from the top unless the owner says otherwise. The numbers behind the ranking are in target-app-parity.md. Hours are one Opus 5.5 agent working sequentially, tests included, calibrated as described there. "Estimated" everywhere unless marked measured.

Ranked

No alpha blockers: the alpha gate in roadmap.md passes. Beta blockers are marked.

# Gap Kind Hours Doc
1 .fig files can't be opened (beta blocker) File format 30–60 file-format-parity
2 Multiplayer and sharing are a preview, without accounts (beta blocker) Feature 45–90 collaboration-parity
3 Nothing checked against real Figma files Fidelity 15–30 target-app-parity
4 Interaction fidelity not compared tool by tool UI/UX 40–60 ui-parity
5 No localization layer; English only Localization 60–100 localization-parity
6 Plugins: no run-time UI, distribution or widgets; Figma's plugins don't run Ecosystem 25–55 target-app-parity
7 CPU canvas where Figma uses the GPU Hardware/performance 30–60 hardware-parity
8 Platform QA is mostly macOS Stability/platforms 10–20 hardware-parity
9 Figma Draw: brushes, pressure, text on a path, pattern fills Feature 10–18 target-app-parity
10 Shared (team) libraries Feature 10–20 components-parity
11 Spell check Feature 4–8 target-app-parity
12 Video fills; HEIC images File format 5–10 file-format-parity
13 Boolean groups hit-tested by their operands (the rest of the vector tail landed) Feature 1–3 target-app-parity
14 Variables: extended collections' tail Feature 1–2 components-parity
15 Prototyping: media triggers and actions, gamepad Feature 3–6 prototyping-parity
16 Dev Mode: Code Connect, editor integrations Feature 4–8 dev-mode-parity
17 Branching: per-branch version history, finer merges of list properties (branches landed 2026-10-11) Feature 1–3 collaboration-parity
18 Display P3 on screen; one window only Hardware 6–12 hardware-parity
19 AI features AI 30–60 target-app-parity
20 Mobile apps (view, mirror, comment) Platforms 20–40 hardware-parity
21 Menu items without a command: none left (landed 2026-10-11) Feature — parity-checklist
22 Screen readers never run; browser has no accessibility tree UI/UX 4–8 ui-parity
23 CMYK output intent for print PDFs File format 2–4 file-format-parity

Entries

1. .fig files can't be opened

  • Missing: a reader for Figma's native document (com.figma.document, extensions fig, jam, deck in the installed app's Info.plist). Figma's files live in the cloud; "Save local copy" writes a .fig. Today the only way in is the REST API file JSON (file.open / file.import), which needs an access token and a separate download of images and variables.
  • Evidence: no .fig code anywhere in crates/format (searched 2026-10-10); ROADMAP listed ".fig import (best effort)" as left.
  • Impact: blocks beta by definition: a designer can't bring existing work across. The single biggest gap.
  • Estimate: 30–60 h for a best-effort reader written from public format knowledge (a compressed binary schema plus a message per node; mapping onto the existing REST importer's model), with a corpus of synthetic .fig files saved from the installed Figma. Export to .fig is a further 15–30 h and lower priority.

2. Multiplayer and sharing are a preview, without accounts

  • Missing: accounts, teams and projects, per-person permissions, spotlight, cursor chat, audio, shared comments and version history, TLS in the desktop app. Comments and versions are local to the file.
  • Evidence: the core landed in #103 (crates/collab: client-scoped ids, change sets, server ordering and validation, client reconciliation, binary messages, randomized convergence tests over real commands), and live sessions run over the network (crates/collab-net: hosting from the app, invite links that open the app, document sync between apps, live cursors, selections, text carets, avatars and follow, and the browser build joins) with per-person undo, refused edits rolled back with a reason, reconnects that resume and send what was made offline, and styles, variables and comments that several people create at once all kept; a standalone figcraft-server keeps many files (snapshot plus log, compacted; restarts lose nothing confirmed), takes files published from the app and hands out share links that let people edit or only view (docs/server.md). But there are no accounts (a link is the access), and the desktop app speaks only plain ws:// (TLS comes from a reverse proxy, which only the browser can use so far) (docs/collab-protocol.md).
  • Impact: Figma's defining feature; most teams use it every day. Solo designers can work without it.
  • Estimate: 45–90 h: accounts, teams and per-person permissions, TLS in the desktop app, shared comments and versions (numbers from before the server landed; re-measured next).

3. Nothing checked against real Figma files

  • Missing: a corpus of real documents (design systems, app screens, prototypes) imported and compared with Figma's own PNG/SVG/PDF exports.
  • Evidence: every corpus in the repo is synthetic (crates/svg/tests/corpus, the synthetic design system in crates/engine/src/synthetic_ds.rs). Scores were self-graded by the agents that built the features.
  • Impact: unknown fidelity in auto layout sizing, text metrics, effects and component resolution on real files; the numbers in this repo can't be trusted beyond "estimated" until it exists.
  • Estimate: 15–30 h once .fig or REST import of real files is available; needs files whose licence allows use (owner to supply or approve; never committed if not redistributable, see craftrules standards/test-corpora.md).

4. Interaction fidelity not compared tool by tool

  • Missing: a side-by-side pass of every tool and panel: cursors, modifier keys while dragging (e.g. Ctrl to ignore snapping on macOS), hover states, popovers, menus, snapping thresholds.
  • Evidence: ROADMAP item 7 ("Left: tool by tool, panel by panel against the incumbent").
  • Impact: Figma users notice the feel within minutes; it decides whether they stay.
  • Estimate: 40–60 h. Detail in ui-parity.md.

5. No localization layer; English only

  • Missing: externalized strings and catalogs. Figma ships English, Japanese, Korean, French, German, Spanish (Spain and Latin America) and Portuguese (Brazil).
  • Evidence (measured from source): ~800 distinct capitalised UI string literals in crates/ui-egui/src and 435 command labels, all inline; no catalog files.
  • Impact: keeps out non-English designers, including Figma's large Japanese and Korean user bases.
  • Estimate: 15–25 h for the layer and string extraction, then 3–5 h per language plus native review; 60–100 h for the 11 key languages. Detail in localization-parity.md.

6. Plugins: no run-time UI, distribution or widgets; Figma's plugins don't run

  • Landed (#101): sandboxed WebAssembly plugins (wasmi, metered, memory cap, no WASI, also in the browser) acting through the command registry, one undo step per run, manifest permissions, Plugins menu, Run last plugin, Manage plugins, plugin.* commands, a Rust SDK and two examples (plugins.md).
  • Missing: plugin-defined UI at run time (forms or panels a plugin returns), settings storage, distribution (a plugin directory), widgets, Community files. Figma's own plugins are JavaScript against Figma's plugin API and don't run.
  • Impact: teams that depend on specific Figma plugins (icons, content, accessibility checks) can't bring them. FigCraft's CLI, control channel and MCP server cover agent automation better than Figma does.
  • Estimate: 25–55 h for the missing pieces of FigCraft's own API. Running Figma's plugins needs a JS engine and an API shim: owner decision needed.

7. CPU canvas where Figma uses the GPU

  • Missing: GPU rendering of the canvas. FigCraft renders with tiny-skia on the CPU (banded, parallel, retained) and shows the image through wgpu.
  • Evidence (measured, cargo xtask bench): a 50k-layer page ~8 ms zoomed out with levels of detail, single-layer edits at 10k layers ~0.2 ms; full 1440×900 renders 7–15 ms at 10k layers. Heavy effects (glass, background blur, noise) and 4K/5K canvases at 2x are where CPU time grows.
  • Impact: large files and effect-heavy designs; battery on laptops.
  • Estimate: 30–60 h for a GPU path (vello or wgpu shaders) held to the CPU renderer as the oracle.

8. Platform QA is mostly macOS

  • Missing: regular runs on Windows, Linux and the browser; real screen readers.
  • Evidence: CI tests on Linux only (.github/workflows/ci.yml); release builds exist for every platform (v0.2.0) but no issue has been filed yet and the builders checked on macOS.
  • Impact: unknown bugs on the platforms where FigCraft is most attractive (Linux has no Figma desktop app).
  • Estimate: 10–20 h, partly human (hardware).

9. Figma Draw: brushes, pressure, text on a path, pattern fills

  • Missing: stretch and scatter brushes, pen pressure for the pencil and brushes, text on a path, pattern fills, multi-edit.
  • Evidence: PaintKind has solid, gradient and image only (crates/color/src/lib.rs); no pressure input anywhere; SVG text on a path imports as outlines.
  • Impact: illustration-flavoured work moved into Figma Draw in 2025.
  • Estimate: 10–18 h.

10. Shared (team) libraries

  • Missing: libraries shared across people and files without copying them around; library analytics; swapping a whole library.
  • Evidence: local library files work (publish, enable, updates with overrides kept), see components-parity.md.
  • Impact: design-system teams. Builds on multiplayer's server.
  • Estimate: 10–20 h after gap 2.

11. Spell check

  • Missing: spelling underline and suggestions while editing text.
  • Evidence: no spell-check code in the repo.
  • Estimate: 4–8 h with a permissively licensed dictionary and checker (provenance per ATTRIBUTION.md).

12. Video fills; HEIC images

  • Landed (2026-10-11): animated GIF fills (the file kept as is, the first frame on the canvas and in exports, played in the presenter and the preview) and TIFF images.
  • Missing: Figma takes JPG, PNG, HEIC, WebP, GIF and TIFF images and MP4, MOV and WebM video (help center, checked 2026-10-10). FigCraft decodes PNG, JPEG, WebP, GIF, TIFF and BMP; HEIC and video need decoders that are C libraries (libheif, FFmpeg) or each platform's media framework.
  • Estimate: 5–10 h (video playback in the presenter is most of it; it can reuse the GIF clock).

13. Boolean groups hit-tested by their operands

  • Landed (2026-10-11): live boolean editing (operands selected by double-click or Cmd/Ctrl-click; moving, resizing or editing an operand's points redraws the result during the drag, with every operand outlined; per-operand operations from the boolean controls and node.set; a drag frame recombines only the operands from the edited one up), Design panel Arc fields (Start, Sweep, Ratio; Mixed across ellipses; bindable), the shape builder on strokes and open paths (strokes take part as their outlined areas), one-sided variable widths (Alt-drag a width handle; canvas, PNG, SVG, PDF and outline stroke).
  • Missing: a click is tested against a boolean group's operands, not its result, so a click in a subtracted hole still picks the group.
  • Estimate: 1–3 h.

14. Variables: extended collections' tail

  • Landed: extended collections (library.extendCollection: a library collection's modes and variables in a collection of this file, values overridden per mode with reset, following library updates, variables of its own), variables import/export (variable.export / variable.import: the REST local variables JSON, merged by name; CSS custom properties), gradient stops and variant properties bound to variables.
  • Missing: variables a library adds to an extended collection arrive only with the library's next other update (they don't count as an update of their own); an extended collection can't be extended again; checked with synthetic files only.
  • Estimate: 1–2 h.

15. Prototyping: media triggers and actions, gamepad

  • Missing: video triggers (on media hit/end) and play/pause/mute/seek actions; gamepad input. The REST importer warns and skips them (crates/format/src/rest/proto.rs).
  • Estimate: 3–6 h after video fills (gap 12).

16. Dev Mode: Code Connect, editor integrations

  • Missing: mapping components to real code (Code Connect), plugins in Dev Mode, VS Code extension. FigCraft's MCP server already serves design data to agents.
  • Estimate: 4–8 h.

17. Branching and merging

  • Landed (2026-10-11): branches of a file (branch.*): File ▸ Create branch… (or the Branches list in version history) copies the file into a branch tab that remembers the file as it was (its base) and makes its ids in its own id space; edits on the branch are saved with the main file. Review and merge (the banner on a branch tab) shows the main file and the branch side by side or as an overlay, what changed on each side since the base (layers with their property changes as Inspect shows them; styles, variables, comments) and the conflicts: the same property changed on both sides, or a layer deleted on one side while the other edited it or what's inside it. Each conflict is resolved for the branch or main; nothing conflicting merges until it is. Merging is one undo step on the main file and archives the branch; Update from main brings main's changes into the branch the same way; branches can be archived without merging. Three-way merge over the collaboration change sets (figcraft_collab::merge), fuzz-tested with random real commands.
  • Missing: a branch's own version history; a list property (fills, text runs…) changed on both sides conflicts as a whole; branches of a file in a live session are refused.
  • Estimate: 1–3 h.

18. Display P3 on screen; one window only

  • Missing: wide-gamut colour on the canvas (egui draws sRGB, so P3 colours outside sRGB clip on screen; exports keep them); several windows (Figma's desktop app opens files in separate windows).
  • Estimate: 6–12 h.

19. AI features

  • Missing: Figma AI (first draft, rename layers, remove background, image generation and editing, visual search, Make).
  • Estimate: 30–60 h with openly licensed local models. Owner decision needed.

20. Mobile apps

  • Missing: Figma's iOS and Android apps view and comment on files and mirror prototypes. FigCraft's web build runs in mobile browsers but is not designed for touch.
  • Estimate: 20–40 h for a touch-first viewer and mirror.

21. Menu items without a command (measured): none left

  • Landed (2026-10-11): file.openRecent (File ▸ Open recent: recent files kept in the preferences, at most 20, greyed when the file is gone and dropped when picked, Clear recent), view.outlinesSelection (outline mode for the selected layers only) and view.maskOutlines; the plugin pair landed in #101. Every item in the menu catalog has a command (parity-checklist.md).
  • Estimate: none left.

22. Screen readers never run; browser has no accessibility tree

  • Evidence: AccessKit names and keyboard navigation landed (#96), checked by tests only; eframe's web backend doesn't send the tree yet.
  • Estimate: 4–8 h plus human QA with VoiceOver, NVDA, Narrator and Orca.

23. CMYK output intent for print PDFs

  • Evidence: CMYK conversion is a documented naive formula; no CMYK ICC profile can ship in the repository (licensing).
  • Estimate: 2–4 h once an openly licensed profile is found.

Revision history

Date Change Summary
2026-10-11 minor Branches landed (gap 17): File ▸ Create branch… copies the file into a branch tab that remembers its base; Review and merge shows both sides' changes (layers with Inspect-style property changes, styles, variables, comments) and the conflicts (the same property changed on both sides, or a layer deleted on one side and edited on the other), each resolved for the branch or main; merging is one undo step and archives the branch; Update from main; branches are saved in the .figcraft file. Comments, versions, find, misc breadth 80% → 85%, ready 58% → 60%, 4–8 h → 2–5 h; collaboration 12% → 13%; menu breadth 204/204 (the catalog gained File ▸ Create branch…); feature breadth (~79%) and ready for real work (~47%) unchanged at this rounding; full parity ~380–725 h → ~378–722 h
2026-10-11 minor Animated GIF fills and TIFF images (gap 12, without video and HEIC): GIF fills keep the original file, show the first frame on the canvas and in exports and play in the presenter and the preview (frames decoded on first play, at most 500 frames and 128 MB; always looping; the window wakes only for a GIF's next frame); TIFF images open, import, place and paste. Paint breadth 85% → 87%, 5–9 h → 4–7 h; gap 12 6–12 h → 5–10 h (video playback and HEIC left, both needing non-Rust decoders); feature breadth (~79%), ready for real work (~47%) and full parity hours unchanged at this rounding
2026-10-11 minor The last three catalogued menu items got commands (gap 21): File ▸ Open recent (recent files kept in the preferences, at most 20, a file that's gone greyed in the menu and dropped when picked, Clear recent), View ▸ Outlines ▸ Show outlines for selection and View ▸ Mask outlines: menu breadth 98.5% → 100% (203/203); Canvas & navigation breadth 95% → 97%, 3–6 h → 2–5 h; feature breadth (~79%), ready for real work (~47%) and full parity hours unchanged at this rounding
2026-10-11 minor Extended collections, variables import/export and gradient stop and variant property bindings landed (gap 14): Styles & variables breadth 85% → 92%, ready 70% → 72%, 4–8 h → 1–2 h; feature breadth unchanged (~79%); ready for real work unchanged (~47%); full parity ~385–730 h → ~380–725 h
2026-10-11 minor Collaboration wording after the standalone server: figcraft-server keeps many files, persisted as a snapshot plus a log of what changed (compacted, checksummed, damaged files skipped and reported), restarts lose nothing confirmed and apps resume where they were; the app publishes its file to it; share links per file let people edit or only view (the server refuses a viewer's edits), are revocable and stored as hashes; TLS comes from a reverse proxy (the desktop app has none of its own yet); percentages and hours unchanged until the next re-measure
2026-10-11 minor Live boolean editing, Design panel arc fields, the shape builder on strokes and open paths and one-sided variable widths landed (gap 13): Shapes & vector breadth 92% → 97%, ready 66% → 68%, 8–14 h → 1–3 h; feature breadth ~78% → ~79%; ready for real work unchanged (~47%); full parity ~390–745 h → ~385–730 h
2026-10-11 minor Collaboration wording after the collaboration polish: styles, variables, collections, modes and comments created in a live session take ids from their creator's id space (concurrent creations no longer overwrite each other; the server checks it), others' text carets and selections show on the canvas, and typing in a layer someone else is typing in says so; percentages unchanged
2026-10-11 minor Wording only: live sessions (#104), then the browser joining them and figcraft:// invite links opening the desktop app; percentages and hours unchanged until the next re-measure
2026-10-10 minor Merged main after #101–#103: WASM plugins (plugins area 0% → 35% breadth, 20% ready; ecosystem 5% → 20%) and the multiplayer core without networking (multiplayer 5% → 15% breadth, 5% ready; collaboration 8% → 12%); menu breadth 97.5% → 98.5% (200/203); ready for real work ~46% → ~47%; full parity 420–790 h → 390–745 h; beta 210–380 h → 200–365 h. Fixed the stated weight sums (areas 1–16 sum to 94, total 113; percentages were already computed with those)
2026-10-10 minor Marked beta blockers; no alpha blockers (the alpha gate passes)
2026-10-10 major Created from the 2026-10-10 re-measure against Figma desktop 126.10.7 (replaces the gap list that lived in ROADMAP.md)