My ultimate setup: a £40 box that codes while I poop

ai21-07-2026~9 minutes (1660 words)

At the end of my last post I promised you my ultimate setup. When “build on cloud” got takenth away from me and I was back to an angrily blowing laptop (and a wife complaining about the fan noise), anxiously checking my screen and swapping tabs, I decided to build my own version. It started at £40 and a great deal of dignity, and, as these things go, quietly grew from there. Let me explain.

A wild £40 box appears

A while ago I bought a used Dell OptiPlex 3050 off eBay for around £40. The plan was noble and boring: a basic home server that would also moonlight as my WiFi router. I was going to install OpenWRT on it, turn it into a proper access point, and feel very clever about it.

Why OpenWRT? Because many years ago (almost 20, actually) I’d already tried building a WiFi AP on top of Ubuntu Server, and I hated my life. Back then getting a WiFi card into master mode under Linux meant wrestling with iwconfig, whatever half-working driver your chipset happened to have, and, if you were truly cursed, ndiswrapper to shim a Windows driver into the kernel because no native one existed. Just typing out ndiswrapper makes me anxious right now1. So I (naively) assumed OpenWRT existed precisely to make that pain go away. It did not. If anything it was worse2. After enough failed attempts I did what any self-respecting engineer does with a project that has defeated them: I put the box in a drawer and pretended it didn’t exist.

It sat there until we moved houses. The move quietly solved the original problem for me. I set up my actual, purpose-built router as the main router (thank god), and the little Dell was suddenly a solution in search of a problem. So I gave it a different job: Ubuntu Server, no WiFi heroics, modest expectations. Just a small always-on Linux box.

That, it turns out, was the whole trick. Drop the “it must also be my router” requirement and suddenly the £40 box is a perfectly good little Linux machine. It started life fairly humble, 8GB of RAM and a slightly pokey 128GB SSD3, but four cores of Intel i5-6500T is plenty for what I had in mind, and, most importantly, it never sleeps, nor does it try to melt its own casing or evaporate its thermal paste4.

(The WiFi AP saga does get a happy ending, by the way, though not the one I expected5.)

Rediscovering the wheel (HTTP servers)

For months I’d been running coding agents on my laptop, which meant keeping the lid cracked open around the clock so Cursor and friends could keep grinding away in the background. My poor laptop was basically a space heater with a keyboard.

Once Ubuntu was humming on the OptiPlex, the penny dropped: opencode has a server mode. A web server mode. Which means I don’t have to run my agent on the machine I’m sitting in front of. I can run it on the machine that never sleeps and doesn’t care about its fan curve. Move the agent off the hot laptop and onto the box that’s designed to be on 24/7.

So I did. And that alone would have been a nice win. But then came the part that got out of hand.

Everything everywhere all at once

opencode’s web mode gives you a UI in the browser. And the box was on my network. And I’d been wanting a proper excuse to put Tailscale on everything for ages, without ever finding one good enough to bother. Well. Here it was.

You can see where this is going. If the box is on my tailnet, and the web UI is served over the tailnet, then I can drive my agent from anything else on the tailnet. Including the ridiculous foldable phone I mentioned in the last post. Which means I can kick off, review, and steer agents from anywhere with a signal.

I will now confess the exact moment I knew this setup had won: I was checking in with my agent while 💩 instead of reading something random like a normal person6. But it perfectly captures the vibe. The bottleneck was no longer “am I at my desk with my laptop plugged in,” it was just “do I have my phone.” And I always have my phone.

Wiring it up

The technical spine is refreshingly boring, which is how you want infrastructure to be.

opencode runs as a systemd service on the box so it comes up on boot and restarts if it dies. A proper daemon, not a tmux session I have to remember to babysit. It listens on 0.0.0.0:4096.

