Comparison · vs Cronhub

Cronhub shut down. Run the job yourself.

Cronhub closed on 30 June 2026 and took its scheduler and heartbeat monitors with it. If you used it to fire jobs, RunWisp runs them for you. If you used it as an off-box watchdog, you still need one, and a daemon on the same box can't be it.

Verdict

Should you switch?

The 10-second version. Skim, decide, scroll down for the receipts.

Use RunWisp if

  • You used Cronhub's scheduler to fire jobs over HTTP. RunWisp runs the command itself, with no webhook in between.
  • You want the real stdout/stderr and exit code, not “a ping arrived.”
  • Job metadata shouldn't live on a third party's servers.
  • The box is air-gapped, on-prem, or behind a strict egress firewall.
  • You also need long-running services supervised, not just jobs watched.

Keep a separate monitor if

  • You need a watchdog that survives the whole box dying, the one thing an on-host daemon can't do.
  • You watch jobs across many machines and want one hosted pane of glass.
  • You monitor cron you don't control: a managed platform, someone else's server, a router.
  • Public, hosted status pages are part of what you need.
Head to head

Yes / no, at a glance

Yes / no — and both columns win on something.

Capability Heartbeat monitor RunWisp
Runs the job itself ✗pings / HTTP triggers ✓executes the command
Captures stdout / stderr + exit code ~ping, at best a body ✓
Data stays on your box ~hosted, or self-host it ✓local SQLite
Works with no outbound internet ~only if self-hosted ✓
Cron scheduling ✓ ✓5/6-field + aliases
Retries with backoff ✗ ✓constant / linear / exp
Overlap policy ✗ ✓skip / queue / kill
Long-running services ✗monitoring only ✓[services.*]
Failure notifications (Slack, email) ✓ ✓
Dashboard ✓hosted ✓self-hosted Web UI + TUI
External watchdog survives host death ✓pings from off-box ✗runs on the host
Zero install / nothing to run ✓ ✗ship a binary
No server to maintain ✓hosted ✗you run the daemon
Public status pages ✓ ✗
One pane of glass across many machines ✓ ~one daemon per host
Monitors cron you can't supervise ✓managed platforms, routers ✗
Trade-offs

Pros & cons

What a heartbeat monitor does better

  • It sits off-box, so a dead host is exactly what it catches.
  • Nothing to install or run. Sign up, paste a URL into your crontab, done.
  • One place to watch jobs across dozens of machines.
  • Monitors cron you can't put under a supervisor: a managed platform, someone else's server, a router.
  • Hosted dashboards and public status pages, maintained for you.

What RunWisp adds

  • Runs the actual process. “It ran” and “it succeeded” are the same fact, not a ping you hope fired.
  • Real exit code, duration and stdout/stderr on every run, with no && curl to bolt on or forget.
  • Schedule, timing and captured logs stay in local SQLite. Nothing leaves the box, and nothing needs the internet.
  • Retries with backoff, on_overlap and catch-up after downtime: the job's behaviour, not just its heartbeat.
  • A firing missed while the daemon was down shows up as a missed run and alerts, instead of going quiet.
  • Coalesced failure alerts: five flaps become one message plus a summary.
  • Supervises long-running services in the same config.
The simple case

The simple case

Nightly backup at 03:00. A heartbeat monitor waits for a ping the job has to send; RunWisp runs the job and records exit code, duration and output on its own.

crontab + heartbeat ping
# crontab -e, with a heartbeat ping bolted on (Healthchecks.io URL shape)
0 3 * * *  /usr/local/bin/backup.sh \
    && curl -fsS https://hc-ping.com/<uuid>
runwisp.toml
# runwisp.toml, the daemon runs it and records the result
[tasks.nightly-backup]
cron = "0 3 * * *"
run  = "/usr/local/bin/backup.sh"
Production-grade

The version that runs in prod

Same backup, hardened. On the left the timing is start/finish pings and the policy (grace period, alert routing) lives in the monitor's dashboard. On the right every knob is a named field in a file you commit to git.

crontab + heartbeat ping (production)
# crontab: start + finish pings so the monitor can time the run.
# Grace period, alert routing and the expected schedule
# all live in the monitor's dashboard, not in this file.
0 3 * * *  curl -fsS https://hc-ping.com/<uuid>/start; \
    /usr/local/bin/backup.sh \
    && curl -fsS https://hc-ping.com/<uuid> \
    || curl -fsS https://hc-ping.com/<uuid>/fail
