• DocsDocs
  • PricingPricing
Sign in
Get started
Sign in
Get started
    • Products
      • Sync
        Sync

        The sync engine for the agentic web

      • Comments
        Comments

        Contextual commenting

      • Notifications
        Notifications

        Smart alerts for your app

    • Platform
      • Realtime infrastructure

        Multiplayer sync for people and AI

      • SDKs & integrations

        Client libraries and framework adapters

      • Security & compliance

        SOC 2, HIPAA, GDPR

    • Agentic users

      Build agentic experiences

    • AI activity feed

      Surface AI activity in your app

    • Canvas

      Build collaborative canvases

    • Chat

      Create realtime chat experiences

    • Code editor

      Build collaborative coding experiences

    • Comments

      Add contextual discussion

    • Custom app

      Start with flexible building blocks

    • Forms

      Collect input together

    • Flowchart

      Diagram together

    • Inbox

      Keep users informed

    • Presence

      Show who is online

    • Slideshow

      Present together

    • Spreadsheet

      Collaborate on data

    • Text editor

      Edit documents together

    • Industries
      • Human resources

        Collaboration for HR & talent tools

      • Security & compliance

        Collaborative reviews for audits & evidence

      • Sales & marketing tools

        Engaging features that help sellers sell

      • Healthcare

        HIPAA-ready collaboration for care teams

      • Creative tools

        Multiplayer canvases for people & AI

      • Legal

        Secure drafting for firms & clients

      • AEC

        Collaboration for design & construction

      • Education

        Interactive realtime learning experiences

    • Users
      • Enterprise

        Realtime collaboration without a rewrite

      • Innovation

        Validate and ship multiplayer bets fast

      • Startups

        Build multiplayer products from day one

      • Individual builders

        Prototype multiplayer apps in minutes

    • Tools
      • Examples

        Gallery of open source examples

      • Showcase

        Gallery of collaborative experiences

      • Next.js Starter Kit

        Kickstart your Next.js collaborative app

      • DevTools

        Browser extension

      • Tutorial

        Step-by-step interactive tutorial

    • Company
      • Blog

        The latest from Liveblocks

      • Customers

        The teams Liveblocks empowers

      • Changelog

        Weekly product updates

      • About

        The story and team behind Liveblocks

  • Docs
  • Pricing
  • Products
    • Sync
    • Comments
    • Notifications
    Platform
    • Realtime Infrastructure
    • SDKs & integrations
    • Security & compliance
    Solutions
    • Human resources
    • Security & compliance
    • Sales & marketing tools
    • Healthcare
    • Creative tools
    • Legal
    • AEC
    • Education
    • Enterprise
    • Innovation
    • Startups
    • Individual builders
  • Use cases
    • Agentic users
    • AI activity feed
    • Canvas
    • Chat
    • Code editor
    • Comments
    • Custom app
    • Forms
    • Flowchart
    • Inbox
    • Presence
    • Slideshow
    • Spreadsheet
    • Text editor
    Technologies
    • Next.js
    • React
    • JavaScript
    • Redux
    • Zustand
    • Yjs
    • Tiptap
    • BlockNote
    • SuperDoc
    • Slate
    • Lexical
    • Quill
    • Monaco
    • CodeMirror
  • Resources
    • Documentation
    • Examples
    • Showcase
    • DevTools
    • React components
    • Next.js Starter Kit
    • Tutorial
    • Guides
    • Release notes
    Company
    • Pricing
    • Blog
    • Customers
    • Changelog
    • About
    • Contact us
    • Careers
    • Terms of service
    • Privacy policy
    • DPA
    • Security
    • Trust center
    • Subprocessors
  • HomepageSystem status
    • Github
    • Discord
    • X
    • LinkedIn
    • YouTube
    © 2026 Liveblocks Inc.
Blog/Updates

Introducing Liveblocks Sync: the sync engine for the agentic web

Liveblocks Sync is our sync engine for the agentic web, enabling you to build multiplayer applications where humans, agents, or both, can edit documents together in realtime. Previously known as Storage, it now includes LiveText, a new alternative for Yjs.

Picture of Chris Nicholas
Chris Nicholas on September 1st
Introducing Liveblocks Sync: the sync engine for the agentic web
September 1st·16 min read
  • Picture of Chris NicholasChris Nicholas
