This February we’ve released new APIs for notifications, text editing, and
stability.

- [User notification settings](#user-notification-settings): Allow end users to
  configure their notifications.
- [Modify Tiptap from the server](#modify-tiptap-from-the-server) - Read & edit
  text documents from Node.js.
- [Various API improvements](#various-api-improvements) - Providing better
  stability to Yjs and WebSockets.
- [New content from our engineers](#new-content-from-our-engineers) - Valuable
  blog posts from our experts.

## 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.

## User notification settings [#user-notification-settings]

When using [Liveblocks Notifications](/notifications), your end users can now
individually configure which notifications should be sent outside your
application, and on which channel, for example via email, Slack, Microsoft
Teams, and Web Push. We’ve also released new React hooks that make it easy to
[create a user notifications panel](/docs/guides/how-to-create-a-notification-settings-panel)
in your application.

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

Users will be able to choose which notifications to receive, and on which
channel—for example, one user may wish to receive new comment notifications via
email, but not via Slack. This works by changing which webhook events are sent
by which user, allowing you to handle each separately. Both custom and
Liveblocks notifications are supported.

### Dashboard

We’ve also created a new dashboard page that allows you to configure
notifications webhooks for your users, including setting a default value.

<Figure>
  <video autoPlay loop muted playsInline>
    <source
      src="/images/blog/notification-settings/notifications-dashboard.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:
[Configure each user’s notification settings for email, Slack, and more](/blog/configure-each-users-notifications-settings-for-slack-email-and-more).

<UniversalLink href="/blog/a-better-way-to-email-your-users-about-unread-content">
  <Figure>
    <Image
      src="/images/blog/social-images/a-better-way-to-email-your-users-about-unread-content.jpg"
      alt="Liveblocks Emails blog post"
      width={750}
      height={394}
      quality={95}
    />
  </Figure>
</UniversalLink>

## Modify Tiptap from the server

You can now edit your Tiptap, ProseMirror, and BlockNote state from the server.
Our latest text editor package has methods for initializing content, fetching
state, and more. For example, here’s how to insert a line of text into a
document.

```ts
import { Liveblocks } from "@liveblocks/node";
import { withProsemirrorDocument } from "@liveblocks/node-prosemirror";

const liveblocks = new Liveblocks({
  secret: "{{SECRET_KEY}}",
});

await withProsemirrorDocument(
  { roomId: "your-room-id", client: liveblocks },
  async (api) => {
    await api.update((doc, tr) => {
      return tr.insertText("Hello world");
    });
  }
);
```

You may notice that this package is called
[`@liveblocks/prosemirror`](/docs/api-reference/liveblocks-node-prosemirror),
but can be used for Tiptap and BlockNote. This is because these editors extend
ProseMirror, and in terms of APIs, a ProseMirror extension makes the most sense
for server-side editing.

Here’s another snippet, showing how to fetch your editor content as markdown.

```ts
const markdown = await withProsemirrorDocument(
  { roomId: "my-room-id", client: liveblocks },
  async (api) => {
    return api.toMarkdown();
  }
);

// # Hello world
//
// _This_ is a **paragraph**
console.log(markdown);
```

Make sure to read our
[`@liveblocks/node-prosemirror`](/docs/api-reference/liveblocks-node-prosemirror)
to learn more. We’ve also spent time improving our
[`@liveblocks/node-lexical`](/docs/api-reference/liveblocks-node-lexical)
documentation, if you’d like to edit your Lexical documents from the server
instead.

### Which text editor framework?

If you’re curious about different text editor frameworks, we’ve written a new
guide that compares the features of a number of editors, highlighting the
important parts. Read it now—
[Which rich text editor framework should you choose in 2025?](/blog/which-rich-text-editor-framework-should-you-choose-in-2025)

## Various API improvements [#various-api-improvements]

We’ve made some API improvements recently, solving a couple of tricky bugs.

### Improved Yjs integration

In some applications, Yjs documents would desynchronize at times, particularly
when dynamically switching between rooms. We’ve added a new function that solves
these issues, cleaning up Yjs correctly on page transitions. We now recommend
using this method to connect to our Yjs server in all frameworks.

```tsx
import { getYjsProviderForRoom } from "@liveblocks/yjs";

// Recommended way to set up Yjs
const yProvider = getYjsProviderForRoom(client, room);
const yDoc = provider.doc;
```

If you’ve been having any problems with Yjs, we recommend you upgrade and start
using
[`getYjsProviderForRoom`](/docs/api-reference/liveblocks-yjs#getYjsProviderForRoom)
now. You can learn more in the
[Setup section](/docs/api-reference/liveblocks-yjs#Setup) of our API reference.

### Handling large WebSocket messages

Internally, Liveblocks uses WebSockets, and there’s always been a technical
limit on how large WebSocket messages can be, which meant especially large
updates were not synced correctly. We’ve had an experimental feature for a while
that will send large messages over HTTP, but we now have another more reliable
option.

The new strategy is called `split`, and it’ll split large messages into smaller
chunks. We’ve added a new `largeMessageStrategy` option to
[`LiveblocksProvider`](/docs/api-reference/liveblocks-react#LiveblocksProvider)
and [`createClient`](/docs/api-reference/liveblocks-client#createClient) that
can enable this feature.

```tsx
// Configure how to handle large messages
<LiveblocksProvider
  largeMessageStrategy="split"
  // ...
/>
```

## New content from our engineers

We’ve been putting a lot of effort into the [Liveblocks blog](/blog) recently,
working on writing valuable content for you, straight from our engineers.

<Slideshow
  slides={[
    {
      width: 750,
      height: 394,
      imageUrl:
        "/images/blog/social-images/choosing-the-right-text-editor-for-your-app.jpg",
      alt: "Which rich text editor framework should you choose in 2025?",
    },
    {
      width: 750,
      height: 394,
      imageUrl:
        "/images/blog/social-images/why-collaborative-features-will-define-your-products-success.jpg",
      alt: "Why collaborative features will define your product’s success",
    },
    {
      width: 750,
      height: 394,
      imageUrl:
        "/images/blog/social-images/how-to-build-an-engaging-in-app-commenting-experience.jpg",
      alt: "How to build an engaging in-app commenting experience",
    },
  ]}
/>

In February, we released three of these posts, alongside our regular updates:

- [Which rich text editor framework should you choose in 2025?](/blog/which-rich-text-editor-framework-should-you-choose-in-2025)
- [Why collaborative features will define your product’s success](/blog/why-collaborative-features-will-define-your-products-success)
- [How to build an engaging in-app commenting experience](/blog/how-to-build-an-engaging-in-app-commenting-experience)

Stay tuned—we have lots more to come!

## Minor improvements

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

- Fixed HTML escaping in email notification utilities.
- Added better error logging to help with debugging.
- Improved handling of user thread data.
- Allowed more flexible character usage when creating mentions in comment
  composers.
- Fixed several small bugs in React UI components.
- Added [`llms.txt`](/llms.txt) and [`llms-full.txt`](/llms-full.txt) files to
  our website to help AI tools better understand our product.
- Improved infrastructure for more efficient storage in the future.

### Upgrade

To use these latest features, update your packages with:

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

## Contributors

<Contributors
  gitHubUsernames={[
    "ctnicholas",
    "pierrelevaillant",
    "flowflorent",
    "sugardarius",
    "jrowny",
    "marcbouchenoire",
    "nvie",
    "huy-cove",
    "rudi-c",
    "adam-subframe",
  ]}
/>