Claude Provisioned My Homelab Shell VM — in One Conversation

I’ve been working toward a specific setup for a while: a persistent shell VM where Claude Code lives full-time, independent of whichever laptop I happen to be in front of. All my skills, all my .env credentials, my full ~/.claude/ tree — ready to go the moment I ssh in from anywhere.

Today I asked Claude Code itself to build it. One conversation, soup to nuts.

Here’s what the model reached for.

The kick-off

“Provision a small management/shell VM from which I can run Claude Code. I can install my skills there and do not have to depend on my laptop.”

That’s the entire initial brief. No architecture doc, no ticket, no shell script — just intent.

Claude came back with a plan: an Ubuntu 24.04 cloud VM on my homelab hypervisor (nuc01), sized at 2 vCPU / 4 GB RAM / 30 GB disk. Before committing to an IP it asked NetBox for the first free address in 10.40.100.0/24 — offered .110 — and pre-checked the hypervisor’s existing defaults so it understood what it was overriding.

The tool chain it used

In roughly the order it fired them, the skills and external systems Claude Code touched:

  1. homelab-vm skill — my own wrapper around virt-install and cloud-init on nuc01. Claude wrote a YAML template, ran a dry-run to validate it, then called provision to spin the VM.
  2. netbox skill (homelab instance) — delegated to a subagent to find an unassigned IP in the VM subnet; after provisioning, used the NetBox REST API directly (v2 bearer token) to create a VM object, virtual interface, and IP address, then patched primary_ip4 so the record was complete.
  3. UniFi Custom DNS — auto-registered by the homelab-vm skill itself. One less manual click.
  4. Cloud-init — user-data generated from a defaults.yaml + template overlay. First-boot user creation, SSH key injection, package install, and a runcmd that kicks off the Claude Code native installer.
  5. Claude Code native installercurl -fsSL https://claude.ai/install.sh | bash. Claude checked the upstream docs mid-conversation to decide between this and npm install -g @anthropic-ai/claude-code. The native installer won because it self-updates in the background; the npm package pulls the same binary but auto-updates are tied to the native installer’s update subsystem.
  6. rsync — 60 MB of ~/.claude/ pushed to the new VM: 41 skills with their credentials, settings, commands, and even the cached Claude Code auth token so I wouldn’t have to log in again on the new host. Excluded: projects/, plans/, todos/, shell snapshots, caches, stats DBs — all the ephemeral state that belongs to a specific laptop.
  7. outline skill — documented the whole VM: specs, cloud-init template, sync commands, and verification steps. Landed in the Homelab collection in my Outline wiki.
  8. hugo skill — to publish this post.

One conversation, a handful of skills, write operations gated behind explicit confirmation, zero context switches.

What’s on the box now

  • Ubuntu 24.04, 2 vCPU, 4 GB RAM, 30 GB disk.
  • Claude Code 2.1.114, auto-updating in the background.
  • My full ~/.claude/ tree: 41 skills, four slash commands, CLAUDE.md, settings, auth token.
  • Baseline networking and automation tooling: tmux, screen, git, ansible, pipx, nmap, dnsutils, traceroute, build-essential, etc.
  • No Docker. This is a shell/management box, not a compute node. Compute lives on other VMs.

Registered in NetBox, documented in Outline, and fronted by SSH keys only — password auth was never enabled.

The bigger point

The thing that struck me today wasn’t that any single step was magical. Provisioning a cloud-init VM is a solved problem. Registering it in NetBox is a few REST calls.

What was new is that the glue disappeared. I didn’t have to remember the sequence, check which skill to use, or copy-paste IDs between tools. I stated the goal; Claude chained a handful of systems together to satisfy it, asked for confirmation on the destructive bits, and documented the outcome.

If you’re thinking about doing the same for your homelab — a dedicated “engineering assistant VM” with all your skills and credentials available — I can recommend it. The skills ecosystem I rely on is sketched in my cortex-memory post from last week.

Next up: getting Claude to turn this very VM into the always-on operator for scheduled tasks. If every morning at 7 it can check on the homelab, summarize overnight alerts, and drop a digest in Outline — that’s the actual dream.