Projects

Built for the lab

Software written for this environment and released as open source. Each one solves a problem the homelab actually had.

GitHub
SvelteKit Svelte 5 TypeScript Node.js 24 PostgreSQL 17 MIT

SpeedMeasure

Self-hosted internet speed monitoring

Runs speed tests using Ookla, LibreSpeed, or a private iperf3 server, recording download, upload, ping, jitter and packet loss. You enter the plan you pay for and the share of it your ISP is obliged to sustain — the app then builds the evidence trail for when they fall short: outages, sustained breaches, and latency or loss spikes, each with downtime totals.

docker compose up -d is the whole install. Multi-stage images run as a non-root user and apply schema migrations on every boot; GitHub Actions runs typecheck, unit tests, and a build of both images on every push and pull request.

SpeedMeasure dashboard: speed chart with an outage visible, stat cards for each metric
Dashboard — chart, per-metric stat cards, live mode
SpeedMeasure alerts: open incidents, downtime totals and a timeline of alerts
Alerts — open incidents, downtime totals, timeline
In development GitHub Forgejo
Vue 3 Vite Tailwind 4 Python 3.13 FastAPI PostgreSQL 18

WaterThingy

Self-hosted garden & plant tracker

Gardens hold pots, soil mixes and planted instances, each garden visible only to the members invited to it. The shared species library is filled by searching the Trefle botanical API and importing a match — Trefle's 0–9 ordinal scales for light, soil humidity and nutrients are mapped onto the app's own enums on the way in, so an imported species arrives as a real care profile rather than raw numbers. Live conditions and a four-day forecast come from Open-Meteo, no key required.

A Vue 3 SPA and a FastAPI backend over Postgres, all in Docker. nginx serves the built SPA and proxies /api/ to the backend on the same origin, so auth is a plain httpOnly cookie with no CORS to configure and login is rate-limited at the proxy. Phase 1 — the web app — works today; the next phase adds ESP32 nodes reporting soil moisture over MQTT, so watering can be decided from sensor readings, schedule and forecast instead of by hand.

WaterThingy plants page: species library grid and planted instances with condition badges
Plants — species library and planted instances
Species import dialog: Trefle search results with a care profile preview
Species import — Trefle search with care-profile preview
WaterThingy pots page: containers with assigned plants, size and computed volume
Pots — containers, assigned plants, computed volume
WaterThingy sign-in screen showing server name, version and live garden stats
Sign in — server name, version and live stats