runwisp.toml (production)
# runwisp.toml, every knob is config-as-code, in git
[tasks.nightly-backup]
description       = "Snapshot the data volume to off-site storage"
cron              = "0 3 * * *"
on_overlap        = "skip"            # never two backups at once
timeout           = "55m"             # a hung run fails, not runs forever
retry_attempts    = 2
retry_delay       = "30s"
retry_backoff     = "exponential"
keep_runs         = 60                # two months of history
notify            = ["slack-ops"]
run               = "/usr/local/bin/backup.sh"
Migration

If you used Cronhub

Cronhub had two halves, a scheduler and a monitor. RunWisp replaces the first. The second, an off-box watchdog, is the one thing it can't map.

Cronhub RunWisp
Scheduler: HTTP request on a schedule [tasks.*] with cron = and run =. The command runs directly.
&& curl …/ping/<uuid> in a crontab Drop it. The ping host is gone, and RunWisp records the real exit code.
Grace period (dashboard) timeout = "55m" plus crashed-run detection
Expected-schedule alert cron =; a firing missed during downtime rides catch_up + notify
Hosted dashboard Self-hosted Web UI, or runwisp tui over SSH
Email / Slack integration notify = ["slack-ops"] (Slack, Telegram, Discord, ntfy, email, webhook)
Monitor status healthy / failing Run-history rows: status, duration, exit code, captured logs
One dashboard watching N machines One runwisp per host. You gain local capture and lose the single pane of glass.
Off-box dead-man's switch No equivalent. Pair RunWisp with a separate heartbeat monitor (see below).
Gotchas

Gotchas

If the box dies, RunWisp dies with it

RunWisp runs on the host it watches. It catches a failed run, a crash, or a firing missed while the daemon was down (that lands as a missed run and rides notify). But if the whole machine loses power or its network, nothing on it can send the alert. That silence is what an off-box heartbeat is for. If total host death is in your threat model, add one: Healthchecks.io is open source and self-hostable, and Cronitor and Better Stack offer hosted heartbeats. The two aren't mutually exclusive.

Old ping lines now fail quietly

Cronhub's ping URLs no longer answer. A crontab line ending in && curl …/ping/<uuid> still runs the job, then fails at the curl, and nothing tells you. Remove those lines when you move the job.

A ping is not the work

A heartbeat is a proxy for the job. If the job crashes after the ping, or the && curl is dropped in a refactor, the dashboard stays green. RunWisp runs the process, so the exit code it records is the job's.

Use both

Keep RunWisp as the runner and add a heartbeat as the watchdog: run = "backup.sh && curl -fsS https://hc-ping.com/<uuid>". RunWisp handles retries, overlap and history on the box. The monitor shouts if the box, or RunWisp itself, goes silent.

FAQ

FAQ

Did Cronhub really shut down?
Yes. Cronhub announced that it would close on 30 June 2026, cancelled paid plans on 31 May, and said all data would be deleted afterwards. cronhub.io no longer responds, so any ping or scheduler URL you still have pointing at it is dead.
What replaces Cronhub's scheduler?
RunWisp, if the job runs on a machine you control. Cronhub's scheduler fired an HTTP request at a time you chose and left the rest to you. RunWisp puts the schedule and the command in one [tasks.*] stanza and executes it directly, so there's no receiver to keep up and no gap between “the request fired” and “the job ran.”
What replaces Cronhub's heartbeat monitoring?
A separate heartbeat monitor. Healthchecks.io is open source and can be self-hosted, and it also has a hosted free tier. Cronitor and Better Stack offer hosted heartbeats. RunWisp watches from inside the box, so it can't catch total host death. See the “Use both” note above.
If my server goes down, does RunWisp still alert me?
Not for total host death. RunWisp catches a failed run, a crash, or a firing missed while the daemon was down, and that lands as a missed run and rides notify. If the whole machine loses power or its network, nothing on it can send an alert. Keep an off-box watchdog for that case.
Can I run RunWisp alongside a heartbeat monitor?
Yes, and it's a good setup. Keep the ping at the end of the task's run command, add the RunWisp task, and compare for a week. RunWisp shows you the real exit codes while the monitor watches for silence.
Does RunWisp cost anything?
The daemon is GPL-3.0-or-later and free to self-host: no license key, no locked features, no per-job pricing. You run it on hardware you already have.
Does the same binary work on macOS, WSL, and Docker?
Yes. One Go binary, no runtime and no account, with the same TOML and Web UI port on Linux, macOS, WSL and Docker. The autostart wrapper is the only platform-specific part: a systemd unit on Linux, a launchd plist on macOS, the entrypoint in a container.
Get started
GPL 3.0 · no accounts · free to self-host

Cronhub is gone. Run the job, keep the receipts.

Install the binary, put your schedule and command in one runwisp.toml stanza, and watch the first run (exit code, duration, logs) land in your own dashboard.

Install in 30 seconds
curl -fsSL https://get.runwisp.com | sh