Low-noise pull request notifications for Slack. One pull request gets one Slack message: as the PR opens, gets reviewed, merges, or closes, that message updates in place and collects reactions instead of posting again. The channel becomes a status board, not an event log.
Four things it's built around:
- Quiet — state changes are message updates and emoji, not new posts; dependency bumps collapse to one compact line; bot reviews can be marked or muted.
- Nothing slips through — a morning digest resurfaces PRs nobody touched yesterday, and the "Start review" button shows who's already on it.
- Easy to own — one Go binary, one declarative
config.yaml, one SQLite file. The server validates its whole configuration against Slack and your git host before it will boot, and runtime needs only a webhook secret plus a Slack bot token — no GitHub App, no OAuth. - Agent access — admins invite developers with a one-hour, single-use invite; each developer redeems it for their own token. Admin routes live on a private port. With the token, an agent polls the open PRs of the repositories it subscribed to and reviews them. See the agent API guide and Agent API access.
Please visit https://mptooling.github.io/notifycat/
You'll need a host with Docker installed, a domain name pointing at it, inbound ports 80/443 open, and a Slack app installed in your workspace (setup). In about 10 minutes you'll have Notifycat running behind automatic HTTPS and posting PR updates to Slack.
curl -fsSL https://github.com/mptooling/notifycat/releases/latest/download/install.sh | sh
cd notifycat
./notifycat setup # interactive wizard — writes .env and config.yaml
docker compose up -d # start Notifycat + Caddy (HTTPS via Let's Encrypt)
./notifycat doctor # verify setupThe installer downloads a pinned, checksum-verified bundle into ./notifycat. The setup wizard prompts for your domain, Slack token, webhook secret, and first mapping. For the full walkthrough — webhook registration, a delivery smoke test, and verifying with a real PR — see Install with Docker Compose, then run through the Security & permissions checklist before go-live.
Most users want the one-command path above. Build from source if you're contributing or want to run without Docker.
Requires:
- Go 1.27.3 or newer (
go versionto check). gitto clone the repository.shandcurlfor the helper scripts underscripts/.- A public URL (ngrok or Cloudflare Tunnel) only if you want your git host to deliver real webhooks to your laptop. Local CLI commands (validate / doctor) don't need one.
Six commands from "nothing" to "running":
git clone https://github.com/mptooling/notifycat.git && cd notifycat
cp .env.example .env # then edit: set GITHUB_WEBHOOK_SECRET, SLACK_BOT_TOKEN
cp config.example.yaml config.yaml # then edit: database.url and real Slack channel IDs
go run ./cmd/notifycat-config validate
go run ./cmd/notifycat-doctor
go run ./cmd/notifycat-serverThe binaries pick up .env from the current working directory and default to ./config.yaml and ./data/notifycat.db. See Run from source for the end-to-end walkthrough including the tunnel + webhook setup.
One message per PR: opening it posts the message, reviews land on it as reactions (✅ 💬 ❗), and merging strikes the title through. A Start review button shows who's already reviewing. Dependabot and Renovate bumps collapse to one compact line, and a morning digest resurfaces the PRs nobody touched yesterday. The full tour, message by message: What you see in Slack.
| Feature | GitHub | Bitbucket |
|---|---|---|
| Webhook signature verification (HMAC-SHA256) | Yes | Yes |
| Per-path / monorepo routing | Yes (requires GITHUB_TOKEN) |
Yes (requires BITBUCKET_TOKEN) |
| Stuck-PR digest | Yes | Yes |
| Reactions & review flow | Yes | Yes |
| Token auth | Fine-grained PAT (Bearer) | Access token (Bearer) or scoped Atlassian API token (Basic, Free-plan fallback) |
| App passwords | n/a | Not supported — removed by Atlassian 2026-07-28; use access tokens |
A deployment serves one git host, and routing lives in the mappings: section of config.yaml — per-repository tiers with an org-wide "*" catch-all. See Configuration basics.
The project includes a justfile for common development commands. Install just (brew install just on macOS), then run:
just
just check
just servejust is a developer tool only. It is not part of the Go module, the Docker runtime image, or production dependencies.
The underlying checks are:
go vet ./...
golangci-lint run ./...
govulncheck ./...
go test -race ./...
go build ./...See CONTRIBUTING.md for contributor setup, pull request expectations, and issue reporting guidance.
MIT. See LICENSE.

