Skip to content

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.