• 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

New React components for adding realtime presence and contextual commenting to your app

Introducing a new set of ready-made React components, designed to help you start integrating realtime collaboration and commenting into your product.

Picture of Marc BouchenoirePicture of Chris Nicholas
Marc Bouchenoire, Chris Nicholas on March 10th
New React components for adding realtime presence and contextual commenting to your app
March 10th·5 min read
  • Picture of Marc BouchenoireMarc Bouchenoire
  • Picture of Chris NicholasChris Nicholas
Share article
Product updatesCollaborationComponents

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

  • Introducing Liveblocks Sync: the sync engine for the agentic web

    Introducing Liveblocks Sync: the sync engine for the agentic web

    Picture of Chris Nicholas
    September 1st
    Updates
  • 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

Today we're introducing a new set of ready-made React components, designed to help you start integrating realtime collaboration into your product.

  • <AvatarStack />: A realtime list of avatars representing connected users.
  • <Cursors />: A set of realtime cursors for other users in the room.
  • <Cursor />: A single customizable cursor component.
  • <CommentPin />: An avatar pin useful for toggling pop-up threads.
  • <FloatingComposer />: A pop-up composer for creating threads.
  • <FloatingThread />: A pop-up comment thread.

Additionally, we've written a new set of Next.js get started guides to help you use them in various scenarios.

  • Draggable comments: Add a 2D canvas of draggable comments.
  • Table comments: Add pop-up comments to your AG Grid or HTML table.
  • Presence: Add live cursors and avatar stacks to your product.

Components

<AvatarStack />

Displays an overlapping stack of avatars representing users currently present in the room. It updates in realtime as users connect and disconnect.

import { AvatarStack } from "@liveblocks/react-ui";
function Component() { return ( <AvatarStack max={4} size={48} /> );}

Features

  • Pop-up username when hovering over an avatar.
  • Define how many avatars should be shown before grouping the rest.
  • Optionally add offline users to the stack, such as those previously connected.

Learn more in our documentation: AvatarStack.

<Cursors />

Displays a realtime multiplayer cursor for every other user connected to the room.

import { Cursors } from "@liveblocks/react-ui";
function Component() { return ( <Cursors> <YourCanvas /> </Cursors> );};

Features

  • Smooth movement using spring interpolation.
  • Cursors positioned relative to their container using percentage coordinates.
  • Avoids performance bottlenecks caused by re-renders and layout thrashing.

Learn more in our documentation: Cursors.

<Cursor />

Displays a styled multiplayer cursor, helpful for building custom realtime cursors with useOthers.

Charlie
import { Cursor } from "@liveblocks/react-ui";
function Component() { return ( <Cursor label="Charlie" color="#e8d930" /> );};

Features

  • Customizable background color and label.
  • Text color is automatically adjusted to contrast with the background color.
  • Has a height and width of 0px making it easy to position accurately.

Learn more in our documentation: Cursor.

<CommentPin />

Displays a comment pin that can be used anywhere in your UI, or as a trigger to open pop-up threads.

import { CommentPin } from "@liveblocks/react-ui";
function Component() { return ( <CommentPin userId="nova-ai" size="48px" corner="bottom-left" /> );};

Features

  • Displays an avatar inside the pin when userId is provided.
  • Define which corner the pin should point to, such as "top-left".
  • Can be used as a trigger for FloatingComposer and FloatingThread.

<FloatingComposer />

Displays a floating thread composer alongside a trigger element, such as a button. Clicking the trigger opens the composer, and clicking outside closes it.

import { FloatingComposer } from "@liveblocks/react-ui";
function Component() { return ( <FloatingComposer side="bottom" align="center" sideOffset={12} alignOffset={0} > <button>Trigger</button> </FloatingComposer> );};

Features

  • Use any React component as a trigger or opt for our pre-built CommentPin.
  • Define positioning, offset, and alignment relative to the trigger.
  • Combine with FloatingThread to display the created thread.

Learn more in our documentation: FloatingComposer.

<FloatingThread />

Displays a floating comment thread alongside a trigger element, such as a button. Clicking the trigger opens the thread, and clicking outside closes it.

import { FloatingThread } from "@liveblocks/react-ui";
function Component() { return ( <FloatingThread thread={thread} side="bottom" align="center" sideOffset={12} alignOffset={0} > <button>Trigger</button> </FloatingThread> );};

Features

  • Use any React component as a trigger or opt for our pre-built CommentPin.
  • Define positioning, offset, and alignment relative to the trigger.
  • Combine with FloatingComposer to display a composer to create a thread.

Learn more in our documentation: FloatingThread.

Use cases

Draggable comments

Using FloatingThread and CommentPin together, you can create a canvas-like UI with draggable comment pins, like in the live demo below.

Loading

Our Next.js Canvas Comments example

This works by taking x and y coordinates for each thread, storing them on thread metadata, and then using them to position the comment pin. CommentPin works as the trigger for each FloatingThread.

function DraggableComments() {  const { threads } = useThreads();
return threads.map((thread) => ( <FloatingThread key={thread.id} thread={thread}> <CommentPin userId={thread.comments[0]?.userId} style={{ position: "absolute", left: thread.metadata.x, top: thread.metadata.y, }} /> </FloatingThread> ));}

Learn how to get started with draggable comments in Next.js.

Table comments

By adding FloatingComposer and FloatingThread to a table you can enable users to leave comments on individual cells.

Loading

Our Next.js Comments AG Grid example

Each cell is passed a rowId and columnId which is used in thread metadata to render comments attached the cell using FloatingThread. If a thread isn’t found for the cell, then FloatingComposer is displayed, allowing the user to create a new thread with this metadata.

function TableCellComment({ threads, rowId, columnId }) {  const thread = threads.find(    ({ metadata }) => metadata.rowId === rowId && metadata.columnId === columnId  );
if (!thread) { return ( <FloatingComposer metadata={{ rowId, columnId }}> <button>➕ Add comment</button> </FloatingComposer> ); }
return ( <FloatingThread thread={thread}> <img src={thread.comments[0]?.userId} alt="User avatar" /> </FloatingThread> );}

Learn how to get started with commenting in HTML tables and AG Grid.

Presence

Using AvatarStack and Cursors together, you can create real live presence in your product.

Loading

Our Next.js Live Avatars example.

This works by setting up user authentication then simply importing the components, wrapping your main content within Cursors.

function Layout({ children }) {  return (    <div>      <header>        Untitled document        <AvatarStack max={3} size={32} />      </header>      <main>        <Cursors>{children}</Cursors>      </main>    </div>  );}

Learn how to get started with presence in Next.js.

Upgrade

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

$npx liveblocks upgrade

If you were previously on Liveblocks 3.10 or below, make sure to follow our upgrade guides before updating.

Contributors

Contributors include:marcbouchenoirectnicholas

2 authors