Heartbeats

Know the moment a job stops running.

Some things can't be checked from the outside — a nightly backup, a queue worker, a cron job. So they check in with us instead: each run pings a unique URL. If a ping doesn't arrive on time, the job has gone quiet — and we tell you.

No agent · no credit card · free plan forever

The real CuliPulse page for a heartbeat monitor
Real console · demo workspace

How it works

Your job checks in. Silence means trouble.

You tell CuliPulse how often a job should run, plus a little grace for slow runs, and drop one line into the job to ping a unique URL when it finishes. Once the first check-in has arrived, miss the window and the monitor goes down and alerts you. Here, no news is bad news. Until the first check-in arrives, it only waits.

You set the schedule

Expect a ping every minute, hour, day — whatever your job's cadence is — with a grace period for the occasional slow run or clock skew.

Your job checks in

Add one line — a curl at the end of the run. The console gives you the exact snippet for crontab, a shell script, Python, Node, Kubernetes or GitHub Actions.

We alert on silence

Miss the deadline and the monitor goes down — with the same incident timeline and alerts as every other monitor. The next check-in clears it.

More than “did it run”

Report failures and time your runs.

A job that runs but errors is just as broken as one that didn't run at all. So a heartbeat understands more than a plain ping:

Signal a failed run. Send your job's exit code with the check-in: 0 means it worked, anything else flips the monitor down immediately, instead of waiting for the silence window. One request per run, so a check-in lost to a network blip is never reported as a failed job — if nothing arrives before the grace period ends, you get the normal missed-check-in alert. Or call /fail from your own error handler.

Time how long it takes. Ping /start before the work and report the exit code as above when it finishes, and CuliPulse measures the run's duration, from /start to the finishing check-in. Set a limit and a run that sent /start and takes longer than that to finish is flagged. The ready-made snippets add the /start line for you once a limit is set.

# report the exit code: 0 = it worked, anything else = failedbackup.sh; curl -fsS -m 10 --retry 3 https://culipulse.dev/ping/<token>/$?# time the run: /start first, then report as abovecurl -fsS https://culipulse.dev/ping/<token>/startbackup.sh; curl -fsS -m 10 --retry 3 https://culipulse.dev/ping/<token>/$?

Two-minute setup

Copy one line. Watch it go green.

Create the monitor, and CuliPulse opens on your check-in URL plus a ready-to-paste snippet for your environment: crontab, shell, Python, Node.js, Kubernetes or GitHub Actions, with the schedule filled in for your interval.

The monitor's page shows it waiting live for your job's first ping, then flips to ✅ First check-in received the moment it arrives — so you know it's wired correctly before you walk away. Until then it says plainly that it isn't watching yet.

The real check-in panel: the URL, a ready-to-paste snippet and the received state
Real console · demo workspace

Coming from a dedicated cron monitor? CuliPulse vs Healthchecks.io.

Stop guessing whether your cron ran.

Create a heartbeat, paste one line into your job, and let silence do the alerting.