Building a Homelab Dashboard: Galaxy Lab
When you're running a dozen self-hosted services, keeping tabs on what's up and what's down gets old fast. I wanted something I could glance at from my phone and immediately know the state of my lab — not a browser bookmark, not a VPN session into a web UI, just an app that opened and told me what was going on. So I built one.
The Monitoring Backend: CheckCle
Before I could build anything, I needed a data source. CheckCle is a self-hosted uptime monitoring tool — think of it as your own personal UptimeRobot. It pings all your services on a schedule, tracks uptime and response times, and exposes everything through a clean REST API. That last part is what made it the perfect backbone for a dashboard.
I'm running CheckCle on its own VM, with regional monitoring agents deployed on two of my proxy nodes — one on each side of my network — so checks happen from multiple vantage points. Every service has a record in CheckCle: Traefik, Grafana, Portainer, Authentik, Jellyfin, the works.
The App: Galaxy Lab
Galaxy Lab is a React Native app built with Expo. One of the nice things about Expo is that you don't need a local Android SDK setup — their cloud build service (EAS Build) handles compilation, so I could go from zero to installable APK without touching Android Studio.
The app pulls all service records from the CheckCle API on launch and refreshes every 30 seconds. At the top there's a stats bar: total services, how many are up, how many are down, and overall uptime percentage. Below that, services are organized into groups — Infrastructure, Monitoring, Media, Files, and so on — with filter chips you can tap to narrow things down. There's also a search bar for when you just want to find something quickly.
Each service card shows the current status (green or red), response time in milliseconds, and tapping it opens the service directly in your browser. There's also a "show down only" toggle for when something's wrong and you want to cut straight to what's broken.
The Web Companion: status.galaxy.rip
Not everything needs an app. I also put together a web status page that lives at status.galaxy.rip — same data, same look, built as a single self-contained HTML file served by Python's built-in HTTP server sitting behind Traefik. It's useful when someone asks if a service is down and you want to send them a link instead of an answer. It auto-refreshes every 30 seconds on its own.
The Plumbing
Everything public-facing goes through Traefik as a reverse proxy, with Let's Encrypt handling TLS and Cloudflare managing DNS. Authentik sits in front of the internal dashboards for SSO. The one gotcha: the CheckCle API endpoint needed to be set to DNS-only in Cloudflare (no proxy) so the app could hit the API directly without Cloudflare's bot protection throwing it out.
It's a pretty simple stack overall, and it's made a real difference in how quickly I can spot and respond to something going wrong in the lab.
Comments
Post a Comment