Core SDK
Comments & threads
Pinned comments on a location. Chat replies are a different hook.
Pins on a canvas (x, y, a quote) live in /comment-threads. Chat replies are parentId on the message log. See chat reply threads.
REST
GET /rooms/:roomId/comment-threads
POST /rooms/:roomId/comment-threads { body, metadata }
POST /rooms/:roomId/comment-threads/:id/comments { body }
PATCH /rooms/:roomId/comment-threads/:id/comments/:commentId { body }
DELETE /rooms/:roomId/comment-threads/:id/comments/:commentId
PATCH /rooms/:roomId/comment-threads/:id { resolved, metadata }
DELETE /rooms/:roomId/comment-threads/:id
POST /rooms/:roomId/comment-threads/:id/comments/:commentId/reactions { emoji }
DELETE /rooms/:roomId/comment-threads/:id/comments/:commentId/reactions { emoji }Fan-out names: comment.thread, comment.created, comment.updated, comment.deleted, comment.thread.updated, comment.thread.deleted, comment.reaction. Edit/delete a comment is the author. Delete a thread is the creator. useThreads also has searchThreads, editThreadMetadata, markThreadAsUnresolved, addReaction / removeReaction.
React
import { useThreads } from "@fluxy-chat/react";
import { CommentPin, FloatingComposer, Thread } from "@fluxy-chat/ui";
const { threads, createThread, createComment, markThreadAsResolved, markThreadAsUnresolved, deleteThread, deleteComment, editComment, searchThreads } = useThreads({ roomId });
await createThread({ body: "Check this", metadata: { x: 120, y: 80 } });Render pins with <CommentPin />, overlay <FloatingComposer />, and <Thread /> for replies/resolve/edit/delete. Scaffold: --example comments-board. markThreadAsUnresolved is Liveblocks-shaped (resolved: false).
Inbox: merge commentEventToInboxItem into useInbox().onItem, then <InboxNotification />. Daily email digest includes yesterday's thread comments (enable DAILY_DIGEST_ENABLED; see Notifications).
This is not the chat log. Do not store 60 Hz pointers here — those are presence (sendCursor / presence_patch).