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 { resolved, metadata }Fan-out on the room WebSocket as server_event names comment.thread, comment.created, comment.thread.updated. Member JWT required (canAccessRoom).
React
import { useThreads } from "@fluxy-chat/react";
import { CommentPin, FloatingComposer, Thread } from "@fluxy-chat/ui";
const { threads, createThread, createComment, markThreadAsResolved } = useThreads({ roomId });
await createThread({ body: "Check this", metadata: { x: 120, y: 80 } });Render pins with <CommentPin />, overlay <FloatingComposer />, and <Thread /> for replies/resolve. Scaffold: --example comments-board.
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).