14:22:07 order.completedemail · slack 14:21:55 user.signupin-app · email 14:20:41 payment.failedwhatsapp retry14:19:03 incident.triggeredslack · telegram 14:17:28 comment.mentionin-app · push 14:16:52 trial.expiringemail
Open-source · MIT · self-hostable

Fire one
event.
Reach everywhere.

alrt is notification infrastructure you host yourself. One trigger fans out to eight channels — in-app, email, Slack, WhatsApp & more — with a visual workflow engine doing the routing.

$ git clone alrt && docker compose up
EVENT
In-app
Email
Slack
WhatsApp
Discord
Telegram
SMS
Push
§01The primitive

Trigger once. We handle the rest.

No provider SDKs, no per-channel plumbing, no separate subscriber sync. One authenticated POST — alrt upserts the recipient, resolves the workflow, and routes across every channel it touches.

POST /events/trigger
curl -X POST alrt.local/events/trigger \
-H "Authorization: Bearer alrt_sk_…" \
-d '{
"workflow": "order.completed",
"subscriber": { "id": "u_123" },
"payload": { "total": "$99.00" }
}'
§02Channels · day one

Eight destinations,
one contract.

Every channel speaks the same trigger. Bring your own credentials — Fernet-encrypted, scoped per team.

01
In-app
Real-time WebSocket, headlessredis pub/subLIVE
02
Email
Jinja2 templates, HTML + textresend · sendgridLIVE
03
Slack
Block Kit, DM or channeloauthLIVE
04
WhatsApp
Delivery + read receiptsmeta cloud apiLIVE
05
Discord
Rich embeds via webhookwebhookLIVE
06
Telegram
Markdown, rate-limit awarebot apiLIVE
07
SMS
International + DLT-complianttwilio · kaleyraLIVE
08
Push
iOS + Android + Webfcm · apnsLIVE
Trigger
order.completed
Condition
total > 50
Email
Receipt + invoice
In-App
Order shipped 🎉
§03The builder

Routing your whole team can read.

Drag nodes, branch on conditions, add delays, publish. The next matching trigger runs the graph — no redeploy for a copy change, no eng ticket for a new channel.

4 node types · trigger, channel, condition, delay
Cycle detection & dangling-edge validation
Draft → publish, undo/redo, keyboard-first
§04Infrastructure, not a widget

API-native by design.

01 / UPSERT

Inline subscriber upsert

Create the recipient on the same call that triggers. Zero pre-registration, no sync job.

02 / REALTIME

Headless in-app feed

WebSocket over Redis pub/sub. Build your own bell — zero UI lock-in.

03 / RESILIENCE

Dead-letter + retry

Per-channel queues, exponential backoff, one-click retry from the dashboard.

04 / SCALE

Bulk & idempotent

1,000 subscribers per call. Redis SET NX idempotency, 24h window.

05 / LOGIC

Conditions & delays

Branch on payload or subscriber props. Schedule with deliver_at.

06 / SECURITY

Encrypted BYOC

Your provider keys, Fernet-encrypted at rest, scoped per team.

Yours to run · $0 · MIT

Stop wiring up
providers.

docker compose up and send your first multi-channel notification before lunch.

Deploy alrtRead the docs