This March we’ve released APIs for various features, and committed to security.

- [Liveblocks BlockNote](#liveblocks-blocknote): Notion-style text editing in a
  few lines of code.
- [Modify Storage from the server](#modify-storage-from-the-server): Useful for
  AI mutations & schema migrations.
- [User notification settings](#user-notification-settings): Configure each
  user‘s external notification settings.
- [Convenience methods for Node.js](#convenience-methods-for-nodejs): Simplify
  common use cases in Node.js.
- [SOC2 Type 2 and HIPAA compliance](#soc2-type-2-and-hipaa-compliance): New
  commitments to security & privacy.

## Upgrade now

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

```bash
npx create-liveblocks-app@latest --upgrade
```

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

## Liveblocks BlockNote

It’s now easier than ever to add a collaborative block-based text editor to your
app, filled with features out-of-the-box. Liveblocks BlockNote is our new
fully-hosted customizable editor, which integrates into our existing products,
such as [Comments](/comments) and [Notifications](/notifications).

<Figure>
  <video autoPlay loop muted playsInline>
    <source
      src="/images/blog/blocknote/blocknote-collab.mp4"
      type="video/mp4"
    />
  </video>
</Figure>

### Learn more in our blog post

To learn more, and to find our new examples and guides, make sure to read our
focused blog post on
[Notion-style collaborative editing with BlockNote](/blog/add-notion-style-collaborative-text-editing-to-your-app-with-liveblocks-blocknote).

## Modify Storage from the server

Our [Sync Datastore](/sync-datastore/storage) product provides you with two sync
engines that enable storing real-time document state, ideal for building
collaborative apps. One of these engines is called Storage, and is particularly
well suited for creating custom tools similar to Figma, Pitch, and Spline.

Using our [Node.js SDK](/docs/api-reference/liveblocks-node), you can now modify
Storage data from the server with
[`mutateStorage`](/docs/api-reference/liveblocks-node#mutate-storage).

```tsx
await liveblocks.mutateStorage(
  "my-room-id",

  async ({ root }) => {
    root.set("title", "New title");
  }
);
```

This is particularly exciting in the AI era, as you can request AI to make
changes to your document for your user. Below is how you may implement this with
[Vercel AI SDK](https://sdk.vercel.ai/docs/ai-sdk-reference/ai-sdk-reference),
generating a title from an article’s content.

```tsx
await liveblocks.mutateStorage(
  "my-room-id",

  async ({ root }) => {
    const article = root.get("article");

    const { text } = await generateText({
      model: yourModel,
      prompt: `Generate a title for the following article: ${article}`,
    });

    root.set("title", text);
  }
);
```

### Mass mutating Storage

We’ve also added another method, that allows you to modify Storage in multiple
rooms at once. This is particularly useful for migrating rooms to a new schema,
or for resetting a number of rooms at once. Below we’re setting a default title
property in every room.

```tsx
await liveblocks.massMutateStorage(
  {},

  async ({ room, root }) => {
    root.set("title", "Untitled");
  }
);
```

You can also use options to filter for specific rooms, learn more under
[`massMutateStorage`](/docs/api-reference/liveblocks-node#mass-mutate-storage).
Below we’re setting a title property, in realtime.

## User notification settings

Liveblocks Notifications already allows you to create an in-app notifications
inbox inside your product. When users miss any in-app notifications, Liveblocks
enables sending notifications on alternate channels, such as email, Slack,
Microsoft Teams, Web Push.

As of this month, we’ve introduced new configuration options that enable
building notification settings panels, allowing each of your end users to
individually choose which channels they should receive notifications on.

<Figure>
  <Image
    src="/images/blog/notification-settings/notification-settings.jpg"
    alt="Notification settings example in an application"
    width={768}
    height={512}
    quality={90}
  />
</Figure>

### Learn more in our blog post

To learn more, and to find our new examples and guides, make sure to read our
focused blog post on
[configuring each user’s notification settings for email, Slack, and more](/blog/configure-each-users-notifications-settings-for-slack-email-and-more).

## Convenience methods for Node.js

We’ve added a number of new methods to the Liveblocks Node.js SDK, simplifying
regular use cases. For example,
[`getOrCreateRoom`](/docs/api-reference/liveblocks-node#get-or-create-rooms-roomId)
combines `getRoom` and `createRoom` into a single method.

```tsx
// Gets a room, or creates it if it doesn't exist
const room = await liveblocks.getOrCreateRoom("my-room-id", {
  defaultAccesses: ["room:write"],
});
```

Learn more about each new method in our API reference:

- [`getOrCreateRoom`](/docs/api-reference/liveblocks-node#get-or-create-rooms-roomId)
- [`upsertRoom`](/docs/api-reference/liveblocks-node#upsert-rooms-roomId)
- [`iterRooms`](/docs/api-reference/liveblocks-node#iter-rooms)
- [`iterInboxNotifications`](/docs/api-reference/liveblocks-node#iter-users-userId-inboxNotifications)

## SOC2 Type 2 and HIPAA compliance

At Liveblocks, security and privacy have always been top priorities. We
understand that as companies integrate collaboration and AI-powered features
into their products, they need to trust that their data remains secure and
compliant with industry standards. In March, we announced that Liveblocks is now
SOC 2 Type 2 and HIPAA compliant, reinforcing our commitment in this area.

<Figure>
  <Image
    src="/images/blog/soc2-hipaa/soc2-hipaa.jpg"
    alt="SOC2 type 2 and HIPAA compliant"
    width={768}
    height={512}
    quality={90}
  />
</Figure>

### Learn more in our blog post

Learn more about the certification process and how we acheived compliance in our
blog post about our
[SOC 2 Type 2 and HIPAA commitments](/blog/liveblocks-is-soc2-type-2-hipaa-compliant).

## Minor improvements

Here’s a list of other improvements in [our changelog](/changelog) this month:

- Optimize `.getOrCreateRoom()` and `.upsertRoom()` to only make a single
  round-trip to the server.
- Also expose `LiveObject`, `LiveMap`, and `LiveList` in `@liveblocks/node`.
- BlockNote editors are now supported in a room’s Text Editor dashboard view.
- Added pagination support to `.getInboxNotifications()`.
- Add new icons to `<Icon.* />`.
- Implement a new core logic for thread notification event.
- Improve emoji picker’s performance, bundle size, and add a preview of the
  currently selected emoji.
- Improve and fix pasting HTML into the composer.
- The Delete Room endpoint will no longer return a 404 when a room already did
  not exist before.
- Updated Comments primitives example to use Frimousse.
- Updated BlockNote example to use our new package.
- Detail building a primitive
  [emoji picker](/docs/api-reference/liveblocks-react-ui#emoji-picker) and
  [emoji reactions](/docs/api-reference/liveblocks-react-ui#emoji-reactions).
- Updated get started guides for BlockNote.
- New [BlockNote overview](/docs/ready-made-features/text-editor/blocknote)
  page.
- Allow passing optional `AbortSignal` to all Node.js methods.
- Updated method
  [`deleteRoom`](/docs/api-reference/liveblocks-node#delete-rooms-roomId) to no
  longer throw when the room already does not exist.
- Improve mentions behavior around whitespace, fixing a regression introduced in
  `v2.18.3` when we added support for whitespace _within_ mentions.
- Prevent mention suggestions from scrolling instead of flipping when there's
  enough space on the other side (e.g. moving from top to bottom).
- Improve event propagation in the formatting toolbar of `Composer`.
- Add optional `useRoom({ allowOutsideRoom: true })` option. When this option is
  set, the hook will return `null` when used outside of a room, whereas the
  default behavior of the hook is be to throw.
- Implement a proxy factory for `UserNotificationSettings` object to return
  `null` to prevent any errors when accessing a disabled notification channel.
- Ship all Liveblocks packages as ESM by default (but CJS builds are still
  included).
- Modernized internal build tool settings.
- Improved guide on
  [How to modify Liveblocks Storage from the server](/docs/guides/how-to-modify-liveblocks-storage-from-the-server).
- Add more info about text editor data being permanently stored.
- New guide:
  [How to create a notification settings panel](/docs/guides/how-to-create-a-notification-settings-panel).
- Improved [Notifications overview](/docs/ready-made-features/notifications)
  pages, adding info on user notification settings.
- Improved existing webhooks guides, adding more context about notification
  channels, and how to create a settings panel.
- More info about how Text Editor permanently stores documents, and how it's
  different to Yjs.
- New example: [Notification settings example](/examples/notification-settings).
- Improved notification settings panel in the
  [Next.js Starter Kit](/nextjs-starter-kit).
- Fix: Improve stack traces of REST API errors to include the original error
  location.
- Fix: Report text editor function’s call in `@liveblocks/react-blocknote`.
- Fix: BlockNote code snippets and add info about it in the email package.
- Fix: `markThreadAsResolved` and `markThreadAsUnresolved` methods not passing
  user ID correctly to the corresponding backend endpoints.

### Upgrade

To use these latest features, update your packages with:

```bash
npx create-liveblocks-app@latest --upgrade
```

## Contributors

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