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.

Start free See how it works
No agent · no credit card · free plan forever
nightly-backup
$ backup.sh && curl -fsS https://culipulse.dev/ping/<your-url>
checked in 2m agoevery 1h + 10m grace
Silent past the deadline → down, and you get a Telegram alert.
How it works

Your job checks in. Silence means trouble.

You tell CuliPulse how often a job should run — say, every hour — plus a little grace for slow runs. You drop one line into the job to ping a unique URL when it finishes. As long as the pings keep arriving, all is well. Miss the window, and the monitor goes down and alerts you. It's the opposite of a normal check: here, no news is bad news.

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.

expected interval+ grace

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.

one curl lineany language

We alert on silence

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

Telegramauto-recovers
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

End your command with a fallback — job && curl …/ping || curl …/fail — and a failed run flips the monitor down immediately, instead of waiting for the silence window. Or report an exit code directly.

/fail/<exit-code>

Time how long it takes

Ping /start before the work and finish with a normal ping, and CuliPulse measures the run's duration. Set a limit and a run that takes too long is flagged — a job that's stuck or running away.

/startalert if too long
Two-minute setup

Copy one line. Watch it go green.

Create the monitor, and CuliPulse hands you a check-in URL plus a ready-to-paste snippet for your environment. The monitor's page shows a live "waiting for first check-in" that flips to ✓ received the moment your job pings — so you know it's wired correctly before you walk away.

crontabshellPythonNode.jsKubernetesGitHub Actions
Simple & safe

No agent. Just an outbound ping.

Nothing to install

A heartbeat is just an HTTP call from your own job — no agent, no inbound ports, no dependencies. If your job can reach the internet, it can check in.

A private check-in URL

The check-in URL carries a secret token — anyone with it can mark the job healthy, so keep it private. You can regenerate it any time to revoke the old one.

You decide what's watched

Heartbeats count as monitors on your plan like anything else. Add them when you want them; nothing is watched until you create it.

Stop guessing whether your cron ran.

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

Start free