Velt Multiplayer Editing adds Yjs-based conflict-free co-editing to your product: concurrent edits merge automatically, with no lost work and no merge conflicts. It works out of the box in Tiptap, CodeMirror, and 10 other editor libraries, or bring your own editor. Offline edits merge on reconnect, and server-side writes through the CRDT REST API land in the same document your users are typing in. When an agent edit needs consent before it lands, it goes through Suggestions; co-editing is for the edits both actors are trusted to make.
Campaign brief: Maya is typing the opening paragraph.
Maya
Pricing section: rewritten by the agent through the CRDT REST API.
Agent
both streams live and interleaved, zero conflicts · consent-gated edits go through Suggestions
How it works
Three steps to live co-editing.
Install the SDK and your editor’s CRDT package, set the document, and call useCollaboration. Concurrent edits merge with Yjs and sync between connected clients, so there is no sync server to run.
const { extension } = useCollaboration({
editorId: "brief-q3",
});
// add the returned extension to your editor
With Velt
The mechanics
Initialize the Velt client, create a CRDT store with a unique id and a data type — text, map, array, or xml — and your components subscribe to render the latest value and push updates. Yjs merges concurrent edits while Velt handles synchronization between connected clients, so there is no sync server to run. Single editor mode runs on the same live state sync element that powers state sync: a setLiveStateData call or the useLiveState hook. Server-side processes write through the CRDT and live state REST APIs into the same live document.
// create a CRDT store · subscribe to render · push updates
Build it yourself
What an in-house version requires
a CRDT or OT engine to choose and operate
a websocket fleet that survives reconnection storms
an offline queue with merge on reconnect
per-editor bindings for every library you support
awareness wiring for remote cursors
version snapshots and restore
a locking and handoff layer for controlled editing
state persistence and compaction
multi-tab dedupe
Teams that build realtime sync budget multiple quarters for specialists and keep paying for the edge cases. The 3 steps above replace that build; the capability wall below replaces the long tail.
MCP: the faster path.
Skip the steps. Have your agent set it up.
npx -y @velt-js/mcp-installer
claude mcp add velt-installer -- npx -y @velt-js/mcp-installer
One person holds the pen while everyone else watches live; read-only access is enforced by the SDK. Overwrite bugs during handoffs are gone, and passing the pen is a request-and-accept, never a race.
Sync filters, toggles, form fields, any JSON across clients with no websocket code. A useState-style hook makes a synced component a one-line change: local-first, offline-safe, last-write-wins.
03merge
HopeEthan
0 conflictsBoth edits are kept, and neither loses a keystroke
Yjs CRDTs merge concurrent edits automatically, eventual consistency with no merge conflicts. Two analysts type in the same forecast narrative and neither loses a keystroke.
04presence
live
The Q3 plan moves teams from async reviewsHope to live collaboration Ethan inside the product.
// presence
<VeltPresence/><VeltCursor/>
Presence, cursors, and live selection
Avatars, named cursors, and live selections inside the same document, humans and agents alike. The signals users expect from every multiplayer app, wired into the editor.
05checkpoints
Live draftediting now · 3 collaboratorscurrent
Before pricing rewritesaved 09:14
Outline approvedsaved Mon 16:40
broadcastRestore via API reaches every connected client
// checkpoints
velt.crdt.saveVersion({ name: "pre-rewrite" });
Version checkpoints
Named snapshots of the document state, saved and restored by API; a restore broadcasts to every client. The draft before the bad rewrite is one call away.
06encryption
Your contentbrief-q3.md
Encrypted with your keyVelt never sees plaintext
Synced ciphertexta3f9c1 7e22b8 04d6e1…
// encryption
// ciphertext only — your keys
setEncryptionProvider(provider);
Customer-defined encryption
Encrypt synced content with keys you define; Velt moves ciphertext, not content. The compliance answer when the document itself is the sensitive asset.
07offline
Edited offlinequeued locally, nothing lostqueued
Back onlinechanges merge in ordermerged
// offline
// local-first; queues offline, syncs on reconnect
Offline and multi-tab
Local-first writes queue offline and sync on reconnect, and the same user’s tabs stay synchronized. The warehouse dead-zone edit lands when the signal returns.
Tiptap, React Flow, CodeMirror, and BlockNote out of the box; Lexical is coming soon. The core library wires your own editor, whiteboard, or grid onto the same engine.
09stores
textY.Text
mapY.Map
arrayY.Array
xmlY.Xml
subscriptions · typed React hook · any framework
// stores
velt.crdt.getStore({ id, type: "map" });
Core stores for custom state
Framework-agnostic CRDT stores in four types — text, map, array, xml — with subscriptions and a typed React hook. Forms, whiteboards, dashboards: shared state, not just documents.
10server writes
POST/v2/crdt/update
{
"documentId": "brief-q3",
"op": "insert"
}
liveConnected clients pick up the change
// server writes
POST /v2/crdt/update // server or agent writes
Server and agent writes
The CRDT REST API writes proper CRDT operations onto the live document, and connected clients pick up the change. Your backend, or your agent, edits beside your users.
Our “my changes disappeared” tickets went to zero the week we moved to CRDT-backed editing. Two analysts type in the same forecast and nobody loses a keystroke.
Engineering lead · FP&A platform
Little big details
The long tail, already built.
Shipped functionality only, traceable to docs; engineering sign-off still applies. This is the part of an in-house build that never ends.
Editing-role API: setUserAsEditor, requestEditorAccess, accept and reject, editor-change eventsConflict-free Yjs merge for concurrent editsOffline-first local reads and writes with automatic re-syncMulti-tab synchronizationVersion checkpoints: save, list, restore, apply locallyConnection and sync-state monitoring: connecting, connected, disconnected, isSyncedCRDT event subscription (updateData)Debounced backend writes (debounceMs)Initial content applied once for new documents; force-reset to template contentCustom encryption provider for CRDT payloads before storageYjs escape hatches: getDoc, getXmlFragment, getAwareness, getProvider, getStoreRemote cursors with name labels via Yjs awareness in editor integrationsCRDT REST APIs: add, get, updateReact hook wrapper (@veltdev/crdt-react)Single editor mode panel (VeltSingleEditorModePanel) with wireframe customizationCustom mode with data-velt-sync-access element attributesContainer scoping (singleEditorModeContainerIds)Single-tab editor lock and editCurrentTab takeoverEditor-state hooks: useUserEditorState, useEditorAccessRequestHandlerServer-timestamp last-write-wins conflict resolutionLive state sync: setLiveStateData with merge config; listenToNewChangesOnlygetLiveStateData subscription and fetchLiveStateData one-time readsuseLiveState hook with syncDuration and resetLiveStateServer connection states: online, offline, pendingInit, pendingDataRedux middleware for synced stateBroadcast Event REST APILive state data persists until manually removedLexical CRDT co-editingComing soon
Make it yours
Your editor, your rules.
Prebuilt panels for the fast path, wireframes and CSS for fully custom UIs, and configuration, hooks, merge config, and REST APIs underneath.
Look
The single editor mode panel comes prebuilt and restyles through wireframes; collaboration cursors style with plain CSS via caret and label classes; global styles and dark mode apply.
BIH1Tiptap
The Q3 plan moves teams to live collaborationHope across every binding.
caret labeldark
<VeltSingleEditorModePanelWireframe>// your markup, Velt syncs</VeltSingleEditorModePanelWireframe>
Behavior
customMode for manual read-only control, container scoping, tab locking, debounceMs and syncDuration tuning, merge config, a custom encryption provider, the CRDT and live state REST APIs, and Redux middleware.
We dropped co-editing into our own editor without touching the engine. The merge config and the custom encryption provider were the only knobs we needed.
Staff engineer · document platform
In production
Multiplayer editing, in products like yours.
Tabbed by vertical, with verified customer screenshots.
SummaryNext StepsDemoCustomer Stories
Hey Conductor!
This Digital Sales Room gives you everything you need to move forward — from proposal to plan.
Our Mutual Action Plan
Training2 / 5
Creating a new Room1
Build a working demo room
Contract sign-off
M
Maya2m
@Fin We need to make a working demo for Rene and his team
Two copywriters and a brand reviewer draft the same email live, edits merging mid-sentence. The intro paragraph nobody saved still survives the handoff.For sales enablement
finance / receivables
Active invoices$42,125
Awaiting approval$8,400
Paid this week$31,900
Invoice IdClientCost
#20251Apex Manufacturers$4,2501
#20248Northwind Logistics$2,980
#20245Helios Energy$7,1201
#20242Cedar & Stone LLP$3,5402
#20239Bluefin Capital$5,860
M
Maya2m
Can we confirm the PO before approving this one? @Sarah
1 Reply
Single editor lock on the filing: one analyst holds the pen while reviewers watch the cells change live. The handoff is requested, accepted, and on the record.For fintech and FP&A
Cotton Supplier Ltd.
Mid Weight Indigo Denim
Farm
AgriCotton Farms
Village Kheda, Gujarat, India
Cotton Yarn1
SpinCo Yarns
18 Narol Rd, Gujarat, India
Manufacturer
DyeWorks International
Calle de Mayo, Mexico
M
Maya2m
Can you attach the GOTS cert for this lot before we approve? @Sean
1 Reply
Sean
State sync keeps the dispatch board identical on every screen, and field edits from a dead zone merge on reconnect. No refresh, no stale statuses.For operations
Privacy Risk Review
New feature processing health data
Wren discovered a feature request in Jira involving users' health data and triggered a review after analyzing the PRD in Confluence against company policy and US regulation.
JStarted by Juan Mendez
JMShare
Wren analyzed the PRD against policy and HIPAASee analysis1
Wren recommends a PIA based on the findingsStart
Route the PIA to the Privacy Office for approvalWaiting on PIA1
Discussion
Add a comment
Policy Agent2m
This feature processes PHI, so HIPAA applies. I recommend a PIA and a vendor BAA review before any data flows. @Juan
The compliance team co-edits the disclosure live, a single-editor lock on the attestation line so two officers never overwrite each other. Reviewers watch the controls register change in real time before sign-off.For compliance
Superflow
SaaS Monthly Subscription
JMShare
1 · Subscription & Fees
Customer subscribes to the Service on a monthly basis and shall pay the then-current fees in advance of each billing period. Fees are non-refundable except as expressly set out in this Agreement.
2 · Term & Auto-Renewal
The subscription renews automatically for successive one-month terms unless either party gives at least thirty (30) days' written notice of non-renewal before the end of the then-current term.
3 · Limitation of Liability
Except for breaches of confidentiality, each party's total aggregate liability under this Agreement shall not exceed the fees paid by Customer in the one (1) month preceding the event giving rise to the claim.
4 · Governing Law
This Agreement is governed by the laws of the State of Delaware, without regard to its conflict-of-laws provisions, and the parties consent to the exclusive jurisdiction of its courts.
M
Maya5m
@Jordan Auto-renewal needs 60 days' notice to match our policy, not 30.
J
Jordan2m
@Maya Liability cap is one month of fees — Legal wants 12 months before we sign.
P
Priya8m
@Maya Governing law should be New York to match the MSA.
Counsel and the deal team redline the clause together, edits merging mid-sentence with no versioned-email round-trip. The liability cap nobody saved still survives into the next revision.For legal
CommentShare
Make the hero headline punchier and add a primary CTA.
Done — rewrote the headline, tightened the subtext, and added a primary CTA in hero.tsx.
Add a logo strip with social proof under the CTA.
Added a five-logo trust strip below the CTA and wired it into hero.tsx.
Edit hero.tsx
Type your prompt
Ship your app in a weekend
Get started
M
Maya2m
Use our brand orange on the CTA and cut the headline to one line. @Sean
An agent rewrites one section while the human drafts another, and Yjs merges both streams without conflict. Generated work lands in the document, not in a paste buffer.For AI-native SaaS
SOC 2 Type IIHIPAAEU data residencyCustomer-managed encryption
CRDT payloads can be encrypted with your own encryption provider before they reach Velt storage — Velt moves ciphertext, not content. Co-editing, single editor mode, and live state sync run on the same isolation guarantees as the rest of the SDK. See self-hosting and governance.
Our “my changes disappeared” support tickets went to zero after we switched to CRDT-backed co-editing. Concurrent edits just merge.
Engineering lead, FP&A platform
1 afternoon
We had Tiptap co-editing, cursors, and version checkpoints running in an afternoon. The sync server we had scoped for a quarter never got built.
Founding engineer, collaborative editor
0 conflicts
An agent rewrites one section while our user drafts another, and Yjs merges both streams without a single conflict. Generated work lands in the document.
VP Engineering, AI-native SaaS
FAQ
Questions about multiplayer editing.
Install @veltdev/react and the CRDT package for your editor (for Tiptap, @veltdev/tiptap-crdt-react), wrap your app in VeltProvider with your API key, set the document, then call useCollaboration with an editorId and add the returned extension to your editor. The quickstart and the Tiptap setup guide walk through it.
Two ways, both built in. Co-editing merges concurrent edits with Yjs CRDTs, so simultaneous changes combine instead of colliding. Single editor mode locks editing to one person while everyone else watches live, with request and handoff APIs for passing access. Use merge when everyone should type at once, the lock when exactly one person should.
Tiptap, CodeMirror, and 10 other editor libraries, or your own through the framework-agnostic core library with text, map, array, and xml stores.
Yes. Co-editing is offline-first: writes apply locally and sync automatically on reconnect, with Yjs merging whatever happened while you were gone. Single editor mode and live state sync also keep working offline, syncing on reconnect with last-write-wins resolution.
No. Velt handles synchronization between connected clients; you install the SDK and create a store. There is no sync server, websocket fleet, or persistence layer to operate.
Server-side edits go through the CRDT REST API, which writes proper CRDT operations onto the live document so every connected client picks up the change. A backend process or an agent can edit the same document your users are typing in. For agent edits that need human consent first, see Suggestions.
Co-editing for documents everyone edits at once (Yjs merge). Single editor mode for one pen with a live audience and controlled handoffs. State sync for everything that is not a document: filters, toggles, form fields, any JSON your UI shares across clients.
Velt is priced on usage, not seats: you pay for documents with review activity in a month, and there is a free tier for development and early production. Multiplayer editing, single editor mode, and state sync are part of the SDK, not separately priced add-ons.
@Jordan Auto-renewal needs 60 days' notice to match our policy, not 30.
@Maya Liability cap is one month of fees — Legal wants 12 months before we sign.
@Maya Governing law should be New York to match the MSA.