Two Raspberry Pis at home, one cloud web server, one Discord channel full of peace of mind — and not a cent spent. Here's every click.
Before any tool, here's the honest, unglamorous homelab this is protecting — three machines that quietly matter:
None of these are mission-critical to anyone but me — which is exactly why I don't want to pay enterprise monitoring prices to watch them. Free plan it is. Let's go.
Sign up takes one form. No credit card on the free plan — you just land in the portal.
The free plan covers 20 monitors, 3 pylon-beacon nodes, and one alert channel — plenty for a homelab.
Straight to the Alerts tab. By default every new workspace emails you — but my inbox is where alerts go to die, so I'll pause the email channel and route everything to Discord instead. The free plan can't send SMS, but a Discord webhook? Totally free and instant.
First I pause email — each channel row has a set of controls (a monitor count, send test, pause/resume, settings, and delete). I click the pause button:
Now it reads DISABLED — no more inbox noise. Notice each channel also shows how many monitors use it and a one-click send test. Now let's give alerts somewhere better to go.
Now I click + new channel, pick Discord, and paste a webhook URL from my server (Discord → Server Settings → Integrations → Webhooks → New Webhook → Copy URL):
The free plan integrates Discord, Slack, Telegram, ntfy, and browser push — SMS and voice are the paid upgrades. For a homelab, Discord is honestly perfect.
The agent I'm about to install pushes data to PylonMon, so it needs an API key. In Settings, I flip on Workspace API keys and create one scoped to ingest — the safest kind: it can push metrics and do literally nothing else, so it's fine to sit on every box.
The key is masked (six dots + its last characters); one click on it copies the full key. "+ New key" only lights up green once the name is filled and unique. Ingest keys are push-only — they can't read your monitors or change a thing.
Here's the trick that makes this fast. Instead of configuring each server by hand, I make a beacon template once — it sets the alert channel, incident policy, and vital thresholds that every new node inherits automatically the moment it checks in. On the Monitors tab I choose Beacon — template and, crucially, point it at my new #homelab Discord channel:
Every node that checks in now auto-pages #homelab if it goes quiet — no per-server clicking.
The template page hands me a one-line install command. I SSH into the first Pi and run it. The install needs root, so I wrap it with sudo:
josh@home-pi01:~$ curl -fsSL https://pylonmon.com/beacon.sh | sudo sh ✓ downloading pylon-beacon (linux/arm64)… ✓ installed /usr/local/bin/pylon-beacon ✓ wrote /etc/pylon-beacon.conf ? Paste your ingest API key: _
It installs a static binary + a systemd service in about two seconds, then asks for the key.
Where's the key? Back in the portal, I just click the API key field — one click copies the full key to my clipboard (it's masked on screen, so it's safe to do on a shared screen):
Click to copy. Paste into the terminal, hit Enter, and:
? Paste your ingest API key: •••••••••••••••• ✓ key saved · starting pylon-beacon.service ✓ home-pi01 online · cpu 3% · mem 41% · disk 22% · 47°C 2026/07/21 00:12:03 pushed 8 metric(s)
I flip back to the Monitors tab and it's already there, auto-created from the template, live within seconds:
Zero clicks to create it. The beacon checked in, matched the template, and appeared.
Same one-liner on home-pi02:
josh@home-pi02:~$ curl -fsSL https://pylonmon.com/beacon.sh | sudo sh ✓ installed · home-pi02 online · cpu 8% · mem 63% · disk 55%
For cloud-server01 I want a bit more, since it's public-facing. Before running the installer I add a couple of custom metrics to /etc/pylon-beacon.conf — the beacon runs any shell command and reports the first number it prints. I want failed SSH attempts in the last hour, plus whether Caddy (my web server) is actually up:
# /etc/pylon-beacon.conf [custom] ssh_failed_1h = journalctl -t sshd -t sshd-session --since -1h -q | grep -cE 'Failed password|Invalid user' web_up = curl -so /dev/null -w '%{http_code}' --resolve joshualeeglass.com:443:127.0.0.1 https://joshualeeglass.com/ | grep -q '^2' && echo 1 || echo 0 web_ms = curl -so /dev/null -w '%{time_total}' --resolve joshualeeglass.com:443:127.0.0.1 https://joshualeeglass.com/ | awk '{printf "%d",$1*1000}'
The --resolve …:127.0.0.1 trick times the site locally, so I'm measuring my server's real response speed without DNS round-trips muddying the number.
Then the same install one-liner, and all three are live:
Three servers, three green dots. Each one auto-pages #homelab the moment it stops checking in — "the silence is the signal."
Now the fun part. I open cloud-server01 and there's a live Node vitals grid — every metric the beacon pushes, including my two custom ones:
I add vital threshold alerts right here — no config files, just pick a metric and a condition. Three that matter to me:
Now Discord pings me if my website returns a non-2xx, if SSH sees a brute-force spike, or if the disk is about to fill — the stuff that actually wakes a sysadmin at 3am, watched for free.
Let's tally what "my" three servers now have, on the $0 free plan:
Total spend: nothing. Total time: about five minutes, most of it spent SSH-ing between machines. And upgrading later is one click — the moment I want SMS or voice calls at 3am instead of a Discord ping, Pro is $4/month and everything I just built carries straight over.
That's zero to hero. Your important services, actually watched — start free →