I am building this homelab to have near infinite compute, memory and storage. I also want it to be quite small and portable.

Today it runs a small fleet of AI agents: a personal assistant I talk to over Telegram, a Claude Code worker it can hand coding tasks to, isolated browsers, and disposable sandboxes.

Hardware

Three used office mini PCs, clustered with Proxmox.

NodeMachineCPURAMDisk
node-01Dell OptiPlex 7060 Microi7-8700T, 6 cores / 12 threads32 GB256 GB NVMe
node-02Dell OptiPlex 7060 Microi7-8700T, 6 cores / 12 threads32 GB256 GB NVMe
node-03Lenovo ThinkCentre M700 Tinyi5-6500T, 4 cores / 4 threads24 GB256 GB SATA SSD

A Cisco switch sits on top, with a JetKVM so I can get to a console without plugging in a monitor. Everything is on my Tailscale network, so I reach it the same way from my Mac mini, my laptop or my phone.

What runs on it

Every job gets its own VM.

VMNodeWhat it does
hermesnode-01The assistant, built on Hermes Agent
toolsnode-01LiteLLM in front of OpenRouter, and SearXNG for search
codernode-02Claude Code, running on my subscription
browsernode-02Three headless Chromium containers
sandboxesnode-03Throwaway VMs, created on demand

hermes has three profiles, each with its own Telegram bot, memory and permissions:

  • assistant reads my calendar and email. It sends a morning brief at 7:00 and triages the inbox at 21:00, drafting replies but never sending them.
  • research browses the open web. It has no Google access at all.
  • marketplace looks after the Facebook Marketplace listings for my 3D printing. It reads buyer messages and drafts replies for me to approve. It never sends on its own.

tools is the only thing that talks to model providers. Every agent gets its own key with a monthly budget: $40 for the assistant, $15 for research, $10 for scheduled jobs and $5 for sandboxes. Because everything goes through one gateway, switching models is a one line change.

coder takes a repo and a task, runs Claude Code on a new branch, and hands back the result. The assistant can delegate to it over SSH.

sandboxes are cloned from a template in under a minute, live for at most two hours and are then deleted. Only one runs at a time, because node-03 is the weakest machine.

Keeping the agents apart

The agents read email, web pages and messages from strangers, and any of those can contain instructions. So I assume one of them will eventually be talked into something, and try to limit what it could do.

  • The network. VMs sit on a private bridge on each host. They can reach the internet and each other over Tailscale, but not my home network or the Proxmox admin page.
  • The browsers. Each profile is wired to exactly one browser, and a prompt can’t change which. The assistant’s browser only allows Google. The research browser keeps nothing and is wiped every night. The Facebook session lives in its own container, away from Google.
  • Credentials. The assistant uses its own Google account, not mine. It only sees the calendars I share with it. Only the assistant profile holds those credentials.
  • Spend. If a key hits its budget, LiteLLM refuses the request.

How it got built

I wrote a runbook, then had a coding agent on my Mac mini carry it out over two days, one phase at a time. It stopped whenever it needed me in a browser: Google sign in, pairing the Telegram bots, logging Claude Code in. It logged every change and every bug it found along the way.

Some of the bugs it caught:

  • cloud-init quietly dropped half the setup. Per-VM settings replaced the shared install steps instead of adding to them, so the first test VM booted without Docker or Tailscale.
  • The budgets did nothing. LiteLLM didn’t know the prices of the models I picked, so it counted every request as free. A key with a one cent limit happily ran six big requests. Now the prices are written into the config.
  • Two nodes woke up a year in the past. Their CMOS batteries are dead, so after every cold boot the clock is wrong until it syncs, and anything that checks a certificate fails for the first half minute.
  • The calendar looked empty. The agent’s own calendar really is empty. Everything lives on calendars I share with it, so it now checks all of them.

Backups and monitoring

The assistant VM is backed up every night and copied to a second node. Every host reports a heartbeat every five minutes, and a watchdog on the assistant VM alerts me if one goes quiet.

What’s next

  • Replace the dead CMOS batteries.
  • Upgrade to Proxmox 9.2.
  • Add more disk. node-02 is the tight one.