You run a small service — a side project, a personal status page, a Cloudflare Worker, a Vercel deployment — and you'd like a daily "yes, it's still up" ping without paying for UptimeRobot. This template fires every morning at 9 AM, sends a GET to a URL you configured in env, and pops a desktop notification with the HTTP status code. Lightweight, no third-party service, no monthly bill. Good for indie devs with a handful of services and no monitoring SLA to chase.
How this workflow works
Three blocks. The trigger runs in the background as long as Chrome is open; the rest is one request and one notification.
schedule_trigger— Cron mode,cron: "0 9 * * *"(every day at 9:00 in your local timezone). The workflow fires automatically without needing the sidepanel open. Important caveat: Chrome must be running for the cron to fire; if your laptop is closed at 9 AM, the trigger fires when Chrome next wakes.http_request— AGETagainst{{env.UPTIME_URL}}. You set this env var once via Settings → Env.timeoutMs: 10000aborts after 10 seconds (slow responses count as down). Critically,failOnHttpError: falsemeans a 500 or 404 doesn't halt the workflow — we want the status code regardless of whether it's success or failure.responseType: "auto"parses JSON if the response is JSON, otherwise leaves it as text.notification— Chrome native notification. Title is"Uptime check"; message interpolates{{$('GET the URL').status}}— the numeric HTTP status code from the previous request. You'll see a small popup in your OS notification corner.
If the request times out or fails entirely (DNS failure, refused connection), status is undefined or 0, which still produces a notification — useful for catching outages.
Customising it for your case
A few standard adjustments.
- Change the schedule. Edit the
cronfield.0 */2 * * *runs every 2 hours;0 9,14,19 * * *runs at 9, 2, and 7 PM daily;*/15 * * * *runs every 15 minutes (aggressive — see gotchas). For interval-style timing instead of cron, changemode: "interval"and setintervalMs: 3600000(60 minutes). - Add status-aware notification copy. Right now you get
"Status: 200"or"Status: 502". Use aif_thenblock to branch: if status is 2xx, message says "OK"; otherwise "DOWN — status {{...}}". The branching makes the notification more glanceable. - Check multiple URLs. Duplicate the
http_request+notificationpair, point the second at a different env var (env.UPTIME_URL_2). Or, more elegantly, wrap the pair in aloopover an array of URLs stored inset_variable.
Common gotchas
Three honest issues. First: cron only fires when Chrome is running. If you close your browser at night, the 9 AM check fires when Chrome next opens (could be much later). For 24/7 monitoring you need a real server-side tool — this template is a lightweight supplement, not a replacement for proper monitoring. Second: very frequent schedules (*/15 * * * *) cause battery drain because the extension's service worker has to wake every 15 minutes. Keep schedules to once an hour or less unless you really need it. Third: HTTP 200 doesn't always mean "the site is working" — a misconfigured nginx can serve a 200 default page even when your app is dead. For real uptime checks, target a specific health endpoint that exercises the app's data layer.
FAQ
Do I need a paid plan to use cron triggers? No. schedule_trigger is part of the free tier and runs locally — there's no server-side scheduling involved.
What happens if Chrome is closed when the cron fires? The trigger is missed silently. When Chrome reopens, the next scheduled fire works normally. There's no "make-up" run.
How does this compare to UptimeRobot, Pingdom, or BetterUptime? Those are real monitoring services with 1-minute resolution from multiple geographic regions and SMS alerts. This template is a personal-use checker that only works while your laptop is open. Use both — this for casual awareness, the paid services when you actually have a customer-facing SLA.