One Docker container and a Postgres you already have.
- Every feature, no limits
- Your GitHub App, your Slack App, your bot
- AGPL-3.0
- Upgrade guide for tagged releases
Callog is a git-first routing layer for engineering notifications. Your CI already knows the build is red and who broke it. Slack has no idea, because that person commits from a personal email and the webhook only knows a channel name. Callog connects the two: the alert reaches the right place and actually tags the right human, in Slack or Telegram.
e2e failed on main
3 tests failed. Author: @alice. Team @frontend.
Routes, templates and teams are YAML in one config repo. Reviewed in PRs, validated in CI, applied on push. A broken config never goes live.
A GitHub login on a personal email, a Slack user and a Telegram account are one person. Mention the commit author and they get pinged where they actually read.
GitHub Actions authenticate with OIDC. Services use scoped API keys. Not a single webhook URL in any repository.
Before and after
did e2e pass on main? the deploy is waiting
no idea, let me open the Actions tab⦠still running I think
it's red. @here anyone know whose commit that was?
we really need to set up test notifications at some point
e2e failed on main
3 tests failed. Author: @alice. Team @frontend.
on it, fix is up in 10 min
e2e passed on main
Fixed by @alice in 2 commits.(edited)
How it works
Producer
Add the Action to the workflow, name a route, pass the data. No webhook URL, no secrets: GitHub OIDC proves which repository is calling.
Config repo
Each route is a YAML file: destinations, who is allowed to send, a schema for the payload and a template. Teams are channels plus members from a GitHub team or Slack user group.
Delivery
Recipients are matched to real Slack and Telegram accounts, the message is rendered for each app, replies land in the same thread and failed sends are retried.
id: e2e-failed
allowed_sources:
github_repos: [acme/fe-e2e]
destinations:
- slack: "#fe-alerts"
- telegram: fe-alerts
- team: frontend
mentions: recipients
template:
- header: "e2e failed on {{ data.branch }}"
- text: "{{ data.failed }} tests failed. Author: {{ recipients | mention }}"
- buttons:
- { text: "Open run", url: "{{ data.run_url }}" }teams:
frontend:
slack_channel: "#fe-team"
members_from:
github_team: frontend
slack_usergroup: frontendFeatures
Each of these exists because a failing build at a 100-engineer company needed it.
The hard part
A GitHub login on a personal email, a Slack user and a Telegram account are linked into one person automatically. Only verified or high-confidence links are used for mentions and DMs.
| Source | Provider | Confidence |
|---|---|---|
| Slack workspace sync | slack, email | verified |
| GitHub org verified-domain emails | github | verified |
| Commit heuristic, 3+ commits from a work email | github | high |
| OAuth through the bot | github | verified |
| Deep link from a Slack DM | telegram | verified |
| Weak signal or conflict | any | suggested |
Alternatives
| Knock / Novu | PagerDuty | slack-github-action | Callog | |
|---|---|---|---|---|
| Focus | Product notifications to end users | On-call and incidents | Post to a channel | Internal engineering alerts |
| GitHub β Slack β Telegram identity | β | Partial | β | Core of the product |
| Address a team or a person | β | Yes | β | Yes |
| Git-first config | β | β | Per repository | Centralized, reviewed in PRs |
| Cost for a 20-person team | High | High | Free, primitive | Free, self-hosted |
Pricing
The code is the same in both editions. Self-host it today, or let us run it when the hosted version opens.
One Docker container and a Postgres you already have.
Install the GitHub App, add to Slack, send your first alert. Then pay per active person.
Clone the repo, create a GitHub App, run docker compose. Your first alert with a real mention lands in about five minutes.
git clone https://github.com/callog-dev/callog && cd callog
cp .env.example .env
docker compose --profile db --profile app up -d --build
curl http://localhost:3000/readyz