Your server pages you. Even at 3am.
One HTTP endpoint per topic. Post to it from cron, CI, Uptime Kuma or a shell script. Mark the topic critical and the alarm repeats until you acknowledge it.
Publish with one request
Every topic gets a URL and a bearer token. Headers carry the priority, title and tags. The body is the message. Anything that can make an HTTP request can wake you up.
# from the uptime-kuma webhook, or any shell
curl -X POST https://api.critalarm.app/t/prod-db \
-H "Authorization: Bearer ca_live_7Hq2mN9xPz4wKd8" \
-H "Priority: critical" \
-H "Title: Primary database down" \
-H "Tags: postgres,db-1" \
-d "pg_isready failed 3 times in 90 s. Replica promoted to primary on db-2."
# 202 Accepted
"id":"msg_01J7Q","topic":"prod-db","priority":"critical","delivered":"2026-09-10T03:12:04+08:00" - Delivered
- 03:12:04
- Rang
- 4 times, 30 s apart
- Acknowledged
- 03:14:18 by Z
- Escalation
- not needed
How it works
Create a topic
Name it prod-db. Pick a default priority. Copy the endpoint and the token from the screen.
Post to it
cron, systemd, GitHub Actions, Home Assistant, a bash one-liner. If it can make an HTTP request, it can alert you.
Answer the alarm
Default priority is a notification. Critical rings, vibrates and repeats every 30 seconds until you tap Acknowledge.
The apps are not in the stores yet
Join the waitlist and you get an invite when the builds land.
Critical means it wakes you
A critical alert plays at alarm volume. It repeats every 30 seconds for up to an hour, or until you acknowledge it. If nobody has acknowledged after 5 minutes, escalation rings a second device or places a call.
- Plays at alarm volume
- Repeats every 30 seconds
- Escalates after 5 minutes
- Stops only when you acknowledge
The priority ladder
Set a default on the topic, override it per message with the Priority header. The phone behaves differently at each rung, and the face changes with it.
Stored in history. No notification at all.
Silent notification. No sound, no vibration.
Standard notification with sound. Respects quiet hours.
Sound and vibration. Shows on the lock screen even during quiet hours.
Alarm. Repeats every 30 seconds until you acknowledge.
Pricing
Pro
- Unlimited topics, unlimited critical
- Escalation to a second device or a phone call
- 90 days of history
- Priority override per message
- Quiet hours per topic
Self-hosted
- Every Pro feature
- Your hardware, your SQLite file
- Point the app at your URL
- Open source AGPL-3.0
Run it on your own box
One container, one SQLite file, one env var for push credentials. The app has a server field in Settings. Change it and everything, including critical alarms, goes through your machine.
docker run -d --name critalarm \
-p 8080:8080 \
-v ./data:/data \
-e CA_BASE_URL=https://alerts.example.net \
-e CA_APNS_KEY_FILE=/data/apns.p8 \
ghcr.io/critalarm/server:1 Stop finding out in the morning
Free for 5 topics. Critical rings from the first one.




