Skip to main content
Multiplayer Editing (Yjs) Overview
CRDT (Yjs) based collaborative editing. This feature is useful for building collaborative features like shared forms, whiteboards, or any real-time state that needs to be synced across all users.
This is in beta.
This is framework agnostic.
Use our Core guide to create custom integrations if a purpose built library is not listed below
Out of box support for the following libraries:
What you can build
Collaborative text editing : rich text editors, notes, documents
Visual collaboration : whiteboards, diagrams, flow editors
Shared app state : forms, lists, dashboards synchronized across users
Packages at a glance
Core library (@veltdev/crdt
) : Framework-agnostic CRDT stores (array, map, text, xml), versioning, subscriptions, and syncing via the Velt client. See setup: Core
.
React Hook Wrapper (@veltdev/crdt-react
) : A typed React hook for creating and consuming CRDT stores with minimal boilerplate. See setup: Core
.
Editor integrations :
Tiptap : Collaborative text editing with cursors and history. See setup: Tiptap
.
ReactFlow : Collaborative node/edge graphs. See setup: ReactFlow
.
CodeMirror : Collaborative code editing. See setup: CodeMirror
.
BlockNote : Collaborative block-based editor. See setup: BlockNote
.
Why Velt CRDT
Conflict‑free sync : Yjs ensures eventual consistency without merge conflicts.
Low latency, offline‑first : Local writes with automatic re‑sync when back online.
Batteries included : Version history, subscriptions, presence, and editor integrations.
Use anywhere : Core library for any framework; React Hook wrapper for the fastest React integration.
Key capabilities
Low latency : Optimized for snappy, real-time updates.
Offline-first : Local-first reads/writes with automatic re-sync when back online.
Conflict-free : Yjs CRDT ensures eventual consistency without merge conflicts.
Version history : Create checkpoints and restore prior states when needed.
Framework agnostic : Use anywhere; React hook available for faster integration.
How it works
You initialize the Velt client in your app.
You create a CRDT store (core or via the React hook) with a unique id
and a data type
.
Components subscribe to the store to render the latest value and push updates.
Yjs merges concurrent edits; Velt handles synchronization between connected clients.
Choose your path
Try it yourself!
Open in larger window