Real-time collaborative editing
CodeMirror edits a shared Y.Text document. Liveblocks distributes Yjs updates and presence, so concurrent changes merge without an exclusive document lock.
Loading Scribe…
Scribe / Collaborative Markdown workspace
Edit with multiple users, review Markdown suggestions and comments, navigate linked knowledge, compare versions, and retain local work during temporary connection loss.
Built with Next.js, TypeScript, CodeMirror, Yjs, Liveblocks, Convex, Clerk, and IndexedDB.
PRODUCT PREVIEW
This static preview mirrors the authenticated editor. The deployed application uses CodeMirror and a shared Yjs document.
IMPLEMENTED CAPABILITIES
Each capability below is backed by the authenticated product and server-side data model, not only the landing-page preview.
CodeMirror edits a shared Y.Text document. Liveblocks distributes Yjs updates and presence, so concurrent changes merge without an exclusive document lock.
Owner, editor, commenter, and viewer roles are enforced in Convex. A server endpoint maps the verified role to read or write access for one Liveblocks room.
Comments attach with Yjs relative positions and support replies, resolve/reopen, deep links, search, and permission-aware stable-identity mentions.
Propose insertions, replacements, or deletions without changing source. Editors accept through a claimed, idempotent Yjs transaction or see a conflict.
Named and automatic versions store full Markdown snapshots. Restoring a version updates Convex and replaces the active Y.Text in one transaction.
Yjs updates are stored in IndexedDB. The editor can retain local state through refreshes and temporary connection loss before synchronizing again.
GFM source gains command/slash workflows, find/replace, outline, statistics, wikilinks/backlinks, sanitized preview, and portable .md export.
ARCHITECTURE
Scribe separates identity, application data, live collaborative state, and local browser persistence. Each layer has a specific responsibility.
Read the architecture overview (opens in a new tab)Transports Yjs updates and collaborator presence between clients in the same room.
Stores documents, durable Markdown snapshots, permissions, comments, versions, shares, and notifications.
Authenticates users and supplies signed identity and active-organization claims.
Checks the Clerk session, asks Convex for document access, and grants one room read or write access.
DATA FLOW
Yjs owns the active collaborative text. Liveblocks, IndexedDB, and Convex serve different transport and persistence needs.
Liveblocks distributes CRDT updates. IndexedDB supports browser-local recovery. Convex snapshots make the latest Markdown available to workspace queries, exports, and version history without treating every keystroke as a database mutation.
ENGINEERING DECISIONS
CRDT operations allow local edits to remain responsive and merge after concurrent or temporarily disconnected work.
Liveblocks handles latency-sensitive Yjs updates and presence. Convex owns queryable records, permissions, comments, and versions.
The browser never chooses its collaborative privileges. The authorization endpoint derives them from the current Convex document role.
Debounced Markdown snapshots make content available to the application backend and provide recoverable version checkpoints.
TECHNOLOGY
The project uses each dependency for a defined part of the system.
Open the application, create a document, or read the source and architecture notes.