Watches, inbox and reminders
How to have nima tell you when something changes (watches, the inbox, the 09:00 digest) and how one-time Slack reminders work.
nima has two separate features for telling you things later. Watches notice an event on a signal, beacon, spec or pull request and tell you. Reminders (scheduled messages) send text you wrote to your own Slack DM at a time you pick. They have different gates and different limits, so this page keeps them apart.
Neither feature sends webhooks or CloudEvents to outside systems. Delivery is a Slack DM, your nima inbox and a daily digest.
Turning watches on for a workspace
Off until a workspace owner or admin turns it on for the workspace. The only control is PATCH /organizations/settings with {"triggersEnabled": true}, called from a signed-in owner or admin session. There is no admin-panel toggle and no API-key or MCP route for it, so you can also ask the nima team.
triggersEnabled defaults to false. Until it is true:
- Creating a watch (
POST /v1/watchesor thecreate_subscriptiontool) returns409with "Subscriptions are not enabled for this workspace". - nima still records events, but nothing fires and no DM is sent.
- The Slack reactions and the
stopcommand below do nothing. Astopmessage reaches nima's assistant as ordinary text.
If a workspace turns triggersEnabled off later, existing watches stop firing without an error to their owners.
See Workspace settings for the settings route and Availability for what else is off by default.
What a watch is
A watch pins one existing signal, beacon, spec or pull request, and tells you when something happens to it or to anything downstream of it.
- Subject. Each personal watch pins one
subjectKindandsubjectId, normally asignal,beacon,specorpr. The subject cannot change; create a new watch instead. - Downstream events. A watch hears the subject's own events and events on the items it flowed into. The order is signal, then beacon, then spec, then pull request. A watch on a signal hears its beacon, spec and PR. A watch on a spec cannot subscribe to
beacon.ready; the API answers400. - Saved instructions. You give each watch
instructions(1 to 4,000 characters): what nima's AI should look at and say when the event fires. nima runs them and messages you the answer. You can addcontext(up to 8,000 characters) with preferences from the conversation. - Daily AI budget. Your conversational watches share 20 AI runs per rolling 24 hours, retries included. Fires past that are skipped, not queued.
- Future events only. A watch you ask for fires only on events created after it existed. Resuming a paused watch resets that start point to now, so it does not replay what happened while paused.
- Conditions.
payloadEqualsis an object of exact-equality checks on the event payload, for example{"verdict": "drifted"}onpr.drift_checked. There are no ranges,notoror. Every field must exist on every event type the watch selects, so conditions work best with one event type. - Expiry.
expiresAtis optional and must be in the future. An expired watch stops firing. - Idempotent create. Repeating an identical active request returns the existing watch.
Watches do not support topics ("tell me about any future item matching X"), timers, after or unless conditions, recurring schedules or webhooks. A watch delivers only to its owner, and nima checks at every fire that the owner is still a member with the right permissions.
Watch event types
nima has a fixed catalog of 16 event types. list_event_types (GET /v1/triggers/event-types) returns it with each type's JSON payload schema. A material event interrupts you again even if you were already told about the subject. A non-material event folds into the digest when you were told about that subject in the last 24 hours.
| Event type | Subject | Happens when | Material |
|---|---|---|---|
signal.attached_to_beacon | signal | A signal was grouped into a beacon, by nima or by a person | No |
beacon.ready | beacon | A beacon gathered enough evidence to be decided on | No |
beacon.promoted | beacon | A person promoted a beacon and a spec is being written | Yes |
beacon.held | beacon | A beacon was put on hold, with a reason | No |
beacon.dismissed | beacon | A beacon was dismissed | No |
spec.generation_completed | spec | nima finished writing a spec | No |
spec.generation_failed | beacon | A spec run failed or was cancelled before it wrote anything | No |
spec.question_asked | spec | nima needs a decision before it can finish a spec | Yes |
spec.status_changed | spec | A spec moved between draft, in review, approved, in progress and shipped | No |
pr.linked_to_spec | pr | A pull request was matched to a spec and delivery started | Yes |
pr.merged | pr | A pull request linked to a spec merged | No |
pr.drift_checked | pr | nima compared a pull request with its spec | Only when the verdict is drifted on an open PR |
spec.shipped | spec | The last pull request delivering a spec merged | Yes |
ticket.opened | ticket | A ticket was created in a connected tracker (Jira) | Yes |
ticket.assigned | ticket | A tracker ticket was assigned to someone new | Yes |
ticket.comment_added | ticket | Someone commented on a tracker ticket | Yes |
Ticket events belong to workspace rules (see Workspace ticket rules); personal watches normally pin signals, beacons, specs and pull requests. Ticket events carry ids, the issue key, title and URL, and flags. They never carry the ticket body or comment text.
Automatic watches
nima creates some watches for you so the people closest to an item hear about it. They appear in list_watches with createdVia set to reaction or implicit, and you cannot edit them (you can pause them).
| Trigger | What nima creates | Events it hears |
|---|---|---|
| You react with :bell: to a message nima filed as a signal | A reporter-loop watch on that signal, owned by you | signal.attached_to_beacon, beacon.ready, beacon.promoted, spec.generation_completed, pr.linked_to_spec, spec.shipped |
| You promote a beacon | A watch on that beacon, owned by you | spec.generation_completed, spec.generation_failed, spec.question_asked, pr.linked_to_spec, pr.drift_checked, spec.shipped |
| A spec is generated | A watch on the spec, owned by the spec owner | The same events, except spec.generation_failed, which belongs to the beacon |
The :bell: reaction is silent: nima does not confirm it. It is ignored when your Slack user is not linked to a nima account, when the channel is not an active monitored channel, when the channel is shared with another organization (Slack Connect), or when the message has no signal. An automatic promotion by the system creates no watch.
How watch notifications are delivered
nima delivers each watch notification as a Slack DM to the person it is for (the watch owner, or for a workspace rule the recipient the rule names) and records it in that person's nima inbox. It never posts a watch notification to a channel.
- Slack DM. Text only, from the nima bot to your own DM. Every DM ends with "Reply
stopto pause all your watches." - Interrupt cap. At most 3 interrupting DMs per person per local day. After that, everything folds into the digest.
- Fold window. A non-material item for a subject you were told about in the last 24 hours goes to the digest instead of a DM.
- The 09:00 digest. One DM per person at 09:00 in your Slack timezone (UTC when Slack gives none), listing up to 20 folded items and summarizing the rest in one closing line.
- No Slack link. If your Slack account is not linked, the item is kept in your inbox only (channel
inbox). - One attempt. nima tries each DM once with a 5-second timeout. It does not retry, so a lost response cannot send a duplicate; a failed send shows as
failedin the inbox. - Workspace breaker. If a workspace reaches 200 delivered, digested or proposed fires in an hour, further fires that hour are dropped, not replayed.
- Links. A watch DM links to the beacon or spec in the web app. The web app is an admin panel, so those links land on Integrations. Read the subject with
get_beacon,get_document_markdownorget_spec_deliveryinstead.
Reminder DMs from workspace rules have their own cap of 10 per person per day, are never folded, and approvals and questions are never folded or capped.
Pausing watches: unwatch, no_bell and stop
Pausing a watch stops it firing and never deletes it, so past notifications stay explainable.
| Action | What it pauses |
|---|---|
unwatch (DELETE /v1/watches/:id) | One of your watches, by id from list_watches. Returns the watch with HTTP 200. Pausing a paused watch changes nothing. Its pending digest items are dropped too. |
| :no_bell: reaction on the signal's message | Your active watches on that signal, and their pending digest items. It skips the channel checks. |
DM the bot stop (also mute, stop all, unwatch all, stop everything) | Every active personal watch you own. Also mutes, for you only, every workspace rule that messaged you in the last 7 days. |
stop also removes your pending digest items, so tomorrow's 09:00 DM does not undo it. Only complete commands match; a targeted request such as "stop watching that spec" goes to nima's assistant. nima answers with one line, for example "Paused your 2 watches. nima won't DM you about them again."
To resume, call update_subscription with state: "active". Only watches created through a conversation or the API (AI watches) can be edited or resumed; automatic watches and workspace rules cannot.
Workspace ticket rules (admins)
A workspace ticket rule is a watch with scope: "org" that reacts to tracker tickets for the whole workspace instead of one subject.
Requirements, all at once:
- Watches are on for the workspace (
triggersEnabled). - Outbound dispatch is on for the workspace (
dispatchEnabled), otherwise409"Outbound dispatch is not enabled for this workspace". See Outbound actions. - The caller is a workspace owner or admin.
- The request comes from a signed-in owner or admin session. API keys and MCP tokens cannot create workspace rules today:
create_subscriptionneedssubscriptions:write, a rule also needsintegrations:write, and no key carries both (the key from/nima mcp-key integrationsholds onlyintegrations:write). Either way the API answers403. Ask the nima team if you need a rule and have no session route.
A rule listens to ticket.opened, ticket.assigned and ticket.comment_added (Jira today) and takes one of two handlers:
notifywithtemplateKey: "tracker_assignee_reminder". nima DMs a recipient chosen by role (owner,assignee,reporterorspec_owner, with an optional fallback ofownerornone). The DM has Snooze 1d and Done buttons. Snooze sends it again a day later; Done ends it. Reminders are capped at 10 per person per day. Mentions are not supported yet. The reminder template speaks forticket.openedandticket.assignedonly; use anagentrule forticket.comment_added.agentwithinstructions,tools: ["reply_on_ticket"]andmaxActions: 1. nima's AI proposes one reply on the ticket per fire. The reply follows the workspace's action policy forreply_on_ticket. By default it waits for approval on a Slack card. An owner or admin can set an automatic policy, but it applies only in a project marked internal and only when the person who triggered the reply is a workspace member. See Outbound actions. An agent rule runs at most 20 times per rolling 24 hours, and the workspace's daily agent spend cap (dispatch.dailyUsdCap, default $5 per UTC day) applies.
Rules fire only on ticket events that happen after the rule is created. They never replay earlier activity. Anyone can turn a rule's DMs off for themselves with stop.
The nima inbox
The nima inbox is your own list of everything nima has told you about what you watch, newest first. get_inbox (GET /v1/inbox, scope inbox:read) returns it, 20 items per page by default and up to 100.
Each item has a title, body, links, the subject it was about and a channel:
| Channel | Meaning |
|---|---|
slack_dm | Sent to you as a Slack DM |
digest | Folded into the 09:00 digest |
inbox | Kept here only, for example because your Slack is not linked |
The inbox is personal: nobody, including admins, can list another person's. There is no web page for it; read it over MCP or the API.
To see what happened to a subject instead of what nima told you, use get_history (GET /v1/events). It lists event ids, types and timestamps for one signal, beacon, spec or PR and everything downstream, org-wide, without the underlying text. It needs signals:read.
One-time reminders (scheduled messages)
A reminder saves text now and sends exactly that text to your own Slack DM at a time you choose. It is on for every workspace member whose Slack account is linked; there is no workspace setting to turn it on.
On for every workspace. Reminders do not depend on triggersEnabled. Creating one fails with 400 "Link your Slack account in this workspace before scheduling a message" until your Slack account is linked.
| Rule | Value |
|---|---|
| Destination | Your own Slack DM only. Not channels, other people or email |
message | 1 to 12,000 characters, sent as written. nima does not research or run anything later |
sendAt | ISO 8601 with a UTC offset, in the future and no more than 366 days ahead |
timeZone | A confirmed IANA zone. get_scheduling_context suggests your Slack profile zone, or UTC when Slack gives none, so confirm it |
| Pending per person | 100. The 101st gets 409 until you cancel one |
| Precision | About one minute; nima checks for due reminders every 60 seconds |
requestKey | 1 to 128 characters, your idempotency key. Reuse it on a retry and you get the original reminder back; reuse it with a different message or time and you get 409 |
Only pending reminders can be edited (with the version from list_scheduled_messages) or cancelled. Reminder states:
| State | Meaning |
|---|---|
pending | Waiting for its time. The only state you can edit or cancel |
delivering | A worker has claimed it. Edits and cancels return 409 |
sent | Slack confirmed the post |
cancelled | Cancelled before delivery |
failed | Not sent, for example your membership or permissions were revoked, or your Slack account was unlinked |
uncertain | Delivery could not be confirmed. nima never resends it automatically; check Slack before you schedule it again |
A reminder stuck delivering for more than 5 minutes becomes uncertain. list_scheduled_messages returns up to 200 reminders, pending first by delivery time.
Creating watches and reminders
You can create watches and reminders in Slack, over MCP or over the REST API. There is no web page for either.
In Slack. Ask nima in a DM or an @nima mention in plain words, such as "watch this spec and tell me if it drifts" or "remind me tomorrow at 9". For a reminder, nima asks for a clock time if you gave only a day, confirms the timezone, and says "scheduled" only after the reminder is saved, stating the date, time, timezone and DM destination. See Slack.
Over MCP. The watch tools are list_event_types, create_subscription, update_subscription, list_watches, unwatch, get_inbox and get_history. The reminder tools are get_scheduling_context, schedule_message, list_scheduled_messages, update_scheduled_message and cancel_scheduled_message. Watch and reminder tools need subscriptions:read or subscriptions:write, the inbox needs inbox:read, and history needs signals:read. Parameters are in Watch tools.
Over the API. Routes are documented in Watches and Scheduled messages.
Code intelligence
How nima indexes your repositories and what search_code, blast_radius and get_data_model can tell an agent, with their freshness limits.
Outbound actions and approvals
When and how nima writes into Slack, Jira, Linear and GitHub on someone's behalf, how approvals, action policies and safety limits work, and what is live today.