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.
Three 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.
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.25.10 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.

