Every tool here is one I actually run. Versions are whatever is installed on the box as I write this, not a wish list — if something on this page is wrong, it’s because I changed it and forgot to come back.

Machines

  • Main rig — Windows gaming PC, RTX 4090. Games, modding, and the thing I remote into the lab from.
  • Lab VM — Debian 13 (trixie), kernel 6.12, Xfce 4.20. This is where nearly everything on this blog gets built. Runs under VMware, behind pfSense.
  • Laptop — a second Debian 13 machine, set up to match the lab VM so scripts and configs move between them without edits.
  • Network — Arcadyan HWG2025 on NBN, with pfSense doing the real firewalling and segmentation.

Desktop

OSDebian 13 (trixie)
DesktopXfce 4.20, red/black theme
Terminalxfce4-terminal 1.1.4
Shellbash
EditorVS Code 1.131
BrowserBrave 1.93, Firefox ESR for testing
NotesObsidian 1.8.10

Working with Claude

Three coding agents now, with deliberately different powers:

AgentRoleMay change things?
Claude Codemain driver — plans and buildsyes, within an approved scope
Codeximplementation and test plans, independent reviewprepares, never deploys
Kimi Coderead-only auditor behind an integrity-checked launcherno

The rule is that the agent proposing a change is never the one that certifies it. Claude Code runs on the Debian VM with a CLAUDE.md per project, custom slash commands, and hooks that enforce the things I don’t want to rely on remembering.

Homelab Council ties them together: one request goes to all three, they answer independently, then review each other, and nothing touches the lab without an approval bound to a hash of the exact plan.

Underneath sits a self-hosted multi-LLM gateway (LiteLLM + Open WebUI + OpenRouter) — one endpoint for every model, SSO for humans and keys for machines, with per-project virtual keys that carry their own spend cap. Everything is traced with Langfuse.

The self-hosted stack

Everything runs on the lab VM, in Docker unless noted, reached through a reverse proxy rather than published ports:

JobWhat runs
Reverse proxy + TLSCaddy
IdentityAuthentik (plus LDAP and RADIUS outposts)
SecretsVaultwarden
DNS filteringAdGuard Home
MetricsPrometheus + Grafana (native), node_exporter, snmp_exporter, plus textfile exporters for clock skew, container counts, certificate expiry and detection headroom
Logs / SIEMLoki + Promtail — eight sources: firewall, host auth, syslog, reverse-proxy access, identity events, container stdout, agent audit, network drift
Detection53 rules — 24 LogQL on the Loki ruler, 29 PromQL on Prometheus
AI triageKimi as a read-only SOC analyst — bounded, sanitised evidence in; severity, confidence and recommendations out; no tools, so it cannot act
AlertingAlertmanager → ntfy, routed by severity
Vulnerability scanningGrype + Trivy + nmap (replaced Greenbone/OpenVAS, Aug 2026)
DCIM / IPAMNetBox — also the intended-state source of truth for the network digital twin
Network baselinenetwork-twin — compares NetBox against a bounded nmap observation; read-only token, so it cannot write back to the inventory
Agent orchestrationHomelab Council (local, Python) — terminal UI plus a web dashboard behind SSO
Agent auditingagent-auditor — hash-chained evidence ledger
Automationn8n
LLM observabilityLangfuse
AI gatewayLiteLLM + Open WebUI
DashboardHomepage — four tabs, with a health strip pinned to every one of them
Remote accessTailscale, with WireGuard on pfSense as a break-glass path

Building things

Node24.18
Python3.13
Hugo0.163.3 extended
Docker26.1.5
Git2.47

This site

Hugo + a heavily customised PaperMod, Markdown content, built and served by Cloudflare Pages on every push to main. Self-hosted Rajdhani, GoatCounter for analytics, giscus for comments, and a hash-locked Content Security Policy. The longer version of that story is on the about page.

Notes and study

Obsidian for everything I write down — homelab runbooks, session logs, and my Islamic studies notes. The vault syncs between the lab VM and the laptop, and I read it through a small read-only dashboard I had Claude build, described in this post.