Recipes
Each recipe takes one kind of scheduled job from unmonitored to a working heartbeat check: a matching schedule, a private ping URL, a report that’s sent only when the job succeeds, and a test run to confirm it. Pick your scheduler and follow the steps.
| Your job runs on | Recipe |
|---|---|
| Cron on a Linux or macOS server | Crontab |
| Kubernetes | Kubernetes CronJob |
| Laravel | Laravel scheduler |
GitHub Actions schedule |
GitHub Actions |
| Rails (Solid Queue or Sidekiq) | Rails recurring jobs |
| Django or Python with Celery | Celery beat |
| systemd on a server or homelab | systemd timers |
| PostgreSQL or MySQL backups | Database backups with a size check |
| Node.js (node-cron or BullMQ) | Node.js scheduled jobs |
| Vercel | Vercel Cron Jobs |
| AWS (Lambda or ECS) | AWS EventBridge Scheduler |
| GitLab CI pipeline schedules | GitLab CI |
| restic or BorgBackup | restic and BorgBackup |
| Synology, TrueNAS or Unraid | NAS task schedulers |
| Cloudflare Workers | Cloudflare Workers Cron Triggers |
| Google Cloud (Cloud Run jobs) | Google Cloud Scheduler |
| Windows servers | Windows Task Scheduler |
| Apache Airflow | Airflow DAGs |
| Spring Boot (or Quartz) | Spring Boot scheduled tasks |
| .NET with Hangfire | Hangfire recurring jobs |
| Azure Functions | Azure Functions timer triggers |
| Jenkins | Jenkins scheduled builds |
| Render or Heroku | Render and Heroku cron jobs |
Prefer one command to a wrapper script? The open-source
pingstack command wraps any job on macOS,
Linux or Windows and reports success, failures with their output, and run
times: pingstack run -- ./backup.sh.
Using an AI coding agent? Let Claude Code or Cursor, Copilot and other MCP clients add monitoring to your jobs: they create the check over MCP and add the report step for you.
Don’t see your scheduler? Any job that can make an HTTP request when it finishes works. Follow your first scheduled job and the general heartbeat recipes.