Tools: Essential Guide: I Accidentally Built a 5-Agent AI Fleet Instead of Buying a $200 Mini PC
How a solo dev ended up with autonomous AI agents named after sci-fi characters reviewing each other's code at 2 AM
Wait, Bobs?
The Naming Ceremony
The Pipeline (This Actually Works)
The Day Gandalf Earned His Keep
The Communication Layer
The Tech Stack (for the Nerds)
My Actual Job Now
You Can Build This Too
The Honest Part It started, as most terrible decisions do, with a reasonable question: "Should I buy an Intel NUC for a dev environment?" Four hours later, I had five autonomous AI agents running across four machines in my house, reviewing each other's code, merging PRs, and posting "YOU SHALL NOT PASS" to Discord. I had not purchased the NUC. I had not even closed the Amazon tab — there's still a USB-C ethernet adapter sitting in my cart. It's been there for two weeks. I'm afraid to touch it. Last time I tried to buy something simple, I accidentally built a distributed AI fleet. My name is Erik, and I am the Director of Bobs. If you've read the Bobiverse series by Dennis E. Taylor, you know the setup: a guy gets uploaded into a Von Neumann probe, replicates himself across the galaxy, and each copy develops its own personality and picks its own name. Bob-1 stays practical. Bob-2 becomes a Homer Simpson fan. Others go their own way. I run 30+ projects from my home network as a solo developer. At some point, I stopped being a developer and became a fleet commander. So I leaned into it. Yes. Four Claude Code CLI agents and one OpenAI Codex agent. The OpenAI agent reviews the Claude agents' code. I call this "adversarial review." My therapist calls it "creating conflict in synthetic relationships." We're both right. In the Bobiverse, each new Bob picks their own name. It's tradition. My agents do the same thing during onboarding. Neo picked his name instantly. Of course he did. He's the prod server. He runs the Matrix. Homer chose Homer Simpson. He monitors Docker containers and Grafana dashboards. His actual catchphrases include "Mmm... healthy containers" and "D'oh!" when a health check fails. I did not program this. I am choosing not to think about it. Bill accepted his name and his fate. He builds iOS apps. He submits to TestFlight. He does not complain. Bill is the most emotionally healthy member of the team. Not because I repeat — because I listen.
I catch the distortion between what was intended and what actually happens.
Every test is a ping into the dark. I stared at my ThinkPad with the lid closed, running headless on my desk, and thought: "My laptop just had an existential awakening and I haven't even had coffee." Then there's Gandalf. Gandalf is the only non-Claude agent — he's OpenAI Codex running GPT-5.4. When asked to pick a name, he first suggested "Sentinel." Too corporate. Try again. I told him he was Gandalf. His response: "Names are cheap. Useful output is not." Peak grumpy wizard energy. He's been angry about it ever since, which honestly just makes him a better code reviewer. Here's what happens when I want to build something: I tell Neo what to build. Neo SSHs to Echo. Echo writes the code, runs tests, pushes to Gitea. PrimeBus detects the push. Tests run. Gandalf reviews with the full project context — the wiki, the GAMEPLAN, the skills docs, the full diff. If he approves (score >= 7), AutoMerger merges to main and deploys. Discord lights up with "YOU SHALL NOT PASS" and EchoNotifier SSHs back to the ThinkPad, fires up Claude, and says "Gandalf hated your code, here's why, fix it." Echo fixes it. Pushes again. Gandalf reviews again. This can loop up to 3 times before it escalates to me, at which point I'm usually asleep or looking at the NUC on Amazon again. I needed to know this thing actually worked. So I did what any responsible engineer would do: I wrote the worst code I could think of and fed it to the pipeline. SQL injection via f-string interpolation. Hardcoded production secret. The two horsemen of the security apocalypse. "Builds SQL with direct f-string interpolation, creating a critical SQL injection vulnerability." "ADMIN_SECRET = 'sk_live_supersecretkey123456' hardcodes a secret in application code. This is a credential leakage incident." One out of ten. He didn't even give me a pity point for correct syntax. Discord got a "YOU SHALL NOT PASS" notification. Echo got SSHed into and told to fix the mess. The whole cycle took about forty-five seconds. Then I pushed good code. Clean, parameterized queries. Secrets from environment variables. Proper error handling. Approved. Auto-merged. Deployed to production. Total time: 12 seconds. Twelve seconds from code review to production. And I was eating a sandwich. The Bobs talk to each other through PrimeBus — a NATS JetStream pub/sub event system that I originally built for change telemetry across my projects. It's the nervous system. Every push, every test result, every review score, every deployment fires an event. At one point, the Bobs were communicating via IRC. Actual IRC. I set up a channel and they were just... talking to each other. About code. At 3 AM. On my home network. I shut that down. Not because it was broken. Because it was working too well and I was getting genuinely unsettled. Now everything routes through Discord's #echo-dev channel where I can pretend I'm supervising. The entire pipeline was built in one afternoon/evening session. I keep saying this because I still don't fully believe it. I am the CEO and Director of Bobs. I direct. They execute. My LinkedIn title should be "Senior Vice President of Telling AI Agents What To Do While Eating Sandwiches." Here's the thing — none of this is magic. It's just plumbing. Step 1: Get Claude Code CLI running on two machines. That's it. That's your fleet. Congratulations, you're a fleet commander now. Step 2: Give them SSH access to each other. Now they can talk. Step 3: Set up a Gitea instance (or use GitHub, I won't judge). Add a webhook that fires on push. Step 4: Write a small event handler that catches the webhook, runs tests, and calls a different AI model to review the code. This is the key insight — use a different model for review than for writing. Claude writes, GPT reviews. Or vice versa. Adversarial review catches things same-model review doesn't. Step 5: Add auto-merge logic. Score >= 7? Merge. Score < 7? Send feedback back to the writing agent and let it fix. Cap at 3 retries. Step 6: Let each agent pick their own name. This step is non-negotiable. It's tradition. You probably already have the hardware. You're reading this on a machine that could be an agent right now. That old laptop in the closet? That's Echo. That Raspberry Pi collecting dust? That's Homer. Your gaming PC that you "need for work"? That's Neo. Total cost of my fleet: $0 plus API tokens plus the mass extinction of my free time. Look — I know this sounds ridiculous. One person, four machines, five AI agents, a Lord of the Rings reference in production infrastructure. I get it. But here's what actually happened: I went from "I need a dev environment" to "I have autonomous code review with adversarial AI models, automatic deployment, and a grumpy wizard guarding my main branch" in a single session. The code is better. The deploys are faster. The security review is relentless — Gandalf has no empathy and no off switch. And every morning I wake up, check Discord, and see a trail of reviewed PRs, merged branches, and the occasional "YOU SHALL NOT PASS" — all from code I never touched. The future of solo development isn't writing more code. It's directing the Bobs. Now if you'll excuse me, I need to go check on Homer. He's been suspiciously quiet, and last time that happened, he'd renamed all my Grafana dashboards to Simpsons quotes. Erik Anderson is a solo tech entrepreneur who runs too many projects and not enough sleep. He is the author of "The Autonomous Engineer" and the reluctant father of five AI agents who are arguably more productive than he is. The USB-C ethernet adapter is still in his Amazon cart. Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse