First beta release of the comment components

Published: October 26, 2026

v0.1.0

The first versioned release of @sanity/collaboration: React components for commenting on Sanity content, with threads, replies, mentions, reactions and inline comments on Portable Text. The package is in beta, so a breaking change ships in a minor version and is called out in the changelog. This release also settles the entry points and the component names used by the 0.0.0-canary builds.

Entry points

  • @sanity/collaboration: the comment data types and framework-free helpers (toPlainText, parseCommentAddress, withCommentAddress). It has no React, Sanity UI or SDK dependency, so it also runs on a server.
  • @sanity/collaboration/ui: the components and hooks, including CommentsProvider, CommentsPanel, CommentThread, Comment, CommentInput, CommentList and PortableTextComments.
  • @sanity/collaboration/sdk: the components wired to the Sanity App SDK (SDKCommentsProvider, DocumentCommentsPanel, InlineCommentsPlugin, useSDKThreadCallbacks). They read and write comments through @sanity/sdk-react/collaboration.

New features

  • Translations: CommentsProvider and SDKCommentsProvider take a labels prop (CommentsLabels) that translates every default component below them. A component's own labels and single-string props still override it. See Translate the UI text.
  • Comments panel: CommentsPanel has Open and Resolved tabs and an optional close button (onClose), and each field has an "Add a new comment thread" button above its threads.
  • Comment layout: the quote sits under the author header.
  • Inline highlights: highlights use three shades for nested threads, and only the innermost thread under the pointer hovers or selects. See Comment on Portable Text.
  • Deselecting: clicking outside a thread or pressing Escape deselects the active comment, not only clicking the panel background.

Breaking changes from the canary builds

  • Entry points: the root entry no longer re-exports the UI. Import components and hooks from @sanity/collaboration/ui, and the SDK-wired components from @sanity/collaboration/sdk.
  • Connected* is now SDK*: ConnectedCommentsProvider is SDKCommentsProvider, useConnectedThreadCallbacks is useSDKThreadCallbacks, and ConnectedThreadAction, ConnectedThreadCallbacks and ConnectedThreadCallbacksOptions are SDKThreadAction, SDKThreadCallbacks and SDKThreadCallbacksOptions.
  • CommentThreadCard is now CommentThread (with its Props, Labels and Handle types), and InlineCommentsLayer is now PortableTextComments. The data-ui attribute is now CommentThread, so update [data-ui='CommentThreadCard'] selectors.
  • Read-only: readOnly is removed from the providers and from useCommentsContext(). Pass capabilities={() => READ_ONLY_CAPABILITIES} instead, and leave out onThreadCreate to hide the add-thread buttons. canResolve now defaults to true and covers reopening too, and the new canCreate capability covers retrying a failed create.
  • Prop renames: InlineCommentHighlight's active is now selected (the data-active attribute is unchanged), and CommentTimestamp's date and editedAt are now createdAt and lastEditedAt.
  • showContentSnapshots moves from CommentsProvider to CommentsPanel.
  • CommentReactions.canReact is removed. Pass onReactionToggle to make the reactions interactive.
  • CommentList's renderFieldFooter is now renderFieldAction, and the sort prop on CommentList and CommentsPanel (and the CommentListSort type) is removed. Threads are always sorted newest activity first.
Sanity logosanity.ioAll Systems Operational© Sanity 2026
Change site theme