Share article
Product updatesSyncStorageCollaborationAIAgentsMultiplayer

Ready to get started?

Join thousands of companies using Liveblocks to build multiplayer experiences for people and agents.

Get started for free

Related blog posts

  • LiveText: a new data type for collaborative text editing

    LiveText: a new data type for collaborative text editing

    Picture of Chris Nicholas
    September 1st
    Updates
  • What's new in Liveblocks: July 2026

    What's new in Liveblocks: July 2026

    Picture of Chris Nicholas
    August 4th
    Updates
  • LiveFile: upload and share files in collaborative apps

    LiveFile: upload and share files in collaborative apps

    Picture of Chris Nicholas
    July 27th
    Updates

Today, we’re introducing Liveblocks Sync, our sync engine for the agentic web. Using Sync, you can build realtime multiplayer applications where humans, agents, or both, can edit documents at the same time.

Sync was previously known as Liveblocks Storage, but we’ve expanded its scope to include features for the modern web, such as LiveText, our new collaborative text editing technology, an alternative to the popular Yjs library.

Who needs Liveblocks Sync?

Sync is for anyone building an app around documents or artifacts, such as text editors, canvases, spreadsheets, flowcharts, AI workspaces. It’s especially useful if you don’t have a dedicated team of infrastructure engineers, or you’d rather not spend months building realtime collaboration from scratch.

Your browser does not support the video tag.Example of Sync in action

Apps powered by Liveblocks Sync

Why do you need it?

When people and agents edit a document at the same time, the last write usually wins, and everyone else loses their work. WebSockets can stream changes, but a live connection is still not a consistent document, and leaves you with issues:

  • Conflicting edits: Users lose data when editing at the same time.
  • Network latency: Every change needs to wait for a remote confirmation.
  • Reconnection: Poor networks risk losing user data when reconnecting.
  • Persistence: State is lost when the session ends or the page reloads.

Sync enables multiplayer

Liveblocks Sync is a sync engine that integrates into your app, enabling multiplayer experiences where humans, agents, and devices work on the same document together. When using it, you update a shared document as if it were local state, and the engine solves each of those problems for you:

  • Liveblocks acts as the source of truth, safely merging simultaneous edits.
  • Local changes apply immediately, before syncing in the background.
  • When a user disconnects, offline edits queue locally and merge on reconnect.
  • Documents automatically save to our scalable, persistent storage.

How Sync works

Liveblocks Sync supports any product experience where people, agents, or devices share live state—from canvases, to flowcharts, text editors, and more.

View docs

Using each of Sync’s multiplayer integrations and primitives, such as Storage, you can make a new or existing application multiplayer.

Storage

Storage is a CRDT-like primitive, inspired by Figma’s multiplayer technology, that allows you to read and write to conflict-resolved collaborative state, allowing you to build true multiplayer documents. For example, in the video below, Storage is used to store slides and their content.

Your browser does not support the video tag.Example of a collaborative AI slideshow editor

Multiplayer editing in the AI Slideshow example

Under the hood, Storage uses conflict-free data types to read and write to collaborative state. These data types work similarly to JavaScript structures, such as objects, arrays, and strings, except they sync their data in realtime, merging changes automatically.

import { LiveObject, LiveList, LiveText } from "@liveblocks/client";
// Create a list of slidesconst slides = new LiveList([]);
// Create a new slideconst newSlide = new LiveObject({ title: "Untitled", content: new LiveText(["<h1>Welcome!</h1>"]),});
// Add the new slide to the list=slides.push(newSlide);

In React, state can be read and modified using the useStorage and useMutation hooks respectively. For example, you can fetch a list of every slide, create a callback to add new ones, and add these to your app’s UI.

import { useStorage, useMutation } from "@liveblocks/react/suspense";
function Slides() { // Fetch realtime data, e.g. an array of slides const slides = useStorage((root) => root.slides);
// Update realtime data, e.g. add a new slide to the array const addSlide = useMutation(({ storage }) => { const newSlide = new LiveObject({ title: "Untitled", content: new LiveText(["<h1>Welcome!</h1>"]), });
storage.get("slides").push(newSlide); }, []);
return ( <div> {slides.map((slide) => ( <Slide key={slide.id} slide={slide} /> ))} <button onClick={addSlide}>➕ Add Slide</button> </div> );}

