A web UI for managing alerts from multiple Prometheus Alertmanagers. Because checking five different Alertmanager UIs during an incident is nobody's idea of fun.
π Try it now at playground.notificator.org - no installation needed!
Notificator connects to all your Alertmanagers and shows everything in one place. Your whole team can see alerts, acknowledge them, add comments, and collaborate in real-time. Works on any device - laptop, phone, tablet, whatever.
Key features:
- Connect multiple Alertmanagers at once
- Real-time collaboration (acks, comments, assignments)
- OAuth login (Google, GitHub, Microsoft)
- Search, filter, and group alerts
- Alert history and statistics
- Light/dark theme
- Silence management
# Clone and build
git clone https://github.com/soulkyu/notificator
cd notificator
go build -o notificator
# Start the backend (handles auth, database, team features)
./notificator backend
# In another terminal, start the WebUI
./notificator webuiNow open http://localhost:8081 and login with admin:admin (change this!).
The WebUI connects to localhost:9093 by default. To connect to your Alertmanagers, edit ~/.config/notificator/config.json:
{
"alertmanagers": [
{
"name": "production",
"url": "http://prod.alertmanager:9093"
},
{
"name": "staging",
"url": "http://staging.alertmanager:9093"
}
]
}The WebUI needs the backend to work. Here's why:
ββββββββββββ
β WebUI β β What you see in the browser
β :8081 β
ββββββ¬ββββββ
β
ββββββΌββββββ
β Backend β β Handles everything: auth, database, real-time sync
β :50051 β
ββββββ¬ββββββ
β
ββββββΌββββββββββββββ
β Database + OAuth β
ββββββββββββββββββββ
The backend stores alert history, manages user sessions, syncs everything in real-time, and handles OAuth. Without it, the WebUI won't work.
Got alerts in prod, staging, and that weird legacy system? Connect them all:
{
"alertmanagers": [
{
"name": "production-us",
"url": "http://prod-1:9093"
},
{
"name": "production-eu",
"url": "http://prod-2:9093"
},
{
"name": "that-legacy-thing",
"url": "http://10.0.0.42:9093",
"username": "admin",
"password": "change-me"
}
]
}Each alert shows which Alertmanager it's from.
Using Grafana Mimir or Cortex with multi-tenancy :
# Alertmanager 0 (Production tenant)
NOTIFICATOR_ALERTMANAGERS_0_URL="http://mimir-alertmanager.monitoring.svc.cluster.local:8080/alertmanager"
NOTIFICATOR_ALERTMANAGERS_0_NAME="Production"
NOTIFICATOR_ALERTMANAGERS_0_HEADERS="X-Scope-OrgID=prod-tenant"
NOTIFICATOR_ALERTMANAGERS_0_USERNAME="prod"
NOTIFICATOR_ALERTMANAGERS_0_PASSWORD="prod"
# Alertmanager 1 (Development tenant)
NOTIFICATOR_ALERTMANAGERS_1_URL="http://mimir-alertmanager.monitoring.svc.cluster.local:8080/alertmanager"
NOTIFICATOR_ALERTMANAGERS_1_NAME="Development"
NOTIFICATOR_ALERTMANAGERS_1_HEADERS="X-Scope-OrgID=dev-tenant"
NOTIFICATOR_ALERTMANAGERS_1_USERNAME="dev"
NOTIFICATOR_ALERTMANAGERS_1_PASSWORD="dev"
# Or use the same header for all Alertmanagers
METRICS_PROVIDER_HEADERS="X-Scope-OrgID=your-tenant"Works with any custom headers your metrics provider needs.
export OAUTH_ENABLED=true
export OAUTH_PROVIDER_GOOGLE_CLIENT_ID="your-client-id"
export OAUTH_PROVIDER_GOOGLE_CLIENT_SECRET="your-secret"
export OAUTH_REDIRECT_URL="http://localhost:8081/oauth/callback"
./notificator backendSupports Google, GitHub, and Microsoft. Check docs/oauth/ for setup details.
By default, the backend uses SQLite. For production, use PostgreSQL:
{
"backend": {
"database": {
"type": "postgres",
"host": "localhost",
"port": 5432,
"name": "notificator",
"user": "notificator",
"password": "secret"
}
}
}docker-compose up -d
# WebUI at http://localhost:8081# Install from GitHub Container Registry
helm install notificator oci://ghcr.io/soulkyu/notificator --version 0.1.0
# Or customize
helm install notificator oci://ghcr.io/soulkyu/notificator --version 0.1.0 \
--set webui.ingress.host=notificator.yourcompany.com \
--set backend.env.NOTIFICATOR_BACKEND_DATABASE_TYPE=postgres./notificator backend &
./notificator webui &Use systemd or supervisor to keep them running.
I was on-call and kept missing alerts because:
- The default Alertmanager UI is... functional
- Switching between multiple Alertmanagers during incidents sucked
- No way to see who was handling what
- No collaboration features
So I built this. Then my team started using it. Then we added real-time collaboration. Now when an alert fires, everyone sees it instantly. When someone acks it, everyone knows. No more "are you handling this?" messages in Slack.
PRs welcome! The code is straightforward:
internal/webui/- Web UI (Go + Templ + HTMX + Alpine.js)internal/backend/- Backend server (gRPC + PostgreSQL/SQLite)internal/alertmanager/- Alertmanager client- Tech stack: Go, Gin, Templ, HTMX, Alpine.js, Tailwind CSS
No npm, no webpack, no 10,000 dependencies.
PS: Yes, the code could be cleaner. Yes, there should be more tests. But it works, and that's what matters when you're on-call.
