One Proxmox box running a rack of self-hosted services, with watchers that check its state on a schedule, diagnose what they find, and bring you a researched fix to approve. Below is the full changelog of what it has actually caught and done — generated from the system's own records and redeployed within a minute of every fix.
A "homelab" is a computer at home that runs the services most people pay a subscription for elsewhere — a streaming server instead of a cut of five streaming apps, your own file storage instead of a cloud drive, your own DNS and smart-home brain instead of letting a vendor hold them. Everything below runs on one machine, not a rack or a cloud account.
Each service runs in its own container or VM. A crash in one does not affect the others, and each gets its own share of processing power and memory rather than sharing a pool with everything else. Proxmox is what lets one small box behave like several separate machines.
Every number below is read from the system's own registries when this page is built — the action vocabulary from the code that enforces it, the services from the file that decides how loudly each one pages, the guests from a capture taken off the hypervisor six-hourly. None of it is typed in by hand, since a feature list written by hand tends to drift out of sync with the system it describes.
Each watches something the others structurally cannot see — a dead indexer is a state, not an error line; a remote outage writes no local log at all.
acquisition-sli, backlog, config-export-monitor, dep-update, dependency-watch, failure-watcher, gap-audit, guest-resource, ha-watch, healthcheck-down, image-scan, indexer-watch, jellyfin-user-audit, ma-ha-provider-watch, media-malware-sweep, new-log-template, notify-watch, recording-watchdog, repo-audit, resource-watch, seerr-issue, spec-check, stuck-acquisition
A closed vocabulary. An action outside this list cannot be selected, regardless of what the model proposes. Widening it is a reviewed change to the code, not a one-off judgement made during an incident.
delete-duplicate-series-timer, prune-build-cache, prune-images, restart-container, restart-guest, restart-service, restore-series-timer, search-missing-episodes, set-cpulimit, set-indexer-reject-blocklisted-hashes, set-memory, set-radarr-indexer-reject-blocklisted-hashes, set-record-new-only, start-container, stop-container, vacuum-journal
Each was written in response to a specific failure, and is first checked by making it fail on purpose. A check that has never been seen to fail has only been written, not tested.
0 health checks · 41 workflows
Graded by who notices when they stop, which decides how loudly a fault is reported and whether a change may be applied without asking.
0 reachable from outside · 0 household · 0 LAN-critical · 0 back-office
Full configuration, installed packages and mounts, captured from the hypervisor and compared against the committed copy. A change made by hand shows up as a failed check rather than as a surprise during the next restore.
plus 11 application settings that used to exist only as a note asking someone to remember them
Media, home automation, networking, and the platform to run them — around a dozen self-hosted services, each sized to a tight CPU and memory allowance and checked regularly by a resource watchdog that flags anything running short.
The service map above has five groups — media, home, access and edge, data and safety, observability. These three diagrams zoom into two of them: the media stack and the network edge. Home Assistant, the backups, and the observability stack each work differently and aren't pictured here — that's the next section.
MEDIA STACK
vpn route through gluetun's proxy instead, each solved by its own FlareSolverr — because a Cloudflare-issued cookie is bound to the IP that solved the challenge, so a VPN-routed request replayed on the house IP (or vice versa) just gets a fresh 403.NETWORK & ACCESS
LIVE TV
The rest of the house doesn't route through Seerr or Prowlarr at all. This is the other half: what a household member notices day to day, what Home Assistant automates on its own, and a few decisions that looked fine until they were measured.
Memory against each guest's ceiling, and the temperatures the hardware itself calls dangerous — sampled six-hourly from the hypervisor's own records, the last 14 days. Nothing here is a live reading: it is published on a deliberate delay, because a real-time load graph tells a stranger when the machine is busy and when nobody is watching it. The dashed line on each chart is the actual number a watcher would flag at — not the top of the box, the real threshold — and colour follows the same rule the changelog's state chips use below.
MEMORY — % of each guest's own ceiling, not the host
TEMPERATURE — the hypervisor's own sensors
What caught it, what the check's own threshold is, how that check gets triggered, what the agent was allowed to do about it, how it arrived at a recommendation, what stops the fix from breaking something else, how it was actually implemented, and what proves it worked. Pulled directly from the system's own issues and pull requests — a step with nothing recorded says so, rather than being smoothed over. Internal specifics (hosts, addresses, paths) are removed; the reasoning behind each fix is not.
Loading the feed…
Each watcher checks one kind of state on a schedule and files what it finds as an issue. None of them applies a change.
Six rules decide what an agent may change on its own, and what has to wait for a person.
Every change is a branch, a review, a merge. Nothing is configured by hand and forgotten. The repository can rebuild the box from scratch.
Anything destructive is replayed on a throwaway clone of production first. The dangerous surprises get caught on a copy, not on the live system the household depends on.
Agents find root causes and propose. A human approves anything that changes state. Confident-but-wrong auto-fixes were tried once — and deliberately removed.
Secrets are removed at the log shipper and again before the repository. A leaked credential is treated as a bug to fix at the source, checked at more than one layer — never as a fire drill.
Every change is classed by how much it can break and who it touches. A back-office tweak lands instantly; anything that reaches the network, the household, or an outside user needs a live preflight and an explicit go-ahead — and fails closed if a check is unsure.
One small box, not a cluster. Every service runs on a deliberately tight CPU and memory budget, rebalanced on a schedule — capacity is a decision, not an afterthought. Over-building for scale it will never have is treated as its own failure mode.
The hard part is the last step: getting a problem that needs a person's judgement in front of a person, with enough context to decide in seconds, and making sure silence means the system is healthy rather than that nobody is listening. The tap records a decision; the change itself still goes through the same review as anything else.
Agents cluster errors, watch resources, probe reachability, and track versions — turning noise into deduplicated, root-caused issues.
A one-off blip auto-closes as a transient; a fixed issue reopens only if it comes back sustained. The queue stays honest — no flapping, no silent pile-up.
Before anything reaches you, per-tool experts ground the fix in the official docs and the community grounds it in real-world experience: root cause, live state, upstream behaviour. What arrives is a recommendation with its evidence attached.
The researched fix lands on your phone with one-tap Approve / Reject. A daily digest arrives even when everything’s green — so a quiet day is proof the loop is alive, and a missing digest is itself the alarm.
Approve records the decision and routes it into the reviewed, rehearsed path. It never auto-applies a change on its own — the human stays in the loop where it counts.
Fix ready to approve: indexer rate-limiting
Root cause: one indexer is returning 429s and stalling the search queue.
Fix: raise its request delay — hot, no restart, reversible.
Evidence: official docs + 3 corroborating community reports.
Blast radius: back-office, invisible to users.
The actual shape of a decision push. The button carries a one-time signed token — never a credential.