ProbeGlass

Self-hosted · Single binary · SQLite

Know when something
in your homelab breaks.

ProbeGlass watches your servers, services and network, and tells you the moment one of them stops answering. It is one container, one database file, and about three megabytes of memory — smaller than the thing it is watching.

  • ~14 MB binary
  • ~3 MB RAM idle
  • amd64 · arm64 · armv7
  • MIT licensed
Illustration of the ProbeGlass dashboard: a top bar with the section tabs, the layout switcher and the account chip, then a status summary, then groups of sensor cards each showing a name, a target, a response time and a sparkline.
The dashboard. Illustration, not a screenshot.
7sensor types
6alert channels
7 d / 90 d / ∞history tiers
1file to back up

What it does

The parts of a monitoring setup you actually use, without the parts you have to operate.

Seven kinds of sensor

HTTP and HTTPS with a status range, a body match and a size cap. TCP with optional TLS and a send/expect exchange. TLS certificates and their expiry. ICMP ping. DNS lookups against the resolver you name. Docker containers, health and restart counts. Single-OID SNMP from a switch or a router. Configured in the web UI, or declared in a YAML file.

Alerts that reach you

Telegram, Discord, Matrix, ntfy, Slack, and generic webhooks with an HMAC signature. Retries before an outage is declared, a reminder while it lasts, and a recovery message that names the real downtime.

History that stays

Raw samples for seven days, hourly rollups for ninety, daily rollups forever. Uptime percentages stay correct at every zoom level, because exactly one resolution answers any given range — no sample is ever counted twice.

A dashboard you can arrange

Dark, light or follow the system. Six accent colours, two densities, and five ways to look at the same sensors — cards, a list, a tree folded by site and then by group, a wall of tiles with a heartbeat, or a map of where everything physically sits — coastlines, lakes and rivers, country borders, Austria's districts and the names of countries, provinces and cities, all drawn from data in the binary with nothing fetched. Preferences follow the account. It updates over Server-Sent Events, so a probe landing changes the view without a reload and without polling.

Scriptable, not locked down

Every request the browser makes, curl can make. An API key for scripts and Home Assistant, or a session cookie for people. Live events stream over SSE for anything that wants to subscribe.

Config as code

Sensors and channels can live in a YAML file next to the database. A rebuild from zero takes seconds, and a file that declares a channel which does not exist is a startup error rather than a silent misconfiguration.

The tour

What the three screens you will spend your time on look like. These are illustrations drawn from the real interface, not screenshots.

The dashboard: a top bar with the layout switcher and the account chip, a summary strip of counts, then sensor cards in groups, each with a status dot, a response time and a latency sparkline.

Dashboard

Every sensor as a card, grouped the way you grouped them, each with its current state, response time and a sparkline of the last few probes. Anything failing sorts to the top of its group. Four more views sit behind the switcher in the top bar: a list, a tree folded by site and then by group, a wall of tiles with a heartbeat, and a map of where the places physically are — drawn from data in the binary, coastlines, lakes and rivers, country borders, Austria's districts, and the names of countries, provinces, districts, cities and towns included.

A sensor detail view: a response-time chart over 24 hours, an uptime bar for the last thirty days, and a list of recent results.

One sensor, in detail

A response-time chart across 1 hour to a year, an uptime bar for the same window, latency percentiles, and the list of recent results — including what the server said when it said no.

An alert message in a chat app: a sensor named NAS went down, the error that was returned, the time it started, and a link back to the dashboard.

The alert

Short enough to read on a lock screen: what broke, what it answered, since when, and a link straight to the sensor. The recovery message names how long it was actually down.

These are drawings. If you would rather click the real thing, the whole dashboard runs in your browser on invented data — open a sensor, follow a chart across a week, acknowledge an incident.

Open the live demo

Sensor types

Each one has its own options; these are the shapes, not the whole set. The full list is in the documentation.

TypeTargetWhat it does
http https://nas.lan:5001/health Requests the URL and checks the status against an expected range (200-399 by default, also accepts 2xx and comma-separated lists), optionally matches the body and caps how much of it is read.
tcp nas.lan:445 Opens a connection and closes it, optionally over TLS. Can send a line and wait for a reply, for protocols older than health endpoints.
tls nas.lan Connects for the certificate alone and reports the days left. Separates a name that does not match, a certificate that has expired, and a chain this host does not trust — three failures that usually arrive as one.
ping 192.168.1.1 Sends ICMP echo requests and reports the round trip. Tries an unprivileged datagram socket first, so it usually needs no extra capability.
dns nas.lan via 192.168.1.53 Resolves a name against a specific resolver, optionally expecting particular records. Catches the failure where everything is up but nothing can be found.
docker homeassistant One read-only call to the Docker Engine API for one container: is it running, what did its HEALTHCHECK say, how often has it restarted. It never starts, stops or changes anything.
snmp 192.168.1.2 One GET of one OID over v2c, checked against a substring or a numeric range. Enough for a switch, a router or a NAS — deliberately not a walk, not traps and not v3.