These hooks update in realtime as other users edit the document, and your app re-renders accordingly. Learn more about Storage.

Presence

Presence is another primitive, it allows you to show realtime user activity in your application, such as live cursors or an avatar stack. In the video below, a user’s live cursor is shown, and their avatar appears when they edit an item.

Your browser does not support the video tag.Presence

Live cursors and avatars in the Next.js Starter Kit

With the useOthers React hook, you can retrieve an array of every other connected user, and render presence how you like. For example, to show an avatar for each connected user, you can use the following code:

import { useSelf, useOthers } from "@liveblocks/react/suspense";
function AvatarStack() { // Get an array of every other connected user const others = useOthers();
// Render an avatar stack return ( <div> {others.map(({ connectionId, info }) => ( <img key={connectionId} src={info.avatar} alt={info.name} /> ))} </div> );}

For more complex presence, add useUpdateMyPresence to share JSON presence values with other users, such as whether a user has selected an input.

import { useUpdateMyPresence } from "@liveblocks/react/suspense";
function Input({ inputId }: { inputId: string }) { const updateMyPresence = useUpdateMyPresence();
return ( <div> <input // Update the user's selected input in presence onFocus={() => updateMyPresence({ selectedId: inputId })} onBlur={() => updateMyPresence({ selectedId: null })} /> </div> );}

To show which users are selecting the input, add useOthers, filter for users with the same selectedId, and render their avatars.

import { useOthers, useUpdateMyPresence } from "@liveblocks/react/suspense";
function Input({ inputId }: { inputId: string }) { const updateMyPresence = useUpdateMyPresence();
// Users that are selecting this input const others = useOthers(); const selectedOthers = others.filter( ({ presence }) => presence.selectedId === inputId );
return ( <div> <input onFocus={() => updateMyPresence({ selectedId: inputId })} onBlur={() => updateMyPresence({ selectedId: null })} /> {selectedOthers.map(({ connectionId, info }) => ( <img key={connectionId} src={info.avatar} alt={info.name} /> ))} </div> );}

Learn more about Presence.

Feeds

Feeds is a primitive that allows you to create realtime paginated streams of data. Use it to build AI chats with memory, display live agent activity, and give users a complete history of conversations and completed work. You can stream messages from both the client or server and display them live in your application.

Your browser does not support the video tag.Multiplayer chat

Multiplayer chat in the AI Slideshow Generator example

To set this up, stream messages into your UI with useFeedMessages, and create new messages with useCreateFeedMessage. With these hooks, you can create a chat interface like the one in the video above, using a UI library of your choice.

import {  useFeedMessages,  useCreateFeedMessage,} from "@liveblocks/react/suspense";import { generateResponse } from "./generate-response";
function Chat({ feedId }: { feedId: string }) { const { messages } = useFeedMessages(feedId); const createFeedMessage = useCreateFeedMessage();
return ( <> <Conversation> {messages.map((message) => ( <Message key={message.id} from={message.data.role}> <MessageResponse>{message.data.content}</MessageResponse> </Message> ))} </Conversation> <PromptInput onSubmit={(message) => { createFeedMessage(feedId, { role: "user", content: message, }); generateResponse(roomId, feedId, messages); }} > <PromptInputTextArea /> </PromptInput> </> );}

To render a generated response from the AI, use createFeedMessage to create a new message, then use updateFeedMessage to stream in each chunk of the AI’s response.

"use server";
export async function generateResponse(roomId, feedId, messages) { const messageId = crypto.randomUUID();
await liveblocks.createFeedMessage({ roomId, feedId, messageId, data: { role: "assistant", content: text }, });
const { textStream } = streamText({ model: "openai/gpt-5.6-sol", system: "You are a helpful assistant in a team chat.", messages, });
let content = "";
for await (const chunk of textStream) { content += chunk; await liveblocks.updateFeedMessage({ roomId, feedId, messageId, data: { role: "assistant", content }, }); }}

Learn more about Feeds.

Text editing

Sync allows you to add fully-featured collaborative text editing to your editor, enabling a multiplayer experience like Google Docs. Start with one of our ready-made integrations for editors like Tiptap, BlockNote, CodeMirror, or build from scratch with Yjs or LiveText, our new collaborative text editing technology.

Your browser does not support the video tag.Text editor

Text editing inside the Next.js Starter Kit

Each editor requires different setup code, but they’re all similarly easy to integrate. Plus, extend your own editor with any extensions or plugins, and Sync will ensure they’re multiplayer too, for example with our Tiptap integration.

import { useLiveblocksExtension } from "@liveblocks/react-tiptap";import { useEditor, EditorContent } from "@tiptap/react";
function TextEditor() { const liveblocks = useLiveblocksExtension();
const editor = useEditor({ extensions: [ liveblocks,
// Other extensions // ... ], });
return <EditorContent editor={editor} />;}

Learn more about Text editing.

Agentic editing

Sync’s APIs were designed with AI in mind, allowing you to build agents that can edit documents in realtime and show their presence, in the same way as humans. For example, in the video below an agent reads the Storage-powered spreadsheet, highlights the cells it changes, and leaves comments.

Your browser does not support the video tag.Agentic editing

An agent making edits in the AI Spreadsheet example.

To edit your Storage document from the server, use mutateStorage. Call setPresence first so users can see which cell the agent is editing.

const cellId = "B2";
await liveblocks.mutateStorage("my-room-id", ({ root }) => { const cells = root.get("cells");
// Show presence around the cell that's being edited await liveblocks.setPresence("my-room-id", { userId: "agent-123", userInfo: { name: "Agent" }, data: { editing: cellId, status: "Thinking…" }, ttl: 15, });
// Generate an AI response const { text: value } = await generateText({ model: "openai/gpt-5.6-sol", prompt: `Fill in cell ${cellId}. Here are all the cells: ${cells.toJSON()}`, });
// Update the cell with the AI response cells.set(cellId, value);});

This is a simple example, but you can take this a step further and, for example, stream in edits to each cell as an AI generates them too. Learn more about Agentic users.

Version history

Version history is a staple feature for collaborative applications, allowing users to revert their documents to previous states. Sync supports this, allowing you to automatically create snapshots at intervals, or manually create them when you wish. List versions in your app and let users restore them when needed.

Your browser does not support the video tag.Restoring an old history version

Restoring a version in the AI Flowchart example

Version history supports both Storage and Yjs document. To list a room’s versions use the useHistoryVersions hook, and for example to restore a Storage document, use the useRestoreToStorageVersion hook.

import {  useHistoryVersions,  useRestoreToStorageVersion,} from "@liveblocks/react";
function VersionsSidebar() { const [selectedVersionId, setSelectedVersionId] = useState<string>(); const { versions } = useHistoryVersions(); const restore = useRestoreToStorageVersion(versionId);
return ( <HistoryVersionSummaryList> {versions.map((version) => ( <HistoryVersionSummary key={version.id} version={version} selected={version.id === selectedVersionId} onClick={() => setSelectedVersionId(version.id)} /> ))} <button onClick={() => restore()}>↩️ Restore</button> </HistoryVersionSummaryList> );}

Versions can be manually created using createVersionHistorySnapshot

const { data } = await liveblocks.createVersionHistorySnapshot("my-room-id");

You can also display previews of old versions. Learn more about Version history.

Multiplayer undo/redo

Undo and redo are notoriously difficult to implement in multiplayer applications, but Sync supports it out of the box, enabling you to build undo/redo buttons with a few lines of code. When pressing undo, only the current user’s changes are reverted, and others’ changes are preserved—each user has their own history.

Your browser does not support the video tag.Multiplayer undo/redo in React Flow

Multiplayer undo/redo in the Flowchart Builder example

To add undo buttons to your application, simply use useUndo to take the action, and useCanUndo to determine whether the action is available. Similar hooks are available for redo, making this one of the simplest operations in Sync.

import {  useCanRedo,  useCanUndo,  useRedo,  useUndo,} from "@liveblocks/react/suspense";
function HistoryButtons() { const undo = useUndo(); const redo = useRedo(); const canUndo = useCanUndo(); const canRedo = useCanRedo();
return ( <> <button onClick={undo} disabled={!canUndo}> ↩️ Undo </button> <button onClick={redo} disabled={!canRedo}> ↪️ Redo </button> </> );}

You can also choose to pause undo/redo history when a single gesture should count as a single undo step. For example, when a user drags a shape across a canvas—it moves 200 pixels, but you wouldn’t want to press undo 200 times. Pausing history allows you to merge this drag action into one undo action.

import { useHistory, useMutation } from "@liveblocks/react/suspense";
function Shape({ index }: { index: number }) { const { pause, resume } = useHistory();
const moveShape = useMutation(({ storage }, x: number, y: number) => { const shape = storage.get("shapes").get(index); shape.update({ x, y }); });
return ( <ShapeComponent onDragStart={() => pause()} onDragEnd={() => resume()} onDragMove={moveShape} /> );}

You can also completely disable undo/redo history, if you’d prefer actions not to be recorded. Learn more about the undo/redo hooks.

Permissions

Liveblocks provides a powerful built-in permissions system, allowing you to control which users, groups, and organizations can read and write to your document. This is particularly helpful for creating share dialogs, a proven way to increase MAU, like you’d find in Google Docs or Notion.

Your browser does not support the video tag.Share dialog

Share dialog in the Next.js Starter Kit

When users connect to Liveblocks, they are assigned a userId, groupIds, and more. You can then use these to control access to your document when creating a room. In the snippet below, Olivier has full access, but the design team can only read and not write.

await liveblocks.createRoom("document-a", {  // The design team has read-only access  groupsAccesses: {    "design-team": ["*:read"],  },
// This user has full access usersAccesses: { olivier: ["*:write"], },});

You can also create workspaces, and update permissions for a room at any time. Learn more about Permissions.

Sync integrates into popular tools

You don’t need to build your application from scratch to use Sync, it plugs directly into the libraries you’re already using. Each integration adds multiplayer editing and presence around the library’s existing APIs, so you keep your current setup, and we handle the collaboration.

Rich-text editors

Add Google Docs-style editing to various rich-text editors, including Tiptap, BlockNote, Lexical, ProseMirror, Slate, Quill, and SuperDoc. Each editor has different strengths and abilities, for example, BlockNote comes with built-in block-based editing, whereas SuperDoc enables collaborative .docx editing.

Your browser does not support the video tag.Collaborative .docx editing with SuperDoc

Editing a .docx file in the Collaborative SuperDoc editor example

Code editors

Build collaborative coding experiences with CodeMirror, which we now support out of the box, and Monaco, the editor that powers VS Code. Ideal for AI code generation, technical interviews, and pair programming, with each user’s cursor and selection visible as they type.

Your browser does not support the video tag.Code editor

Editing with CodeMirror in the AI Slideshow example

Canvases

Make whiteboards and drawing canvases multiplayer with Tldraw. Users and agents can sketch, move shapes, and annotate the same board at once, with every change merged conflict-free.

Your browser does not support the video tag.Example of a collaborative canvas

Multiplayer editing in the Tldraw Whiteboard example

Flowcharts

Build collaborative diagrams and node-based editors with React Flow. Drag nodes, draw connections, and watch others’ cursors edit the flow in realtime—ideal for creating workflow builders.

Your browser does not support the video tag.Example of a collaborative flowchart

AI and human collaboration in the AI Flowchart example

Data grids

Turn Handsontable and AG Grid into collaborative spreadsheets. Users can edit cells simultaneously, see who’s working where, and leave contextual comments on rows and cells.

Your browser does not support the video tag.Example of a collaborative table

Storage and Presence in the Multiplayer Handsontable example

Chats

Build multiplayer AI chats with chat UI libraries like AI Elements. Every user sees messages and AI responses streamed live, and can create and switch between shared conversations.

Your browser does not support the video tag.Multiplayer AI chat built with AI Elements

Multiplayer chat in the Realtime AI Elements Chats example

Get started now

Liveblocks Sync is available today! Follow our get started guides to add realtime collaboration to your app in minutes. And if you’d like support evaluating Liveblocks Sync before starting, schedule a scoping call with our team.

Get started now

Book a scoping call