• Week 12
    WEEK12

    v2.22.0

    • Added pagination support to .getInboxNotifications(). See docs.

    • New method .getOrCreate() which combines .getRoom() and .createRoom(). See docs.

    • New method .upsertRoom() which combines .updateRoom() and .createRoom(). See docs.

    • New method .iterRooms() which is like .getRooms() except pagination happens automatically. See docs.

    • New method .iterInboxNotifications() which is like .getInboxNotifications() except pagination happens automatically. See docs.

    • New method .mutateStorage() which can be used to make changes to Storage from your backend. See docs.

    • New method .massMutateStorage() which can be used to make changes to Storage for multiple rooms simultaneously. See docs.

    • Updated method .deleteRoom() to no longer throw when the room already does not exist. See docs.

    • Add new icons to <Icon.* />.

    • Implement a new core logic for thread notification event.

    • Mark htmlBody from prepareThreadNotificationEmailAsHtml and reactBody from prepareThreadNotificationEmailAsReact as deprecated. Use body property instead.

    v2.21.0

    • New package to support using BlockNote with Liveblock’s comments, mentions, and realtime collaboration out of the box.

    • Fix markThreadAsResolved and markThreadAsUnresolved methods not passing user ID correctly to the corresponding backend endpoints.

    • Improve emoji picker’s performance, bundle size, and add a preview of the currently selected emoji.

      • This is the result of us moving the emoji picker to its own package and improving it in the process. You can also combine this package with the primitives to build your own reaction picker for example.
    • Improve and fix pasting HTML into the composer.

    REST API

    • The Delete Room endpoint will no longer return a 404 when a room already did not exist before.

    Examples

    Documentation

    Website

    Contributors

    Contributors include:jrownynimeshnayajumarcbouchenoirepierrelevaillantctnicholasnviesugardarius

    7 authors

  • Week 11
    WEEK11

    Documentation

    Website

    Contributors

    Contributors include:ctnicholasmarcbouchenoirepierrelevaillant

    3 authors

  • Week 10
    WEEK10

    v2.20.0

    • Implement a proxy factory for UserNotificationSettings object to return null to prevent any errors when accessing a disabled notification channel.

    • Implement a proxy factory for UserNotificationSettings object to return null to prevent any errors when accessing a disabled notification channel.

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

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

    v2.19.0

    • Output ES modules by default (but CJS builds are still included)

    • Modernize internal build tool settings

    • Allow passing optional AbortSignal to all client methods

    • Fix bug in encoding of error information in the LiveblocksError when an API call fails (thanks for reporting, @robcresswell!)

    • Fix getStorageDocument("my-room", "json") typing in its output LiveMap instances as ReadonlyMap instead of serialized plain objects.

    Documentation

    • New guide: How to create a notification settings panel.
    • Improved Notifications overview 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.

    Examples

    Website

    Upkeep

    • Ship all Liveblocks packages as ESM by default (but CJS builds are still included)
    • Modernized internal build tool settings

    Contributors

    Contributors include:ctnicholasnviemarcbouchenoirenimeshnayajusugardariusstevenfabrepierrelevaillant

    7 authors

  • Week 8
    WEEK8

    v2.18.3

    • Fix HTML escaping in stringifyCommentBody utility.

    • Log more details in specific error cases to help debugging

    • Fix HTML escaping in stringifyCommentBody utility.

    • Increases the allowed stale time for polled user threads data. Only affects the useUserThreads_experimental hook.

    • Allow spaces and more non-alphanumeric characters when creating mentions in Comments composers.

    • Fix HTML escaping in prepare as HTML functions. Thank you @huy-cove!

    • Revert deduplication logic introduced in v2.18.0 as it provided no measurable benefits while increasing complexity.

    v2.18.2

    • Improve performance of undo/redo operations on large documents. Thank you @rudi-c!

    • Fix a performance regression introduced in 2.18.1.

    Documentation

    • Added info on how data storage is calculated.
    • Fixed a number of broken links on various pages.

    Dashboard

    • Internal refactoring and code clean up.

    Website

    Contributors

    Contributors include:ctnicholasnviemarcbouchenoirenimeshnayajusugardariushuy-coverudi-c

    7 authors

  • Week 7
    WEEK7

    v2.18.1

    v2.18.0

    Introducing user notification settings. You can now create beautiful user notification settings pages in your app.

    Our packages @liveblocks/client, @liveblocks/react and @liveblocks/node are now exposing functions to manage user notification settings on different notification channels and kinds.

    You can support thread, textMention and custom notification kinds (starting by a $) on email, Slack, Microsoft Teams and Web Push channels.

    You can choose from our new notifications dashboard page to enable or disable notification kinds on every channels you want to use in your app. It means our internal notification system on our infrastructure will decide to send or not an event on your webhook.

    We're adding two new methods in our client to get and update user notification settings:

    import { createClient } from '@liveblocks/client'const client = createClient({ ... })
    const settings = await client.getNotificationSettings();// { email: { thread: true, ... }, slack: { thread: false, ... }, ... }console.log(settings);
    const updatedSettings = await client.updateNotificationSettings({ email: { thread: false, }});

    We're adding a new set of hooks to manage user notification settings.

    You can either choose useNotificationSettings if you need to get the current user notification settings and update them at the same time:

    // A suspense version of this hook is availableimport { useNotificationSettings } from "@liveblocks/react";
    const [{ isLoading, error, settings }, updateSettings] = useNotificationSettings();// { email: { thread: true, ... }, slack: { thread: false, ... }, ... }console.log(settings);
    const onSave = () => { updateSettings({ slack: { textMention: true, }, });};

    Or you can choose useUpdateNotificationSettings if you just need to update the current user notification settings (e.g an unsubscribe button):

    // A suspense version of this hook is availableimport { useUpdateNotificationSettings } from "@liveblocks/react";
    const updateSettings = useUpdateNotificationSettings();
    const onUnsubscribe = () => { updateSettings({ slack: { thread: false, }, });};

    Our Node.js client now exposes three new methods to manage user notification settings:

    import { Liveblocks } from "@liveblocks/node";const liveblocks = new Liveblocks({ secret: "sk_xxx" });
    const settings = await liveblocks.getNotificationSettings({ userId });// { email: { thread: true, ... }, slack: { thread: false, ... }, ... }console.log(settings);
    const updatedSettings = await liveblocks.updateNotificationSettings({ userId, data: { teams: { $fileUploaded: true, }, },});await liveblocks.deleteNotificationSettings({ userId });

    Examples

    Documentation

    Website

    Dashboard

    • Added new Notifications page to projects, allowing you to enable/disable webhooks events for different notification kinds, on different channels.

    Infrastructure

    • Preparing foundation in the backend to make Storage more efficient in the future.

    Contributors

    Contributors include:ctnicholaspierrelevaillantflowflorentsugardariusjrownymarcbouchenoirenvie

    7 authors

  • Week 6
    WEEK6

    v2.17.0

    • Report a console error when a client attempts to send a WebSocket message that is >1 MB (which is not supported). Previously the client would silently fail in this scenario.

    • Added a new client config option largeMessageStrategy to allow specifying the preferred strategy for dealing with messages that are too large to send over WebSockets. There now is a choice between:

      • default Don’t send anything, but log the error to the console.
      • split Split the large message up into smaller chunks (at the cost of sacrificing atomicity). Thank you @adam-subframe!
      • experimental-fallback-to-http Send the message over HTTP instead of WebSocket.
    • Deprecated the unstable_fallbackToHTTP experimental flag (please set largeMessageStrategy="experimental-fallback-to-http" instead).

    • Added <LiveblocksProvider largeMessageStrategy="..." /> prop to LiveblocksProvider. See above for possible options.

    • Fix crash when a Composer is unmounted during its onComposerSubmit callback.

    • Add new icons to <Icon.* />.

    This release adds components and utilities to add an AI toolbar to your text editor, available in private beta.

    • Add ai option to useLiveblocksExtension to enable (and configure) it.
    • Add <AiToolbar /> component. (with <AiToolbar.Suggestion />, <AiToolbar.SuggestionsSeparator />, etc)
    • Add default AI buttons in Toolbar and FloatingToolbar when the ai option is enabled.
    • Add askAi Tiptap command to manually open the toolbar, it can also be invoked with a prompt to directly start the request when opening the toolbar. (e.g. editor.commands.askAi("Explain this text"))

    Documentation

    Website

    Contributors

    Contributors include:jrownyctnicholasnviemarcbouchenoiresugardariusadam-subframe

    6 authors

  • Week 5
    WEEK5

    v2.16.2

    • Improve error message if hooks are accidentally called server side.

    • Fix bug in Zustand typing in case the multi-argument form of set() is used. Thank you @hans-lizihan!

    Website

    Documentation

    • Better info on initialStorage values.

    Contributors

    Contributors include:ctnicholasstevenfabresugardariusnviehans-lizihan

    5 authors

  • Week 4
    WEEK4

    v2.16.1

    • <Toolbar.Button /> and <Toolbar.Toggle /> now display their name visually if children and icon aren’t set.

    Documentation

    • Added missing 409 response to Initialize Storage REST API.
    • Typo fixed in custom notification snippet.

    Contributors

    Contributors include:jltimmctnicholasmarcbouchenoire

    3 authors

  • Week 3
    WEEK3

    v2.16.0

    We've created new toolbar elements that allow you to import a default floating toolbar in Tiptap and Lexical. It's also possible to use these APIs to build custom or static toolbars. We've updated a number of our examples to show how to do this.

    Our error listener APIs will now receive more errors in general, including errors from using Comments & Notifications. Previously, these would only receive room connection errors from Presence, Storage, or Yjs. For example, now when creation of a thread fails, deletion of a comment fails, marking a notification as read fails, etc.

    // ❌ Before: required a RoomProvider and would only notify about errors for that room// ✅ Now: requires a LiveblocksProvider and will notify about errors for any roomuseErrorListener((err: LiveblocksError) => {  /* show toast, or notify Sentry, Datadog, etc */});

    See the Upgrade Guide for 2.16 to learn how to adapt your code.

    We now support filtering threads by absence of metadata as well in useThreads({ query }) (or useUserThreads_experimental({ query })). For example, you can now filter threads that do not have a color attribute set in their metadata:

    useThreads({  query: {    // Filter any "pinned" threads that don't have a color set    metadata: {      pinned: true,      color: null, // ✨    },  },});

    See the Upgrade Guide for 2.16 to learn how to adapt your code.

    • Automatically refresh Comments and Notifications when the browser window regains focus.

    The error listener APIs will now receive more errors in general, including errors from using Comments & Notifications. Previously, these would only receive room connection errors from Presence, Storage, or Yjs.

    // 👌 Same as before, but might now also receive errors related to Comments & Notificationsroom.subscribe("error", (err) => { ... });
    • Most of the icons used in the default components are now usable as <Icon.* /> via import { Icon } from "@liveblocks/react-ui".

    • Add <Toolbar /> and <FloatingToolbar /> components to simplify building editor toolbars. They come with default controls out-of-the-box based on what the editor they’re attached to supports, but they’re also heavily extendable and customizable. Use inner components like <Toolbar.Toggle /> and <Toolbar.Separator /> to extend the defaults with your own actions, or start from scratch while customizing some of the defaults via <Toolbar.SectionInline /> or <Toolbar.BlockSelector /> for example.

    • Add isTextFormatActive and isBlockNodeActive utilities.

    Examples

    Dashboard

    • Allow rate limit configuration for webhook endpoints.
    • Fix download comments attachments action in text editor view from room detail page.

    Contributors

    Contributors include:jrownysugardariusctnicholasnviemarcbouchenoire

    5 authors

  • Week 2
    WEEK2

    2.15.2

    • Fix useLayoutEffect warnings when using React versions lower than 18.3.0 and SSR.

    • Fix memory leak in some hooks.

    • Fix bug where querying metadata with useThreads() would not always reuse the cache correctly.

    Website

    Contributors

    Contributors include:ctnicholasnviemarcbouchenoire

    3 authors

We use cookies to collect data to improve your experience on our site. Read our Privacy Policy to learn more.