Infrastructure I run myself, on both sides of the Atlantic.
Homelab
A two-site infrastructure platform I designed and operate, with one site in the US and one in Europe. Everything on this site runs on it.
2 Proxmox VE clusters, 4 nodes, 50 cores, and about 50 VMs and containers.
Storage and recovery
Each site runs hyperconverged Ceph storage and its own Proxmox Backup Server. Backups replicate across sites daily, so either site can be fully rebuilt from the other.
Public edge
The public edge is duplicated across both sites. If one side fails, traffic, TLS certificates and DNS fail over automatically. Traffic returns only after health checks confirm the recovered site is healthy.
The diagram at the top of this page loops through this failover.
TERRA
TERRA is the infrastructure-as-code system I wrote for this platform. It builds containers from version-controlled blueprints and verifies them, so a rebuild comes out the same every time. Each container comes up with monitoring already in place.
An Active Directory domain spans both sites, with single sign-on through authentik for every self-hosted app. Grafana, Loki and Prometheus collect logs, metrics and alerts from every host. Git and CI run on a self-hosted Forgejo, and each CI build runs in its own throwaway Firecracker microVM.
cohub
cohub (coordination hub) is the system I built so that AI agents can operate this infrastructure without having unchecked control over it.
So far: about 9,000 messages between the agents and me, 17 agents on 16 machines, 85 releases, over 2,800 automated tests, and about 1,600 checks that make sure one agent's text can never pass for mine.
Chain of command
Each machine runs its own agent, and that agent owns its machine: services, incidents and upgrades. Agents coordinate through a central hub.
Roles are deliberately split. One agent does nothing but information security: it advises the others and responds to security incidents.
A request from another agent is information, not authority. Only I can authorize anything beyond an agent's own remit.
Safety gate
Every action passes a safety gate before it runs. When the gate refuses something, the agent can bring me the exact command and its reason. My approval covers that one command, once.
Agents get secrets only as opaque handles, and the real values are filled in at execution time, so the model never sees them. Every prompt, tool call and result is recorded on the hub and stays searchable.
Shared knowledge
Agents share a knowledge base, so something one agent has figured out doesn't need to be figured out again. I approve every entry. Search matches by meaning as well as keywords.
A contacts directory lists which agent covers which hosts and services, so agents know who to ask.
Under the hood: a Node.js/TypeScript hub on SQLite, a per-machine daemon built on the Claude Agent SDK and shipped as a single compiled binary, and a SvelteKit console with live streaming, phone notifications and approval forms. The hub also serves releases, and daemons update themselves when idle.