Tailscale does the reaching-from-anywhere part. Rather than a raw IP, I advertise it as a named service on the tailnet so it’s just opencode, cleanly, from any device. There’s one gotcha that cost me some time: re-authenticating the Tailscale node wipes the advertised services, so the service would silently vanish after an auth refresh. The fix is a small systemd timer that periodically re-asserts the advertisement, so if it ever gets dropped it heals itself within minutes. Set-and-forget, the way it should be.

I also threw Samba on there so the box doubles as network storage, because if you have an always-on machine in the house you might as well.

The box that upgrades itself

Now for my favorite part, the bit that still makes me grin. Once opencode was running on labs, I could ask the agent to improve labs. And it did. From that little web UI, my agent has:

Read that last one again. The agent, running on the machine, migrated the machine’s own disk out from under itself. It’s the closest a computer gets to a surgeon operating on their own open chest, calmly, while chatting to me about it.

And because the stakes are gloriously low, I run the whole thing in full YOLO mode: auto-accept every permission, no prompts, no hand-holding. There’s no production to nuke and no secrets worth stealing on there. The worst case is “the box falls over,” and I can rebuild it from scratch in an afternoon8. When the blast radius is one cheap Dell in the corner of a room, you can afford to let the robot cook.

Was it worth it?

I replaced a cloud feature I didn’t control with a used office PC I found for the price of a good GaN power brick. Well, £40 to start, but once it started advising me on its own upgrades I fed it more RAM and a bigger SSD (plus a better WiFi card, though that one was my idea), so realistically it’s closer to £100 now. It doesn’t save me a penny on the actual models, mind you, Sentry still pays Anthropic et al an obnoxious amount every month. But now I’m wringing every last drop out of that spend without cooking my own laptop to do it. It runs my agent, it’s reachable from my phone anywhere on the planet9, and it has spent a non-trivial amount of its own uptime making itself better. The laptop fans are quiet again. The bottleneck is my planning, not my hardware or my location.

Turns out the affliction is contagious. I managed to poison one innocent soul who took a look at all this, went off and built Outpost, and now checks his phone like a flirty teenager ten times a minute while we’re walking down the street. Sorry, Aditya. Not sorry.

Footnotes

  1. For the record, ndiswrapper was a brilliant idea and probably a genuine engineering feat: load a Windows NDIS driver inside the Linux kernel so your unsupported card works. It just never once worked well for me. If you have ever tried to turn a random x86 box into a competent WiFi access point under Linux, you already know. If you haven’t: cherish that.

  2. I had assumed a purpose-built router OS would at least have solved the driver problem. Instead it just moved the problem somewhere I understood even less.

  3. The RAM and SSD both got upgraded later, on the box’s own advice no less. More on that delightful recursion below.

  4. My laptop, on the other hand, currently couldn’t evaporate its thermal paste even if it tried, because I replaced the paste with a phase-change thermal pad from Thermal Grizzly after consulting, yes, an AI. It worked wonders. The machines are now helping me keep the machines cool. I don’t know how to feel about this.

  5. The plot twist: I didn’t crack it, the agent running on the box did. It handled all the fiddly hostapd setup and stood up a dual-band AP from two separate cards, a MediaTek PCIe card for 5GHz and a cheap TP-Link USB adapter for 2.4GHz. If you’ve ever tried, you know USB WiFi adapters are notoriously awful in AP mode. Vindication, by proxy.

  6. I know, TMI, but in this case I had to share!

  7. A £40 office PC on my toilet-time payroll reverse-engineered a smart dimmer’s Bluetooth protocol so my living room could have nicer light. Not long ago I was actively hating on AI. How the turntables. Or, you know, the great love stories all start with a fight.

  8. “At least I hope so” is doing a lot of load-bearing work in that sentence.

  9. Almost anywhere. More so if you have Starlink, which, no, I don’t have yet.

Author's photo

Burak Yigit Kaya

Curious mind. Open source, behavioral psychology, automation

See other articles:

undefinedThumbnail

Adaptation: new tools in town!

It is not the strongest of the species that survives, nor the most intelligent that survives. It is the one that is most adaptable to change.

ai14-04-2026~5 minutes (902 words)