Roadmap to MVP
A linear checklist of milestones between now and shipping.
Last updated: 2026-02-10
Model: Zus is a local-first writing app. It's all local-first.
- Browser Mode — works instantly, no install, no account (MVP)
- Sync Mode — Cloud Sync (sign in) + Desktop Sync (app store adapter)
- Desktop App — Electron, built-in sync + filesystem (power users)
Canonical format: CRDT (Y.XmlText encoding the Slate AST). Markdown
is an import/export format. See pm/specs/document-sync-architecture.md.
Done
- CRDT-native document model — Single Slate editor per document. One Y.XmlText per document.
@slate-yjs/coremaps Slate ↔ Yjs. Markdown adapter (unified/remark) for import/export. - Yjs CRDT integration — Y.Doc per document, withYjs/withYHistory in editor, IndexedDB persistence (binary Y.Doc state). Collab-ready foundation.
- Plugin system core — Plugin registry with install/uninstall lifecycle, dependency checking, conflict detection. CommandRegistry for commands. BlockRendererRegistry for block types.
- Obsidian-inspired plugin API —
onload(api)/onunload()lifecycle. PluginAPI context withaddCommand(),registerBlockType(),registerEvent(),addStatusBarItem(),loadData()/saveData(). Auto-cleanup on uninstall. Event bus for plugin event dispatching. - Error handling — Custom error hierarchy, React error boundaries, auto-save retry with exponential backoff.
- Reference plugins — Formatting (bold/italic/underline/code/link), Headings (h1/h2/h3), Word Count. All use
onload(api)pattern. - Editor wiring + plugin validation — Keyboard shortcuts (Cmd+B/I/U/K) fire through command registry. onChange flows to event bus (word count updates live). Format toolbar appears on text selection. Image elements render from markdown. Full plugin loop validated.
- Plugin tier system — Three tiers (system/core/community) with distinct API surfaces. System plugins (shell, AI agent, editor) get
SystemPluginAPIwith workspace-level access. Core/community plugins use standardPluginAPI. Everything with a lifecycle is a plugin. - Sync server prototype — Bun-based Yjs sync server with file watcher, Y.XmlText ↔ markdown bridge (
slate-bridge.ts), WebSocket sync protocol. Validates the sync architecture.
Next — Browser Mode (MVP)
- Wire YjsDocumentProvider into EditorPanel — Y.Doc from IndexedDB is the document. No separate
loadDocument/initialDocumentpath. No WebSocket sync for MVP. - Editor library — Pure editor commands, keymap system (including vim mode), selection utilities, structural analysis (outline, sections, references). Being built in
core/src/editor/as library code, then wired into plugins. (in progress) - Shell architecture — View system, navigation model, surfaces. Sidebar, omnibar, status line as pluggable surfaces. Shell itself is a system plugin.
- Theme system — Light/dark/system modes, font style, size, width, spacing. CSS custom properties. Settings persistence.
- AI agent integration ("Zus") — Plugin shape and shell surface for the AI mediator. Contextual writing assistance within the editing flow.
- Search — Document search across the user's space. Omnibar as the search surface.
- Ship Browser Mode MVP
Later — Sync Mode
- Auth — iCloud and Google sign-in (no email/password). Account is optional — app works fully without it.
- Cloud Sync — Cloudflare Durable Objects for document sync. Each doc = one DO (durable replica). WebSocket transport via
useYjsWebSocketSync. Browser → sign in → existing docs sync seamlessly (Yjs merge). - AI agents via MCP — MCP server exposing fine-grained CRDT operations. Agents make surgical edits that merge with concurrent human edits.
- Desktop Sync — Native adapter (app store). Connects to DO as Yjs peer. Writes .md files to disk via markdown adapter.
Later — Desktop App
- Electron app — Native app with built-in cloud sync + filesystem access. Same editor, same CRDT. Prototype exists at
packages/desktop.
Specs Index
| Spec | Scope |
|---|---|
pm/specs/document-sync-architecture.md |
Product model, modes, CRDT architecture, layer model, Durable Objects |
pm/specs/architecture-overview.md |
The big picture — all layers, how pieces connect |
pm/specs/local-first-architecture.md |
Local-first philosophy, Cloudflare layout, identity model |
pm/specs/storage-architecture.md |
IndexedDB schema, Y.Doc persistence, cloud storage mapping |
pm/specs/editor-comprehensive-guide.md |
Master editor reference |
pm/specs/editor-library-spec.md |
Editor library internals, module structure |
pm/specs/plugin_system.md |
Plugin API, lifecycle, event bus |
pm/specs/plugin-tiers-and-architecture.md |
System/core/community plugin tiers |
pm/specs/zui-framework.md |
Declarative shell layout, 10 elements |
pm/specs/zui-observable.md |
Reactive primitives, workspace model |
pm/specs/data-model-and-navigation.md |
Graph, nodes, edges, perspectives |
pm/specs/ambient-ui-patterns.md |
Ambient UI design system |
pm/specs/theme-presets-integration.md |
Font, size, width, spacing presets |
pm/specs/markdown-first-pivot.md |
Historical: block→markdown pivot (superseded by sync spec) |