ANVILNINE

CRIT ALARM / HOSTED · SELF-HOST AGPL-3.0

Live · free + $4.99/mo Pro · critalarm.app

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.

critalarm.app is live and the server is running. The iOS and Android apps are not in the stores yet, so the button there puts you on the waitlist.

  • 30s

    between repeats until you acknowledge

  • 10 min

    desk timer before it rings again

  • 2

    critical topics on the free plan

critalarm.app
The Crit Alarm homepage: a phone ringing a critical alert for a downed primary database, with an Acknowledge button and a Snooze 10 min button under 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.

There is no SDK to install and no agent to run on the box.

from the Uptime Kuma webhook, or any shell

curl -X POST https://api.critalarm.app/prod-db \
  -H "Authorization: Bearer tk_7Hq2mN9xPz4wKd8" \
  -H "Priority: 5" \
  -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."

or the command line, for a cron job or a CI step

npm install -g @anvilnine/critalarm-cli

critalarm send prod-db "pg_isready failed 3 times in 90 s." \
  --title "Primary database down" \
  --priority 5 \
  --tags "postgres,db-1"

CLI docs ↗ · github.com/anvilnine/critalarm-cli ↗

Critical means it wakes you.

A critical alert plays at alarm volume. It repeats every 30 seconds for up to 30 minutes by default, or until you acknowledge it. Acknowledge from bed and a 10-minute desk timer starts. If you have not closed the incident from your desk by then, it rings again.

The priority ladder.

Set a default on the topic, override it per message with the Priority header. The phone behaves differently at each rung.

  • min

    Stored in history. No notification at all.

  • low

    Silent notification. No sound, no vibration.

  • default

    Standard notification with sound. Respects quiet hours.

  • high

    Sound and vibration. Shows on the lock screen even during quiet hours.

  • urgent

    Priority 5. On a topic with critical switched on, an alarm that repeats every 30 seconds until you acknowledge.

Pricing.

Repeat until acknowledged is on the free plan. It is the product, so it is not behind the paywall.

Free

$0

  • Unlimited topics
  • 2 critical topics
  • Up to 5 devices
  • 7 days of history
  • Repeat until acknowledged

Pro

$4.99 a month

  • Unlimited critical topics
  • Up to 5 devices
  • 90 days of history
  • 1,000 priority-4 messages a day
  • Per-message priority overrides

Self-hosted

$0

  • Every Pro feature
  • Your hardware, your SQLite file
  • Point the app at your URL
  • Open source AGPL-3.0

Compare all plans and limits ↗

Run it on your own box.

One container, one SQLite file, and no push credentials of your own: the relay delivers to Apple and Google for you. The app has a server field in Settings. Change it and everything, including critical alarms, goes through your machine.

github.com/anvilnine/critalarm-server ↗

AGPL-3.0 · every Pro feature

docker run -d --name critalarm \
  -p 8080:8080 \
  -v critalarm-data:/data \
  -e BASE_URL=https://alerts.example.net \
  ghcr.io/anvilnine/critalarm:latest

Stop finding out in the morning.

Free for unlimited topics, two of them critical. The apps are not in the stores yet, so critalarm.app takes your email and sends an invite when the builds land.