2026-10-24
A dead-man's switch for GitHub Actions and Vercel cron
Scheduled work fails closed when you make the schedule prove itself. A short pattern for Actions and Vercel.
Cron's failure mode is structural. The scheduler's job is to start you. If the platform skips the invocation, your script never gets a chance to report the skip. The check has to live outside the job.
GitHub Actions
Store the ping URL as an Actions secret. Ping /start when the job begins and, in a step that runs even on failure, ping the success URL or /fail based on job.status. The schedule on the monitor should match the workflow's cron, with enough grace for a cold runner.
Vercel cron
A route that both does the work and pings Nightshift still goes silent if Vercel never calls it. That is the point. Create the monitor with the same cron expression you put in vercel.json, and call the ping URL only after the work succeeds. If the platform misses the tick, Nightshift is the thing that notices.
Vercel's own cron runner is also what Nightshift uses to notice your missed ticks. On the Hobby plan that runner is daily, which is the wrong resolution for a minutely agent. Use a plan with minute crons, or an external scheduler and the CRON_SECRET bearer token.
Do not ping at the start and call it done
/start means the job began. It does not move the deadline and it does not clear a down monitor. If you only ping /start, a hung process looks the same as a healthy one until the original deadline passes. Ping success when the work is finished.