This February we open sourced new packages, alongside other improvements.

- [Open-source sync engine and dev server](#open-source-sync-engine-and-dev-server):
  Run & test Liveblocks locally.
- [Zen Router](#zen-router): Our open-source type-safe HTTP router for
  Cloudflare Workers.
- [New realtime data storage engine](#new-realtime-data-storage-engine): Bigger
  documents, better performance.
- [Management API](#management-api): Programmatically manage your Liveblocks
  projects.
- [Multi-tenant Next.js Starter Kit](#multi-tenant-nextjs-starter-kit): Updated
  example with organization switching.
- [AI-friendly documentation](#ai-friendly-documentation): Save tokens with our
  markdown docs for agents.

## Upgrade now [#upgrade-now]

To use the latest features, update your packages with the following command.

```bash
npx liveblocks-app upgrade
```

If you were previously on Liveblocks 3.10 or below, make sure to follow our
[upgrade guides](/docs/platform/upgrading) before updating.

## Open-source sync engine and dev server [#open-source-sync-engine-and-dev-server]

This February marked a shift in how we develop at Liveblocks, moving towards an
open-source-by-default approach. In the first step of this journey, we open
sourced the Liveblocks sync engine and dev server, allowing you to run and test
your multiplayer applications with a local Liveblocks server.

<Figure>
  <MuxVideo
    playbackId="X9OPbQekFzciskBNaARGH9Yo5wiEZqyqW01d7XV36bIs"
    alt="Dev server running locally"
    static={true}
  />
</Figure>

This release includes open sourcing the server that powers Liveblocks Storage
and Yjs in our back end. We also have new documentation on the
[dev server](/docs/tools/dev-server), and how to set up
[Continuous Integration (CI)](/docs/guides/how-to-set-up-continuous-integration-ci-testing)
and
[End-to-End (E2E)](/docs/guides/how-to-set-up-end-to-end-e2e-testing-with-playwright)
testing.

<ButtonLink
  href="/blog/open-sourcing-the-liveblocks-sync-engine-and-dev-server"
  size="lg"
>
  Learn more
</ButtonLink>

## Zen Router [#zen-router]

We also open sourced a second package in February,
[Zen Router](https://zenrouter.liveblocks.io), an opinionated HTTP router that’s
powered Liveblocks for the past two years, handling billions of requests per
month.

```ts title="Create a Zen Router instance"
import { ZenRouter } from "@liveblocks/zenrouter";

const zen = new ZenRouter({
  authorize: async ({ req }) => {
    const user = await __getSession__(req);
    return { user };
  },
});

export default zen;
```

It features typed path params, built-in body validation, and a clean model for
auth. Here’s an example of a simple `GET` route handler, returning the `user`
returned above, and `postId` from the path params.

```ts title="Define a route"
zen.route(
  "GET /api/posts/<postId>",

  async ({ p, auth }) => {
    const post = await __getPostByUser__(auth.user, p.postId);

    if (!post) {
      abort(404);
    }

    return { id: post.id, title: post.title };
  }
);
```

Zen Router is useful in any project that needs an HTTP router, and is compatible
with Cloudflare Workers, Bun, Node.js, and every other modern JavaScript
runtime.

<ButtonLink
  href="/blog/introducing-zen-router-our-open-source-type-safe-router-compatible-with-cloudflare-workers"
  size="lg"
>
  Learn more
</ButtonLink>

## New realtime data storage engine [#new-realtime-data-storage-engine]

New Liveblocks rooms now use a completely rewritten realtime data storage engine
for
[Liveblocks Storage](/docs/ready-made-features/multiplayer/sync-engine/liveblocks-storage)
and [Yjs](/docs/ready-made-features/multiplayer/sync-engine/liveblocks-yjs)
under the hood, which has a number of benefits:

- Support for much larger documents preventing out of memory crashes.
- Quicker initial load times, especially for sizable documents.
- Higher limits and lower transmission overhead.

We’ve been using the new engine internally since 2025, and were confident to
make the switch public, which has proved seamless. No changes are required on
your end—you’re already taking advantage of it.

<ButtonLink href="/docs/guides/about-the-new-storage-engine" size="lg">
  Learn more
</ButtonLink>

## Management API [#management-api]

Enterprise customers can now access our new Management API, allowing you to
programmatically manage your Liveblocks projects, API keys, and webhooks. This
means you can handle dashboard operations directly from your codebase. Here’s a
few examples of new APIs.

```bash title="List all projects"
curl -X GET "https://api.liveblocks.io/v2/management/projects"
```

```bash title="Roll a secret key"
curl -X POST "https://api.liveblocks.io/v2/management/projects/{projectId}/api-keys/secret/roll"
```

```bash title="Delete a webhook"
curl -X DELETE "https://api.liveblocks.io/v2/management/projects/{projectId}/webhooks/{webhookId}"
```

In total, 21 management APIs have been added. If you’d like to access these
APIs, [reach out to us](/contact/sales) to enable it on your team. Find more
information in our new documentation.

<ButtonLink href="/docs/platform/management-api" size="lg">
  Learn more
</ButtonLink>

## Multi-tenant Next.js Starter Kit [#multi-tenant-nextjs-starter-kit]

We’ve updated our [Next.js Starter Kit](/nextjs-starter-kit) to support
multi-tenancy, using our recently released
[Organizations](/docs/authentication/organizations) feature. With Organizations,
Liveblocks resources can be fully compartmentalized into different workspaces.
For example, each organization has its own set of rooms and notifications inbox.

<Figure caption="Switching between organizations, each with its own notifications and documents">
  <MuxVideo
    playbackId="5kW5alfQJKR59NndPZ63hL345y4rm00Emacj00Bcl5WfU"
    alt="Starter kit inboxes blog"
    static={true}
  />
</Figure>

Additionally, this makes it even simpler to create share menus with workspace
permissions, like you’d expect to see in modern SaaS applications.

<Figure caption="Granting access to an organization and allowing users to edit">
  <MuxVideo
    playbackId="6Hr902uWc4DUIpq300TxfqObA0002kygoTyMvM1O02jrOPFU"
    alt="Starter kit orgs short blog"
    static={true}
  />
</Figure>

The Next.js Starter Kit is a realistic example of how to build a complete
multi-tenant application with Liveblocks, and you can download it now to inspect
it yourself.

```bash title="Download the Next.js Starter Kit"
npx create-liveblocks-app@latest --nextjs
```

<ButtonLink href="/docs/tools/nextjs-starter-kit" size="lg">
  Learn more
</ButtonLink>

## AI-friendly documentation [#ai-friendly-documentation]

We’ve optimized our docs for AI, allowing agents to view a stripped down
markdown representation of any page, saving precious tokens. Agents such as
Claude Code request markdown content, and Liveblocks docs now support this.
Additionally, adding `.md` to the end of any page will also return markdown.

<Figure>
  <MuxVideo
    playbackId="vN6fdEsqQHxB1Q6qTXLJ4HbTZ00dfGkrAh31svnyE7Pc"
    alt="Docs markdown blog"
    static={true}
  />
</Figure>

If you’d like to access our markdown docs programmatically, use the
`"Accept: text/markdown"` header, for example with cURL.

```bash
curl -H "Accept: text/markdown" https://liveblocks.io/docs/concepts
```

## Minor improvements [#minor-improvements]

- Fix paginated hooks (`useThreads`, `useInboxNotifications`, and `useAiChats`)
  stopping pagination after the first `fetchMore()` call when auto-paginating in
  a `useEffect`.
- Fix text size in Next.js Starter Kit on mobile devices. Thank you
  [@chrrrs](https://github.com/chrrrs)!
- Support for selecting the preferred engine when entering new rooms:
  `client.enterRoom("my-new-room", { engine: 2 })`
- Internal protocol optimizations to support larger storage documents
- Add new config option `createClient({ baseUrl: "https://..." })` to allow
  connecting to the
  [Liveblocks dev server](https://liveblocks.io/docs/tools/dev-server)
- Improve `LiveList` performance when processing large batches of operations
- Improve `LiveList.push()` efficiency to prevent unbounded position string
  growth over time
- Fix crash when clearing documents with a large number of keys
- Remove the `largeMessageStrategy` client option. The WebSocket message limit
  has been increased from 1 MB to 32 MB, making this setting obsolete.
- Support for selecting the preferred engine when entering new rooms:
  `<RoomProvider id="my-new-room" engine={2}>...</RoomProvider>`
- Add new config option `<LiveblocksProvider baseUrl="https://..." />` to allow
  connecting to the
  [Liveblocks dev server](https://liveblocks.io/docs/tools/dev-server)
- Exclude marking a thread or inbox notification as read from blocking
  navigation when `preventUnsavedChanges` is enabled.
- Portaled elements now respect the `portalContainer` option from
  `@liveblocks/react-ui`’s `LiveblocksUiConfig` instead of always using
  `document.body`.
- Support for selecting the preferred engine when entering new rooms:
  `enterRoom("my-new-room", { engine: 2 })`
- Add new `.setPresence()` method to set ephemeral presence for a user in a room
  via the REST API, without requiring a WebSocket connection
- Deprecated `tenantId` parameter in client methods, use `organizationId`
  instead.
- New page:
  [Multi-Factor Authentication](https://liveblocks.io/docs/platform/account-management/mfa).
- New guide:
  [The new Storage engine and its benefits](https://liveblocks.io/docs/guides/about-the-new-storage-engine).
- Updated
  [overview information on Storage](https://liveblocks.io/docs/ready-made-features/multiplayer/sync-engine/liveblocks-storage).
- Updated
  [overview information on Yjs](https://liveblocks.io/docs/ready-made-features/multiplayer/sync-engine/liveblocks-yjs).
- We added
  [Multi-Factor Authentication (MFA)](https://liveblocks.io/docs/platform/management-api)
  support. Users can now enable MFA in their account personal settings for
  enhanced security.
- New toggle to opt-in to use v2 Storage engine for all new rooms created going
  forward.
- Add dev server guide to all fully-supported example READMEs.
- Replace `y-tiptap` with `y-prosemirror` to prevent plugin key conflict, which
  was causing change source to be incorrectly set in BlockNote.
- Fix an issue where `FloatingComposer` wouldn’t auto-focus and
  `FloatingToolbar` would conflict with it.
- Fixed BlockNote example.
- Updated Nuxt example.
- Update Next.js authentication guides to use `.env.local`.
- New item:
  [Multiplayer table](https://liveblocks.io/showcase/multiplayer-table).

### Upgrade

To use these latest features, update your packages with:

```bash
npx liveblocks upgrade
```

## Contributors [#contributors]

<Contributors
  gitHubUsernames={[
    "bxff",
    "chrrrs",
    "ctnicholas",
    "flowflorent",
    "jrowny",
    "marcbouchenoire",
    "nimeshnayaju",
    "nvie",
    "pierrelevaillant",
    "sugardarius",
  ]}
/>