* M9: real-time collaboration protocol (design) docs/collab-protocol.md: WebSocket sessions with a server-ordered, per-property last-writer-wins document sync, client-scoped ids, fractional positions for children, ephemeral presence (cursors, selections, follow), per-user undo, hosting from the app first and a self-hosted server next, and the implementation plan. ROADMAP gains M9. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * M9: collaboration core: ids, change sets, server ordering, convergence Step 1 of docs/collab-protocol.md, no networking: - Client-scoped node ids: Document::set_client_id makes alloc_id hand out client << 32 | counter; single-user files allocate as before; the id counter is no longer part of document equality. - crates/collab (layer 2): the synced object/property model (every saved Node field, plus document-level styles, comments, variables, images, dev snapshots, library data), Change batches, an O(changed) diff, strict and lenient apply, fractional sibling positions, snapshots. - Server (ordering, validation, rejects with fixes) and Client (optimistic view, replay under remote batches, author-side repair of derived data) as pure state machines; binary (version byte + postcard, JSON values) and JSON message forms, fuzzed decoders. - Engine: normalize as the recompute hook, collab.diff. - Tests: round trips over random real commands, an N-client convergence fuzz test over delayed in-order links, junk batches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * M9: fmt after merge * M9: live sessions: host from the app, invite links, live cursors and presence Step 2 of docs/collab-protocol.md, networking and presence half: - crates/collab-net (layer 6): WebSocket transport (sync tungstenite, a reader and a writer thread per connection, no async runtime), the session host the app embeds (runs figcraft_collab::Server as the authority, carries its messages), invite links, presence throttling (~30 Hz, latest wins), limits (sockets, hello/idle timeouts, message size, rate, slow clients), keep-alive, clean close, reconnect with backoff; a browser stand-in until the web-sys client (step 4). - engine: live session state (status, peers, presence, follow) and the collab.host/stop/join/leave/peers/follow/cursor commands; the network is reached only through the LiveLink the app installs. - ui-egui: remote cursors (pointer drawn in code, name tag, gliding), selection outlines (once documents sync), avatars in the right panel with follow, the Share popover (start, invite link + URL with Copy, stop), File > Join live session. - desktop app and MCP headless session install the link; xtask layers keeps networking crates out of L0-L5. - Documents don't sync between apps yet (follow-up). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * M9: live sessions: document sync between apps - The host's session runs figcraft_collab::Server seeded with the shared document; every app (the host's too, through the hub without a socket) is a collab Client. Guests open the host's file from the welcome as a new tab; leaving keeps it as a local copy. - Engine: after each local action (a gesture once it ends; nothing during version or text previews) the session document is diffed into one Changes batch; server batches go through Client::receive with EngineRecompute and are installed with Session::apply_remote, which never touches the undo history. Batches arriving mid-gesture wait. - Transport: Changes/Reject/Welcome reach the engine as Event::Sync; LiveLink::send carries batches in order; hellos are limited to 64 KiB, joined clients to the core's message size. - Tests: engine sync against a real Server (ids in the client's space, one batch per gesture, remote edits skip undo, deferral, closing the file leaves), three apps over loopback converging (create, move, recolour, delete, rename) and a late joiner getting the server's state. - Docs: collab-protocol, mcp, README, roadmap docs; the UI's "cursors only" note is gone, replaced by the per-person undo caveat. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
6.9 KiB
FigCraft roadmap: milestones and what's next
Last reviewed: 2026-10-10 · Last updated: 2026-10-10 · Change: minor (merged #101–#103: plugins and the multiplayer core) · Target: Figma Design (desktop app 126.10.7)
Forward-looking plan. Where FigCraft stands today: ROADMAP.md and
target-app-parity.md; the full ranked list: gaps.md. Hours
are one Opus 5.5 agent; most milestones split across 4–6 agents on disjoint crates. There is no
cargo xtask scorecard in this repo; the measured number is cargo xtask parity.
Current focus
.figimport (best effort) with a synthetic.figcorpus saved from the installed Figma: 30–60 h. Unblocks beta and every real-file measurement.- Real-file corpus and fidelity measurement: import real files, compare against Figma's own exports, turn estimated percentages into measured ones: 15–30 h.
- Tool-by-tool interaction pass against the running Figma (
ui-parity.md): 40–60 h, parallel by tool. - Localization layer, then Figma's own languages first (ja, ko, es, pt-BR, fr, de): 15–25 h for the layer, 3–5 h per language plus native review.
- Multiplayer M9: per-user undo, reconnect with offline edits, the browser client, a standalone server and sharing on top of the live sessions (the WebSocket transport, hosting from the app, invite links, document sync, live cursors, selections, avatars and follow landed), per
collab-protocol.md: 45–90 h.
Alpha gate
The core workflows a Figma Design user runs every day, checked end to end on macOS (the main
platform) with work saved to .figcraft and reopened. Evidence is the repo's tests and the
builders' side-by-side checks with synthetic files; nothing has been run on real Figma files yet.
| Workflow | Works end to end? | Evidence | Hours to pass |
|---|---|---|---|
| Design screens: frames, shapes, vectors, text, auto layout, styles; save, reopen, export assets | yes | tools and panels in crates/engine and crates/ui-egui; .figcraft round trips (crates/format/src/large_tests.rs); PNG/JPG/SVG/PDF export tests |
— |
| Build and use a design system: components, variants, properties, variables and modes, libraries | yes | components_scale_tests.rs (300 components, 2,000 instances), library_tests.rs, library_variables_tests.rs; libraries are local files, not shared |
— |
| Prototype and present: interactions, flows, overlays, smart animate, variables | yes | proto_*_tests.rs, present_*_tests.rs |
— |
| Hand off to developers: Dev Mode inspect, code, measurements, asset export, ready for dev | yes | devinspect_tests.rs, component_codegen_tests.rs, devcompare_tests.rs, annotations_tests.rs |
— |
| Review with others: comments, versions, sharing the work | partial (not blocking) | comments with threads, mentions and resolve plus version history work inside a file (comments_tests.rs, version_tests.rs); the file is shared by passing it along; no real-time co-editing or share links yet; the sync core landed without networking (collaboration-parity) |
beta gap: 45–90 |
Continue existing Figma work (open .fig) |
no (beta gap) | no .fig reader; REST JSON import works for files fetched through Figma's API (file-format-parity) |
beta gap: 30–60 |
Passes, so FigCraft stays alpha: every daily design workflow works end to end on FigCraft's
own files, which save and reopen, and ready for real work (~47%) is above the ~40% bar. The two
gaps are real but don't break a workflow done in FigCraft: review works asynchronously through
comments in a shared file, and opening .fig is the step that moves work across from Figma, which
the standard requires for beta, not alpha. Both stay at the top of gaps.md as beta
blockers.
Milestones
| Milestone | Status | Left | Hours |
|---|---|---|---|
| M0 Foundation: workspace, model, renderer, engine, UI shell, app, control channel | done (2026-10-09) | — | — |
| M0.9 CLI + MCP, web build, release packaging, PDF export | done (v0.2.0 released 2026-10-10 for every platform) | — | — |
| M1 Core editing completeness (tools, panels, menus, clipboard, files) | ~75% | Open recent, outline mode variants, keyboard box selection, interaction pass | 8–14 + pass |
| M2 Layout depth | ~80% | grid fr rows, real-file QA |
6–12 |
| M3 Components & styles depth | ~75% | extended collections, variables import/export, real libraries | 10–20 |
| M4 Vector & text depth | ~70% | live booleans, spell check, Figma Draw (brushes, pressure, text on a path, patterns) | 24–40 |
| M5 Prototype & present | ~85% | media, gamepad, separate window | 5–9 |
| M6 Interop & Dev Mode | ~55% | .fig import, video/HEIC/TIFF, CMYK intent, Code Connect |
40–80 |
| M7 Release & fidelity (signed builds, look & feel, shortcuts) | builds done; fidelity pass started | tool-by-tool pass | 40–60 |
| M8 Hardening & performance (bench, retained canvas, accessibility, idle) | ~60% | real-file corpus, platform QA, GPU canvas, screen readers | 60–110 |
| M9 Real-time collaboration | core done (#103: ids, change sets, server ordering, convergence); live sessions (WebSocket transport with limits and reconnect, hosting from the app, invite links, document sync between apps, cursors, selections, avatars, follow, collab.* commands) |
per-user undo, resuming after a reconnect, figcraft:// link handler, browser client, standalone server, sharing |
45–90 |
| M10 Localization (new) | not started | layer + 11 languages | 60–100 |
| M11 Plugins | runtime, API, menu, manager and SDK done (#101) | run-time plugin UI, settings storage, distribution, widgets; Figma plugin compatibility is an owner decision | 25–55 |
| M12 AI features (new, owner decision) | not started | local models | 30–60 |
Next, after the current focus
- Shared libraries on top of the multiplayer server (10–20 h), branching (8–15 h).
- GPU canvas held to the CPU renderer (30–60 h).
- Figma Draw tools (10–18 h).
- Mobile viewer and prototype mirror (20–40 h).
Revision history
| Date | Change | Summary |
|---|---|---|
| 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 | Added the alpha gate (core-workflow table): passes, stage stays alpha |
| 2026-10-10 | major | Created: milestone table moved from ROADMAP.md with statuses re-checked; added M10–M12; current focus re-planned |