PYLONMON

Zero to hero: monitor 3 servers on the free plan in 5 minutes

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.

The setup I want to watch

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.

1. Create a free account

Sign up takes one form. No credit card on the free plan — you just land in the portal.

pylonmon.com/portal?signup=1
Create your workspace
Free forever · no card required
josh@joshualeeglass.com
••••••••••••
••••••••••••
Create account →

The free plan covers 20 monitors, 3 pylon-beacon nodes, and one alert channel — plenty for a homelab.

2. Set up alerts before anything breaks

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:

pylonmon.com/portal · Alerts
MonitorsAlertsSettings
1 / 1 ALERT CHANNELS
✉️My emailjosh@…glass.com
EMAILDISABLED
0 monitors send test

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):

pylonmon.com/portal · Alerts · add channel
✉️ Email 🔔 Web push Discord # Slack 💬 Google Chat 👥 Teams 🟢 Webex 📨 ntfy.sh ⚡ Zapier ✈️ Telegram 🚨 PagerDuty 🧭 Opsgenie 🔗 Webhook 📱 SMS 📞 Voice
https://discord.com/api/webhooks/1246…/9f3aK2…
#homelab

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.

3. Turn on the API (we'll grab the key in a sec)

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.

pylonmon.com/portal · Settings · API keys
Workspace API keys
homelab-beacons
ingest — push only ▾
+ New key
homelab-beacons ingest ••••••9c4b1d never used

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.

4. Create a beacon template

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:

pylonmon.com/portal · Monitors · new template
Beacon — template (seeds new beacon nodes) ▾
homelab-default
#homelab
Create template

Every node that checks in now auto-pages #homelab if it goes quiet — no per-server clicking.

5. Install the agent on the first Pi

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: ~
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):

pylonmon.com/portal · Settings
homelab-beaconsingest ••••••9c4b1d copied ✓

Click to copy. Paste into the terminal, hit Enter, and:

josh@home-pi01: ~
? 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:

pylonmon.com/portal · Monitors
home-pi01beaconUP · just now

Zero clicks to create it. The beacon checked in, matched the template, and appeared.

6. Repeat on the other two

Same one-liner on home-pi02:

josh@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:

josh@cloud-server01: /etc/pylon-beacon.conf
# /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:

pylonmon.com/portal · Monitors
home-pi01beaconUP · 2m ago
home-pi02beaconUP · 1m ago
cloud-server01beaconUP · just now

Three servers, three green dots. Each one auto-pages #homelab the moment it stops checking in — "the silence is the signal."

7. Alert on more than just "is it up?"

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:

pylonmon.com/portal · cloud-server01
Node vitals · cloud-server01
CPU11%
Memory38%
Disk71%
web_up1
web_ms142 ms
ssh_failed_1h3

I add vital threshold alerts right here — no config files, just pick a metric and a condition. Three that matter to me:

pylonmon.com/portal · cloud-server01 · vital alerts
web_upis below 1 → page #homelab
ssh_failed_1his above 60 → page #homelab
diskis above 90% → page #homelab

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.

💬 A minute later, in Discord: a test threshold fires and #homelab lights up — "🔴 cloud-server01 · ssh_failed_1h is 74 (> 60)." That's the whole point: I didn't have to be watching. PylonMon was.

That was ~5 minutes

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 →

🔒 About the keys in this post: yes, the API keys, webhook URLs, and hostnames shown in the screenshots above were from a real throwaway walkthrough — and every one of them has since been rotated and revoked. Nothing you see here still works. Rotating a key in PylonMon is itself one click (Settings → the ↻ button on any key), which is exactly what you should do the instant a key ever lands somewhere it shouldn't… like a blog post. 😄