Multiplayer editing

Add multiplayer editing to your product.

Yjs-based conflict-free co-editing, in Tiptap, CodeMirror, and 10 other editor libraries, or your own.

Stop fielding bug reports that start with “my changes disappeared.”

Free tier. No credit card. First comment in 5 minutes.

MEbrief-q3.md / Tiptap
live
BIUH1H2</>

The Q3 campaign centers on the migration storyHope: moving teams from async reviews to live collaboration inside the product itself.

Pricing: three usage tiers, starting at $0Ethan: no per-seat cost.

Build this

Multiplayer editing running inside products at

Migrating from Liveblocks or an in-house build?Compare·Migrate from Liveblocks

What it is

Humans and agents, one document.

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.

MAAGAI
Connected · Synced

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.

01Install
terminal
npm install @veltdev/react @veltdev/tiptap-crdt-react
02Wrap
_app.tsx
<VeltProvider
  apiKey={VELT_API_KEY}>
  <SetDocument documentId="brief-q3" />
  <YourApp />
</VeltProvider>
03Bind
Editor.tsx
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

Launch multiplayer editing this week.

No credit card. Works with React, Next.js, Vue, Angular, and HTML.

Get Free API Key

Capabilities

Edits that never collide.

Each card is the live SDK. Toggle to Code for the exact snippet that renders it.

01single editor
Hopedrafting the opening clauseholds the pen
Ethanwatching liveread-only
Request the penHope acceptsPen passes
// single editor
<VeltSingleEditorModePanel />
// request, accept, reject access

Single editor mode

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.

02state sync
Tab Astatus: "open"
Tab Bstatus: "open"
in syncOne value, every client · any JSON
// state sync
const [view, setView] = useLiveState("filters", {});

Live state sync

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
// merge
// Yjs merges concurrent edits
useCollaboration({ editorId: "forecast" });

Conflict-free merge

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 reviews Hope 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.

08editors
TiptapLexicalsoonBlockNoteCodeMirrorProseMirrorQuillMonacoAceDraft.jsSuperDocPlateReact FlowAG GridTanStackChart.jsHighchartsNivo

plus the core library for your own editor, whiteboard, or grid

// editors
@veltdev/tiptap-crdt-react
@veltdev/codemirror-crdt-react

Editor integrations

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.

The Q3 plan moves teams to live collaboration Hope across every binding.

caret labeldark

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.

CRDT storesY.TextY.MapY.ArrayY.Xml
POST /v2/crdt/updatewrite from your serverREST
encryptionyour key · Velt sees ciphertextyour key
offlinelocal-first · merge on reconnectqueued
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
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

See it running in products like yours.

30 minutes, with an engineer, not a sales deck.

Book Demo
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.

Book Demo

Proof

The overwrite bug, gone.

“My changes disappeared” stopped reaching support.

0 tickets

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.

Add multiplayer editing to your product.

Free tier. No credit card. First comment in 5 minutes.

30 minutes, with an engineer, not a sales deck.