Files
figcraft/docs/roadmap.md
T
BFlatandClaude Opus 5.5 4d7a9187ff M9: live sessions: host from the app, invite links, live cursors and presence (#104)
* 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>
2026-10-11 02:40:59 +07:00

6.9 KiB
Raw Blame History

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

  1. .fig import (best effort) with a synthetic .fig corpus saved from the installed Figma: 30–60 h. Unblocks beta and every real-file measurement.
  2. Real-file corpus and fidelity measurement: import real files, compare against Figma's own exports, turn estimated percentages into measured ones: 15–30 h.
  3. Tool-by-tool interaction pass against the running Figma (ui-parity.md): 40–60 h, parallel by tool.
  4. 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.
  5. 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