Dead-man's switch for crons + workers. You can't detect your own absence — we can.
Register a Beat. Get a public ping URL. Hit it from your cron or worker on schedule. If we don't hear from you within (interval + grace), we open an incident, email you, and fire beat.missed into PhotonHooks. Same model as Healthchecks.io at half the price and with cross-product alerting through the rest of PhotonForge.
No credit card to start. Free · $9 · $19.
In your crontab
* * * * * curl -fsS https://beat.photonforge.io/v1/ping/pbt_<slug>Why PhotonBeat
Structural moat by definition
Self-hosted heartbeat monitoring is a contradiction in terms. The watcher has to be somewhere your job can't take down.
Slug-based anonymous ingest
No auth header on the ping endpoint. Knowledge of the URL is the auth. Any cron / curl / HTTP client just works.
GET + POST + HEAD all accepted
Drop into any cron syntax without thinking about HTTP method semantics. Even `wget --spider` works.
Defensive 200-on-error
If our DB is down, ping endpoint returns 200 ok anyway. Your cron never sees a 5xx that would look like YOUR job failed.
Features
Interval + grace window
expectedIntervalSeconds + gracePeriodSeconds. Configurable per beat.
GET + POST + HEAD ingest
Whatever your cron tool wants to send.
Labeled pings
/v1/ping/<slug>/<label> records the label as source. Useful when many workers ping the same beat.
BeatIncident records
Every missed window opens an incident, closes on next successful ping.
Email alerts
CSV recipients on every state change.
Hook events (Pro)
beat.missed + beat.recovered into PhotonHooks.
Slug rotation
If a URL leaks, rotate the slug in one click.
Ping history
Recent pings with timestamp + source + user-agent for debugging.
API + MCP
Full CRUD + on-demand 'run check' via REST and MCP tools.
Pricing
Pay for what costs us money.
Free
Enough to watch a handful of hourly crons + workers.
- 3 beats
- 1-hour minimum interval
- 7-day ping history
- Email alerts when a beat goes missed
- Anonymous slug-based ping URLs
- API + MCP access
Pro
Per-minute heartbeats + PhotonHooks integration for alerts.
- 50 beats
- 1-minute minimum interval
- 90-day ping history
- beat.missed / beat.recovered events into PhotonHooks
- Slug rotation in one click
Business
Real cron schedules + start/stop run tracking + groups.
- Everything in Pro
- 200 beats
- 1-year ping history
- Cron expression schedules (with timezone)
- /v1/ping/<slug>/start + /stop for duration tracking
- Groups + color tags for organizing many beats
- Run-duration anomaly alerts (coming soon)
Cancel anytime via the Stripe customer portal. No annual lock-in, no email-us-to-cancel routine.
Composes with
PhotonBeat talks to the rest of PhotonForge automatically.
- PhotonHooks — Pro tier fires beat.missed + beat.recovered events into Hooks.
Common questions
›How is this different from PhotonWatch?
Watch pulls (we hit your URL). Beat pushes (your job hits ours). Use Beat for 'did this thing run on schedule.' Use Watch for 'is this URL reachable.'
›Why anonymous slug auth instead of API keys?
Crons don't easily set Authorization headers. Slug-based auth lets `curl URL` work without extra flags. The slug is 16 random bytes (128 bits) and we always return 200 to prevent enumeration.
›What if my cron runs more often than the beat expects?
That's fine — extra pings just bump lastPingAt forward. The status stays UP. We only flip MISSED if (interval + grace) elapses with zero pings.