If your home internet drops while you’re out, everything you self-host goes with it — Home Assistant, cameras, backups, the VPN back in — and nothing tells you. The fix is one cron line on your router and an off-site service that treats silence as the alarm. Total cost: free. Time: about five minutes.
The obvious approaches all share one flaw. A ping script on your NAS, a speed-test widget, an uptime container on the LAN — every one of them needs the internet to be up to tell you the internet is down. When the WAN link dies, the messenger dies with it. You get no alert, for exactly the outages you most wanted the alert about.
So the connection has to be turned around. Instead of something inside checking the internet, something inside proves it’s alive to a watcher outside — a tiny HTTP request on a schedule, called a heartbeat. The off-site watcher’s only job is to notice when the check-ins stop. That’s a dead-man’s switch: it requires nothing from your network at the moment of failure, which is precisely why it survives the failure.
You could send the heartbeat from a Raspberry Pi or your NAS, and that works — but then a dead Pi and a dead internet connection look identical. The router is the one device whose “alive and reaching the internet” is the fact you’re trying to monitor. If the router’s heartbeat arrives, your WAN link works, DNS resolves, and traffic is flowing end to end. If it goes quiet, the internet is down at your house — or the router itself died, which you also want to know.
Most home routers people actually chose on purpose can do this out of the box. GL.iNet devices (Flint, Flint 2, Beryl, Slate) run OpenWrt under the hood; so do many others, natively or reflashed. Anything with SSH and cron qualifies.
In PylonMon: Add monitor → Heartbeat. Name it after the link (“Home Internet”, “Flint 2 Internet”), set the period to 2 minutes, and save. The monitor waits amber until its first check-in, and its card gives you a private check-in URL:
curl -fsS https://pylonmon.com/hb/f3ab2c17d0e94b21The monitor arms itself on the first check-in — nothing else to configure.
GL.iNet (Flint 2 or any model): the friendly way is the web UI — LuCI at System → Scheduled Tasks (on GL.iNet firmware, reach LuCI via “Advanced Settings”). Paste one line and save:
# prove the WAN link is alive, every 2 minutes
*/2 * * * * wget -q -O /dev/null https://pylonmon.com/hb/YOUR-IDThat’s busybox wget, which ships on every OpenWrt build — nothing to install. If you prefer SSH, the same line goes in with crontab -e as root, followed by /etc/init.d/cron restart. On routers where you’ve installed curl (opkg install curl), the equivalent is:
*/2 * * * * curl -fsS https://pylonmon.com/hb/YOUR-ID
Within two minutes the card flips green. Each check-in is stamped with the address it arrived from — your WAN IP, which is its own quiet bonus: a running log of every time your ISP rotates it.
A 2-minute beat with a 1-miss threshold pages you about three to four minutes into an outage — and will occasionally page you about a 90-second ISP hiccup that fixed itself. Both settings are yours to tune, and the honest guidance is:
| You want | Period | Alert after | Pages you in |
|---|---|---|---|
| To know about every blip (ISP evidence) | 2 min | 1 missed | ~4 min |
| Real outages only, few false alarms | 2 min | 2 missed | ~6 min |
| A calm “the house is offline” signal | 5 min | 2 missed | ~12 min |
Brief blips that recover before the threshold still land in the monitor’s timeline — they just don’t page you. That’s the right split: your phone only buzzes for outages, the record keeps everything.
When the check-ins stop, the card goes red and the page goes out — by a route that never touches your house:
Every outage becomes a row in the monitor’s history with a start, an end, and a duration. After a bad month you’re no longer telling your ISP “it feels like it drops a lot” — you’re reading them a list: eleven outages, timestamps, durations, longest 38 minutes. Support calls go differently when one side has receipts.
The single heartbeat deliberately bundles failure modes: silence means the house is unreachable, whichever layer died. If you want the alert to tell you which one, add a second signal from a different box:
Two monitors, and suddenly the 3am question “is it the ISP or did the Pi lock up again?” answers itself from your phone. Three machines are free, so this costs nothing.
| Step | Where | What |
|---|---|---|
| 1 | PylonMon | Add monitor → Heartbeat → period 2 min → copy the /hb/ URL |
| 2 | Router | LuCI → System → Scheduled Tasks → paste the wget line |
| 3 | PylonMon | Watch it flip to up, set the miss threshold, pick your alert channel |
Alerts on vital signs are free on every plan — that includes this heartbeat. If you want the pages to land somewhere nicer than email, route them into a Discord channel; if the thing you host has no public address at all, the same trick generalises: monitoring a server with no public IP.