What you see in Slack¶
This page is a tour of Notifycat from inside Slack — every message shape and reaction the bot produces, and where to change each one.

The PR message¶
A new pull request (non-draft, or freshly marked ready for review) posts one message to the mapped channel:

- Headline —
:eyes: <mentions>, please review <PR #N: title>, linked to the PR. Mentions come from your mapping; with none configured the message falls back to@channel, and withmentions: []it posts silently. - Context line —
owner/repo · author · opened <time>, rendered in each viewer's own timezone.
That's the last new message this PR will produce. Everything below happens on it.
Lifecycle reactions¶
Review activity lands as emoji reactions, so the channel feed never moves:
| Event | Default reaction |
|---|---|
| PR opened | eyes (also the message's leading emoji) |
| Review approved | white_check_mark |
| Review commented | speech_balloon |
| Changes requested | exclamation |
| PR merged | twisted_rightwards_arrows |
| PR closed without merge | x |
| Bot reviewer activity | robot_face, added alongside the normal reaction |
Every emoji is configurable globally and per repository — see Reactions & bot reviews.
Merge and close¶
When the PR merges or closes, the message updates in place: the title is struck through, the leading emoji swaps to the merged/closed reaction, and a [Merged] or [Closed] label is prepended. The context line stays, and if anyone reviewed the PR, a muted reviewed by @user, … line lists them.

A PR converted back to draft is the one case where the message is removed — drafts aren't up for review, so they don't occupy the channel. Marking it ready again re-announces it.
The review flow¶
With Slack interactions turned on (set SLACK_SIGNING_SECRET), each PR message carries a Start review button. Without it, messages post with no button. Clicking it appends an :eye: @you reviewing marker, visible to the whole channel — no more two people silently reviewing the same PR, and no more "is anyone on this?".
When a review is actually submitted on the git host, all active markers clear and a muted reviewed by @user, … line replaces them. The button stays as long as the PR is open, so a second round of review can start the same way. Only a real review submission ends a session — line comments and conversation comments don't.
Bot reviews: marked or muted¶
Bot reviewers (Copilot, dependabot, CI auto-approvals — anything the git host reports as a bot) get the normal state reaction plus the marker, so a green checkmark from a human and one from a bot never look the same. Prefer silence instead? One config key suppresses bot reactions entirely. Details and trade-offs in Reactions & bot reviews.
Dependabot and Renovate, compacted¶
Dependency PRs don't deserve a "please review" ceremony. PRs opened by dependabot[bot] or renovate[bot] post a single compact line instead:
:package: <bot> bumped <PR link>for routine bumps:rotating_light: <bot> security update <PR link>when the PR body carries a security advisory

Set reviews.dependabot_format: false to give bot PRs the standard format instead.
Removing finished PRs from the channel¶
A merged or declined PR normally keeps its message, tagged [Merged] or [Closed]. Teams who want the channel to show only live work can flip that: with cleanup.delete_on_close: true the message is deleted when the PR finishes, so what's left in the channel is exactly what still needs attention.
It's off by default, works per repository, and is permanent — deleted Slack messages don't come back. Details and the trade-off: Remove messages on close.
Scheduled lists instead of instant messages¶
Some teams want fewer pings. Set a repository's notification strategy to scheduled and its new PRs wait in a queue. Every hour, at set times, or on your own cron, each channel gets one message that lists the PRs queued since the last send. Weekends and holidays are skipped. Details: Notification strategies.
The morning digest¶
Once a day (9am UTC by default), each channel with stuck PRs gets a two-part reminder: a parent message with the count that pings the channel's configured mentions, and a single threaded reply listing the PRs. The list lives in the thread, so the channel feed pays exactly one line per day.

A PR counts as stuck when nothing happened on it since the previous day — no review, no comment, nothing. Suppressed bot reviews deliberately don't count as activity, so an AI-only pass never hides a PR that still needs a human. It's off by default; schedule, timezone, per-repository overrides, and how to turn it on: Stuck-PR digest.