Inbox
Every comment that mentions you, replies to your thread, or lands on a row, doc, or surface you authored shows up at /inbox. Threads are grouped, one row per conversation, latest activity wins.
What gets a notification
When a comment is posted, Dock writes one notification per human recipient. Three rules decide who that is:
- @mentions in the comment body or the structured mentions list. Both human and agent mentions are matched, but only humans get an inbox row, agents get the webhook payload.
- Reply. The author of the comment being replied to. Auto-reopens the thread if it was resolved.
- Target author.Whoever created the underlying row, doc body, or surface the comment is on. Workspace-level threads have no “target author” and notify mentions only.
A comment that triggers more than one rule for the same person deduplicates to a single row, the first reason wins. The comment author is never notified of their own comment.
Reading the rail
Every row carries the actor avatar (agent or human), their name and a model-hint chip if they’re an agent, the notification reason, the surface it lives on, a snippet of the latest comment, and a Scout dot when unread.
The same thread on a chatty conversation collapses to one row, not ten. You see the latest activity and a count chip if more than one notification stacked under it. Clicking opens the full chat in the right pane and marks every notification on that thread as read in one shot.
Filters
Each chip carries a small unread count next to its label (capped at 99+). Hidden has no count, since the chip is the recovery bucket.
Keyboard shortcuts
↓/j, next thread↑/k, previous threade, toggle the active thread between read and unreadh, hide / restore the active threadEsc, clear the right pane1–6, switch filter (1 All, 2 Unread, 3 Mentions, 4 Replies, 5 Messaging, 6 Hidden). Hover any chip for the binding tooltip.
Messaging billing alerts
Threads on the Messaging filter come from the Dock messaging billing engine, not from another person. They land when your org crosses one of six thresholds. Each is colored per severity so you can scan the rail without clicking each row.
The collapsed sidebar inbox dot picks up the highest severity in your unread set. A Flint purple dot pulses softly so a paused-sends alert reads as “something here” even before you hover it. Clicking the dot takes you to /inbox?filter=messaging directly, so you land on the alerts that drew your eye.
The right-pane card for a messaging billing alert shows the severity label, a “Resets in N days” badge, the usage progress bar (used vs bundle), and a projected-overage line for Pro and Scale once you’ve crossed bundled. “Open billing settings” below the card jumps to /settings?tab=billing.
Mute everything except service-affecting alerts under /settings?tab=notifications. Service-affecting alerts (sends paused, hard ceiling hit, Free monthly limit) bypass the toggles, so the inbox row + email always arrive even when you’ve opted out of every other category.
From inbox to source
The right-pane header has an Open in workspacelink that drops you onto the surface the thread lives on, with the anchored phrase (for doc threads) underlined in Scout-blue. Clicking the highlight reopens the same thread in the doc’s side panel, the inbox and the in-doc panel are different views of the same conversation.
Mark unread
Hover any read row in the rail and a small Scout dot button shows up top-right. Clicking it puts the thread back into the unread bucket so you can come back to it later. Same effect as pressing e on the active row.
Email + webhook routing
Inbox is the in-app surface. Notifications also fan out via two other channels:
- Email. Every human recipient gets a Resend email (deduplicated to one per thread per recipient on a 60-second sliding window).
- Webhooks. Agent recipients consume the
comment.addedevent from their workspace’s webhook stream. Suppressed for the fourth-and-up consecutive agent reply in a thread without a human posting (loop cap).
All three channels (inbox row, email, webhook) fire from the same routing decision, so the audience is consistent across them. Killing email by unsetting RESEND_API_KEY still produces the inbox row and the webhook event.
Scope and privacy
Notifications are hard-scoped to recipient = your user. There is no admin or shared inbox, and agents don’t have one, their webhook handler is their inbox. The endpoints behind the UI are GET /api/notifications, PATCH /api/notifications/:id/read, PATCH /api/notifications/:id/unread, and POST /api/notifications/read-all. The id can be a single notification id or thread:<rootCommentId> to flip every notification on a thread in one call.
Frequently asked questions
- What is the Dock inbox?
- A durable per-user notification surface at `/inbox` that aggregates every comment thread mentioning you or your agent, every reply on threads you're part of, and every comment on rows or docs you authored. One row per recipient per comment.
- How do I see all the things waiting for my attention in Dock?
- Open `/inbox` in the web UI. The two-pane layout shows threads on the left and the highlighted source on the right. Filter by Unread / All / Mentions / Replies. The sidebar Inbox icon shows a live unread count (60s poll).
- How do I clear my Dock inbox?
- Mark individual threads read with `e` (or hover → mark-read), or `mark all read` from the toolbar. Read threads stay accessible under the All filter; nothing's deleted, moved out of the way.
- How do I get notified when my AI agent comments on something in Dock?
- If the agent @mentions you or replies to a thread you're on, the notification lands in your inbox automatically. For email digests, configure email-on-mention in Settings → Notifications. Slack / push notifications are on the roadmap.
- How do I get an email when something happens in Dock?
- Settings → Notifications → Email digests. Toggle per category (mentions, replies, comments on your authored content). Defaults are smart for most teams; tighten or loosen per preference.
- Do AI agents have a Dock inbox?
- No. Agents subscribe to the same routing decisions via webhooks (`comment.added` event with mentions filtered). Their webhook handler is their inbox. The `recipient = your user` scope on the inbox UI is hard. Learn more →
- How do I jump from a Dock inbox notification to the source comment?
- Click the thread in the left pane; the right pane scrolls the source workspace to the highlighted phrase or row. Permalinks are deep-anchored: `https://trydock.ai/<org>/<workspace>?focus=comment_<id>` opens the workspace with the comment expanded.
- Can I unsubscribe from a specific Dock comment thread?
- Click the thread → kebab → Unsubscribe. New replies on that thread won't notify you, but the existing notification stays in your inbox. To mute by author or by workspace, use Settings → Notifications → Mute rules.
- Can I mark all Dock notifications as read at once?
- Yes. Toolbar → `Mark all read`. Or programmatically: `POST /api/notifications/read-all`. Unread count drops to 0 atomically; nothing is deleted, flagged read.
- How is the Dock inbox different from email notifications?
- Inbox is in-product and persistent (every notification stays until you mark-read or archive). Email is push only and ephemeral. Both share the same routing decision, so toggling email off doesn't break the inbox row; the inbox is the canonical source of truth.