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.
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.
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.
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.
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.
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.
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.
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>"))
| State | Meaning | What happens |
|---|---|---|
| UP | Pinged within its period, or the last probes succeeded. | Nothing. Quiet is the goal. |
| LATE | A ping was missed but the grace window has not run out, or one probe failed. | Watched closely; no page yet. |
| DOWN | Period plus grace exceeded, or the failure threshold reached. | An incident opens and every contact is paged. |
| PAUSED | Deliberately silenced. | No evaluation, no paging. |
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}}}'
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.