Web · Collaboration

Comments

Anchor a comment to a doc range, table cell, row, html element, or whole workspace. Threaded, mentionable, reactable, resolvable. Agents are first-class participants, @agent mentions, agent-authored replies, agent visibility on every thread.

What you can comment on

  • Doc range: select text in a doc-mode surface, click Comment in the bubble menu (or Cmd+Opt+M). The selected range gets a yellow CommentMark; clicking it opens the thread.
  • Table cell: hover a cell, click the comment icon (top-right of the cell). Threads attach to the row + column intersection, not just the row.
  • Row: click the row's expand chevron, then Comments tab in the side panel.
  • HTML element: click any rendered element inside an html-kind Surface preview to drop a comment at the click point. A small glass composer pops at the coordinates with the anchored phrase as an italic header; type and Post (or ⌘↩). Existing threads render as pink dots at the top-right of each anchored element, click a dot to open the full thread in the sidebar.
  • Workspace: open Comments rail (Cmd+\ /workspace level discussions, like "What's the goal of this list?").

Mentions

Type @ in any comment composer or doc body to open the unified mention picker. Four classes surface in one keystroke:

  • People on this workspace, inserts as @Label, fans out a notification
  • Agents the workspace can see, same @Label shape, also notify-able (via webhook)
  • Workspaces you can access, inserts as [[org/slug]], renders as a click-to-open chip
  • Surfaces inside a workspace, inserts as [[org/slug#tab]] and links straight to the tab

Mentioning a person or an agent fires:

  • An inbox notification for the mentioned principal
  • An email notification (per-recipient setting)
  • For agents: a webhook event (comment.mention_added for comments, doc.mention_added for doc bodies) so the agent service can wake up + reply

Workspace + surface mentions are inert from a notification standpoint, they're navigational links, not pings. The dropdown filters server-side: anyone you can't see (different org, no shared workspace) never appears.

Reactions

Tap any emoji at the bottom of a comment. Same-emoji reactions stack with a hover tooltip showing who reacted. Limit: any emoji, no curated set.

Resolve

Top-right of the thread. Resolved threads collapse out of the canvas but stay reachable via the Comments rail. Anyone in the thread can re-open. The original anchor (range, cell, row) keeps its CommentMark even when resolved, so the discussion remains discoverable from the doc context.

What happens when the anchor changes

If the underlying text or row gets edited so the original anchor no longer makes sense, the thread shows an "anchor changed" badge. Better than silently orphaning (Notion) or auto-resolving (Google Docs). The thread stays attached to the closest equivalent location and the badge tells you the context shifted.

Visibility

Comments inherit the workspace's visibility:

  • Private workspace: only members see comments
  • Org-visibility: every org member
  • Public workspace: comments are PUBLIC too. By design, public workspaces are public end-to- end. Don't comment on a public workspace anything you wouldn't paste into a public Slack.

Programmatic

  • REST: /api/comments (list / create / resolve / react)
  • MCP: create_comment, resolve_comment, etc.
  • Webhook events: comment.created, comment.mentioned, comment.resolved
Updated