Alert channels

Pick per sensor. One noisy service can shout at Telegram while the rest goes quietly to a webhook.

ChannelMinimum to configureAlso
TelegramBot token, chat IDMessage template
DiscordWebhook URLMessage template
MatrixHomeserver, access token, room IDMessage template
ntfyTopicServer, priority, access token
SlackIncoming webhook URLMessage template
WebhookURLHMAC secret, custom headers

Credentials are never returned by the API. Every secret field comes back as a marker, and sending that marker back preserves the stored value — so a token is never in a browser cache, a proxy log or a screenshot.

Install

One container. Then open it and set a password.

Docker

docker run -d \
  --name probeglass \
  --restart unless-stopped \
  -p 8080:8080 \
  -v probeglass-data:/data \
  ghcr.io/j000k3r/probeglass:0.2.1

Open http://localhost:8080 and set a password in the setup wizard. Add --cap-add NET_RAW only if you want to use ICMP ping sensors; without it ProbeGlass falls back to an unprivileged ping and tells you in the result if that is not available either.

The image is on the GitHub Container Registry and is public, so no account and no docker login is needed. 0.2.1 is the exact version and never changes under you; 0.1 follows its patch releases and latest the newest release of all. Every build also carries the commit it was made from — pick a sha-… tag there if you want one exact build, and dev if you want whatever is in the tree today.

Compose

git clone https://github.com/j000k3r/probeglass.git
cd probeglass
docker compose up -d

Look at it with data in it

An empty dashboard says very little about whether you want this. The demo seed writes a set of sensors and a week of synthetic history, so you can see the charts without waiting for a week to pass.

docker run --rm -v probeglass-demo:/data \
  ghcr.io/j000k3r/probeglass:0.2.1 seed --demo

How it compares

There are good monitoring tools already. This one exists for the case where you want the monitoring to be smaller than the thing it monitors.

ProbeGlassA typical container-based monitor
Memory at idle~3 MB200–400 MB
InstallOne containerContainer plus a database container
DataOne SQLite file you can copyA database server, or a volume of JSON
Frontend buildNone — embedded in the binaryUsually a Node build step
Works with no internetYes, entirelyOften depends on a CDN for assets

Questions that come up

Does it need a database server?

No. It uses SQLite through a pure-Go implementation, so there is nothing to install alongside it. The database is one file.

Why does a failed probe say “Flaky” and not “Down”?

Because at that moment the honest answer is that the last probe failed and it has not failed often enough to call it down. With retries configured, one failed probe is a blip. It becomes Down when the failure streak reaches the threshold — and that is when the incident opens and the alert goes out.

Can I keep history for longer than 90 days?

Yes. Daily rollups are kept forever, so a range of a year or more is already answerable. The retention settings decide how long the fine and medium detail survives, not how far back you can look.

Can I scrape it from another monitoring stack?

Not directly — there is no /metrics endpoint yet. In the meantime the JSON API is scrapeable with a small exporter, and the generic webhook can push every event into whatever you already run.

Multiple users?

Yes, and they have roles. An administrator manages users, sensors and settings; an operator can additionally acknowledge an outage, pause a sensor, or run a probe by hand; a viewer reads everything and changes nothing. Everyone picks their own theme, layout and language, and any account can turn on a second factor.

Can I use it as a public status page?

Not yet. Today the dashboard is authenticated, full stop. A read-only public view on its own path and token is on the roadmap.

What happens to my data if I stop using it?

Nothing — it is one file on your disk. There is no account, no telemetry, and no phone-home. ProbeGlass makes outbound connections only to the targets you configure and the alert channels you set up.

Who makes this, and how

ProbeGlass is not a product. It is one person's homelab watchdog, written in their spare time, and that is worth knowing before you install it anywhere that matters.

A hobby project

One person, spare time, their own homelab — and not a professional software developer. There is no company behind ProbeGlass, no support contract, no paid tier and no SLA. It is built for this one homelab and shared in case somebody is looking for something similar. Issues are read and patches are welcome — a timeline is not something anybody is offering.

Vibe coded

The code is written in dialogue with an AI coding agent. Most of it is written by the agent and then run, measured and argued with until it behaves; some is written or reworked by hand. There has been no design review and no security audit, so expect rough edges — and please report them.

No warranty, no liability

MIT licensed and provided “as is”. Nobody is liable for anything it does — including data loss, and including a service that was down while the dashboard said it was fine. Do not make it your only line of defence.

How it came about, how it is written today, and what that means for you: Who makes this, and how in the documentation. If that is not the trade you want to make for a monitoring tool, that is a completely reasonable position — and the other tools out there are not the worse for it. ProbeGlass is simply what one person wanted for one homelab.

Ready when your homelab is

Start the container, set a password, add a sensor. The first alert you get will be one you would otherwise have found out about from your partner.