figcraft/docs/gaps.md

234 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Where FigCraft falls short of Figma
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-11 · **Change:** minor (live boolean editing and the vector tail: feature breadth ~79%) · **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`](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`](roadmap.md#alpha-gate) 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](file-format-parity.md) |
| 2 | No real-time multiplayer or sharing (**beta blocker**) | Feature | 45–90 | [collaboration-parity](collaboration-parity.md) |
| 3 | Nothing checked against real Figma files | Fidelity | 15–30 | [target-app-parity](target-app-parity.md) |
| 4 | Interaction fidelity not compared tool by tool | UI/UX | 40–60 | [ui-parity](ui-parity.md) |
| 5 | No localization layer; English only | Localization | 60–100 | [localization-parity](localization-parity.md) |
| 6 | Plugins: no run-time UI, distribution or widgets; Figma's plugins don't run | Ecosystem | 25–55 | [target-app-parity](target-app-parity.md) |
| 7 | CPU canvas where Figma uses the GPU | Hardware/performance | 30–60 | [hardware-parity](hardware-parity.md) |
| 8 | Platform QA is mostly macOS | Stability/platforms | 10–20 | [hardware-parity](hardware-parity.md) |
| 9 | Figma Draw: brushes, pressure, text on a path, pattern fills | Feature | 10–18 | [target-app-parity](target-app-parity.md) |
| 10 | Shared (team) libraries | Feature | 10–20 | [components-parity](components-parity.md) |
| 11 | Spell check | Feature | 4–8 | [target-app-parity](target-app-parity.md) |
| 12 | Video and animated GIF fills; HEIC/TIFF images | File format | 6–12 | [file-format-parity](file-format-parity.md) |
| 13 | Boolean groups hit-tested by their operands (the rest of the vector tail landed) | Feature | 1–3 | [target-app-parity](target-app-parity.md) |
| 14 | Variables: extended collections, import/export | Feature | 4–8 | [components-parity](components-parity.md) |
| 15 | Prototyping: media triggers and actions, gamepad | Feature | 3–6 | [prototyping-parity](prototyping-parity.md) |
| 16 | Dev Mode: Code Connect, editor integrations | Feature | 4–8 | [dev-mode-parity](dev-mode-parity.md) |
| 17 | Branching and merging | Feature | 8–15 | [collaboration-parity](collaboration-parity.md) |
| 18 | Display P3 on screen; one window only | Hardware | 6–12 | [hardware-parity](hardware-parity.md) |
| 19 | AI features | AI | 30–60 | [target-app-parity](target-app-parity.md) |
| 20 | Mobile apps (view, mirror, comment) | Platforms | 20–40 | [hardware-parity](hardware-parity.md) |
| 21 | Three menu items without a command | Feature | 2–4 | [parity-checklist](parity-checklist.md) |
| 22 | Screen readers never run; browser has no accessibility tree | UI/UX | 4–8 | [ui-parity](ui-parity.md) |
| 23 | CMYK output intent for print PDFs | File format | 2–4 | [file-format-parity](file-format-parity.md) |
## 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. No real-time multiplayer or sharing
- **Missing:** co-editing, live cursors and selections, observation mode, cursor chat, spotlight,
audio, share links and permissions. 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; but sessions are
plain `ws://` (no TLS, so an https page can only join on the same computer), and there are no
share links or permissions (`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: sharing and permissions and a standalone server with TLS.
### 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`](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`](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`](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`](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 and animated GIF fills; HEIC/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 (first frame) and BMP.
- **Estimate:** 6–12 h (video playback in the presenter is most of it).
### 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, import/export
- **Missing:** extended collections (a library collection extended with overrides), variables
import/export, variant properties and gradient stops bound to variables.
- **Estimate:** 4–8 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
- **Missing:** branches of a file, review and merge.
- **Estimate:** 8–15 h (versions and Compare changes are a base).
### 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. Three menu items without a command (measured)
- `file.openRecent`, `view.outlinesSelection`, `view.maskOutlines`
([`parity-checklist.md`](parity-checklist.md)); the plugin pair landed in #101.
- **Estimate:** 2–4 h for the first three.
### 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 | 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) |