CronForge watches every scheduled task, detects silent failures and missed runs, and pages you on the channel you already use. One ping per job. Zero infrastructure.
// add one line to the end of your job await fetch("https://cronforge.io/ping/8f3a-cron-01")
# add one line to the end of your job requests.get("https://cronforge.io/ping/8f3a-cron-01")
// add one line to the end of your job http.Get("https://cronforge.io/ping/8f3a-cron-01")
# add one line to the end of your job curl https://cronforge.io/ping/8f3a-cron-01
CronForge is not a general-purpose observability platform. It does one thing: it tells you when a scheduled job stops behaving. Everything else is noise.
Each job gets a unique ping URL. CronForge expects a ping at the interval you define. If a ping doesn't arrive on time, you get an alert — no agent, no sidecar, no config file.
expect every 5m · grace 60s# job: nightly-backup 02:00:00 PING ok 200 12ms 02:05:00 PING ok 200 11ms 02:10:00 MISSED — grace 60s 02:11:00 ALERT slack #ops
Send a ping with an exit code and runtime. CronForge tracks p95 duration per job and flags regressions, so a job that silently slowed from 40s to 9m gets caught before it times out in production.
/ping/<id>?exit=0&dur=38.2{
"job": "nightly-backup",
"p50": 38.2,
"p95": 41.7,
"trend": "stable",
"regression": false
}Slack, PagerDuty, email, webhooks, and Discord. Route by job, by severity, by schedule. Escalate to PagerDuty only after two consecutive misses — no 3am pages for a flaky network blip.
route: slack → pagerduty (2 misses)# alert routing [[rule]] job = "nightly-backup" on = ["missed", "exit!=0"] [[rule.notify]] channel = "slack" target = "#ops" escalate_after = 2
Every job, every run, every exit code — streamed in real time. No refresh button. No polling. Just the terminal you already trust.
Every plan includes unlimited team members, all alert channels, and 90-day history. Upgrade when you add more cron jobs.