I run a three-machine production estate out of my house. About twenty services, real users, real uptime obligations. I built an agentic system that watches it, diagnoses what breaks, and tells me before I notice.

melfina · tier 1 sentinel · every 5 min
$ systemctl list-timers 'melfina-*'
NEXT       LEFT    LAST       UNIT
14:58:17   3min    14:53:17   melfina-sentinel.timer
15:00:01   4min    14:55:01   melfina-coordinator.timer

$ melfina sentinel --dry-run
INFO  evaluated 51 checks
INFO  no state changes

$ melfina coordinator          # only when something breaks
INFO  1 incident to triage
INFO  machine/torrentpi  unreachable at both ping and ARP
        level. Off the LAN entirely, not just SSH down.
INFO      critic: partially_supported  (confidence medium  low)
INFO      not ruled out: segment-wide fault would look identical
INFO  diagnose  critique · notified · $0.1250

That last line is the whole design. It notices, works out why, checks its own reasoning, and only then interrupts a human. It costs about a dollar a month to run.


The estate

Not a lab. A thing people depend on.

Friends play on the game servers. People download from the launcher. A public company site reverse-proxies through it. When it breaks, someone notices, which is exactly why it's worth building monitoring for.

Machines online
2 of 3
Services
20
Checks / 5 min
51
Open incidents
0
Run cost
$1/mo

These figures are published by the estate itself.

topology
              Cloudflare Tunnel ── Access-gated for admin surfaces
                      │
        ┌─────────────┴──────────────┐
   Raspberry Pi 5              Beelink N100
   control plane                 compute / games
   ├─ PostgreSQL + pgvector      ├─ Palworld dedicated server
   ├─ Redis                      ├─ 2× Godot game servers
   ├─ Gitea (self-hosted git)    ├─ Jellyfin
   ├─ Ops dashboard + REST API   └─ Docker, ~6 containers
   ├─ Launcher backend
   └─ Melfina (6-tier orchestrator)   Pi 3 · VPN-gated box
                                        (currently offline, muted)

The centrepiece

Melfina: an agent that runs the loop, not just answers questions

Six tiers. Each one gates the next, so cost tracks how uncertain things actually are: a healthy day makes zero model calls, and a confident diagnosis never pays for an investigation it doesn't need.

  1. 01

    Sentinel live

    51 deterministic checks every 5 minutes. No LLM: if deciding whether something is broken needs a model, the rule is wrong. Flap damping, scheduled-maintenance windows, and transition-only events so a week-long outage writes one row, not two thousand.

  2. 02

    Coordinator live

    Wakes only on an incident. Retrieves the relevant runbook, the check's history, and every machine's current reachability, then produces a structured diagnosis with an honest confidence level.

  3. 03

    Specialists live

    Four diagnostic agents over nine read-only tools. The model never emits a command. It emits validated arguments and the code builds the argv, checked against a live service registry. Tested against command injection, path traversal and cloud-metadata URLs.

  4. 04

    Critic live

    Reads the raw command transcript, never the specialist's summary, and is prompted to refute rather than assess. On its first real review it downgraded a diagnosis and caught a citation the agent had attributed to the wrong source document.

  5. 05

    Notify live

    Discord and Telegram. Leads with how much the finding is worth: the critic's verdict, not the diagnosing model's opinion of itself.

  6. 06

    Actuator off by design

    The only tier that writes, and it ships disabled. A three-item allow-list, live game servers permanently protected, human approval required, and every precondition re-checked at click time. A button pressed an hour later must not fire against a situation that has moved on.


Also running

Shipped, not prototyped

Desktop application

Lampshade

A game launcher with a real auto-updater, access-code gating and a server-enforced admin API. Shipped and in use.

  • Tauri
  • Rust
  • FastAPI
  • PostgreSQL

Multiplayer backend

Under One Banner

Two authoritative game servers (a persistent hub world and ranked duels) with clients discovering the endpoint at sign-in.

  • Godot headless
  • WebSocket
  • Supabase
  • systemd

Public web

Company site

An edge-deployed marketing site that reverse-proxies a path straight through to the homelab backend, so one product lives at two URLs.

  • Cloudflare Workers
  • KV
  • Edge routing

Operations

Ops dashboard + Android client

One pane for every service on every machine, with allow-listed restart controls, plus a native phone client that falls back from LAN to a service-token-authenticated tunnel.

  • FastAPI
  • Kotlin
  • Compose
  • Cloudflare Access

Game operations

Palworld server + friends panel

A dedicated server with a password-gated status page for friends. Every login and restart is audit-logged with the real client IP resolved through the tunnel.

  • Docker
  • REST admin API
  • Audit logging

How I work

The habits are the portfolio

Anyone can stand a service up. The interesting question is what happens on day ninety, when you've forgotten why you made a decision and something breaks at 3am.