I started by running the whole media stack on my gaming PC, just to see if I was actually interested in building a server rack. I was. So last month I moved everything to a $150 Dell OptiPlex 3050 Micro I picked up on Facebook Marketplace, and I did the entire migration with an AI agent open on my phone.
What runs on it
- Jellyfin for streaming, with Intel Quick Sync handling the transcoding
- Sonarr, Radarr, and Prowlarr for the automation
- qBittorrent behind a VPN (gluetun plus AirVPN), everything else on the normal network
- Seerr for requests, exposed through a Cloudflare Tunnel at
requests.dntv.devso my sister can request movies from her place - Immich for photo backups and Uptime Kuma for monitoring, because once the server went quiet I wanted to know about it before she did
How we actually did it
Most of the work happened from my iPhone, SSHing in with Termius. I pasted terminal output back to Muse, and it told me what to run next. That loop is the whole thing.
The best example: my *arr imports were crawling. A movie sat on “Downloaded - Importing” for an hour. Turns out every import was silently falling back to a full copy because hardlinks were failing with EXDEV. /data/downloads and /data/media are two mounts of the same drive, and Linux won’t hardlink across mounts even on the same filesystem. The fix was a Remote Path Mapping in Radarr and Sonarr so imports resolve through the /data/media mount. That diagnosis took five minutes of looking at real output instead of three hours of me guessing at settings.
And when Seerr shipped a security patch for an RCE, we migrated Jellyseerr 2.7.3 to Seerr 3.5.0 in one sitting, including the permissions fix the new non-root image needed.
It’s not magic
The model guesses wrong plenty. It once guessed exFAT was the problem and my df output killed that theory in the same turn. It recommended a Docker tag that was the dead v1 line of Uptime Kuma, and I caught that one myself. Every claim still gets checked against real output before anything goes in a compose file.
But here’s what’s changed. A couple years ago the LLM was a text box you asked for a code snippet. My Oct 2022 blog was literally “Set up Nodemailer with Next.js & Typescript.” Now I’m rebuilding infrastructure from my phone while watching TV, with an agent that reads my actual machine state, corrects itself when the output disagrees, and walks me through irreversible hardware moves one step at a time. Power the dock down after the PC is fully off. Dock first on the way back up, then the Pi, then the Dell.
The debugging loop that used to take me a Saturday now takes an evening. The agent isn’t the expertise. It’s the second pair of eyes that never gets tired of reading log output.
That’s the part worth writing about. The homelab is just the receipts.
Thanks for reading!