Appnatomy

Know when production stops talking, from somewhere it cannot take down.

Appnatomy watches your apps from outside their walls. Your schedulers and workers send a heartbeat every minute; Appnatomy probes your real health endpoints; and when either goes quiet, it pages a human by SMS, email and Slack and keeps paging until someone acknowledges.

Heartbeat monitors

A dead man's switch for cron jobs, queue workers and control planes. Each monitor has a private ping URL, a period and a grace window. Pings stop, you get paged. A crashed worker, a wedged scheduler, a lost database connection or a dead box all fail the same way, and this catches every one of them.

HTTP probes

Every minute, from Appnatomy's own network, with a 10 second connect and 15 second read timeout, real TLS verification, and an optional JSON body match such as ok: true. Point it at a deep health check that actually touches the database, not a static 200.

Paging that will not give up

SMS first, then email, then Slack. One alert per incident, never one per failed probe, repeated every 30 minutes until acknowledged or recovered. The acknowledgement link in the message works without a login.

Honest about deploys

Two consecutive failures and a grace window absorb a normal container swap. For longer work, a maintenance window silences paging while the record keeps every transition.

Public status pages

Every organization gets a cached, no-login status page listing each monitor's state and last change. Nothing else leaks: no URLs, no tokens, no history.

Built for teams and agents

Multi-tenant from the first line. Organizations, contacts, monitors and incidents are yours alone. An organization API token lets scripts and AI agents register their own heartbeats.

How it works

Three lines to a watched worker

Create a heartbeat monitor, copy its ping URL into the job that must keep running, and let Appnatomy judge silence.

# A cron entry or a scheduled job, anywhere with outbound HTTPS
* * * * *  curl -fsS --max-time 5 https://appnatomy.com/ping/<your-token> > /dev/null

# Rails (GoodJob cron, once a minute)
Net::HTTP.get_response(URI("https://appnatomy.com/ping/<your-token>"))
StateMeaningWhat happens
UPPinged within its period, or the last probes succeeded.Nothing. Quiet is the goal.
LATEA ping was missed but the grace window has not run out, or one probe failed.Watched closely; no page yet.
DOWNPeriod plus grace exceeded, or the failure threshold reached.An incident opens and every contact is paged.
PAUSEDDeliberately silenced.No evaluation, no paging.
API

Everything the dashboard does, over JSON

Sign in and generate an organization token under Settings. Send it as a bearer token to the same endpoints the dashboard uses.

curl -H "Authorization: Bearer apn_…" https://appnatomy.com/api/monitors

curl -X POST -H "Authorization: Bearer apn_…" -H "Content-Type: application/json" \
  https://appnatomy.com/api/monitors \
  -d '{"monitor":{"name":"nightly-backup","kind":"heartbeat","period_seconds":86400,"grace_seconds":3600}}'

curl -X POST -H "Authorization: Bearer apn_…" -H "Content-Type: application/json" \
  https://appnatomy.com/api/monitors \
  -d '{"monitor":{"name":"api deep health","kind":"http","url":"https://example.com/api/health?deep=1","expected_json":{"ok":true}}}'
Why outside

A watcher that shares your failure domain reports nothing when it matters

Health checks that run inside the application go quiet in exactly the outages you most need to hear about: the job container dies, the database goes away, the box loses power, the chat webhook expires. Appnatomy runs on its own server, in its own region, with its own DNS and its own database, and pages through two independent vendors. The only assumption it makes about your system is that it can reach the internet once a minute.

Start monitoring