Skip to content

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.

A Slack channel where every pull request is one message: the morning digest, a closed and a merged PR struck through, a PR under review with an :eye: marker and Start review button, and a fresh announcement

The PR message

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

New PR

  • 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 with mentions: [] 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.

PR MErged

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

Renovate Bot bump PR notification

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.

Morning digest message with the stuck-PR list in its thread

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.