I do not run coding agents on my laptop anymore. Every Claude Code session I start runs on a mini PC in my house, and I open it from my phone, from my notebook, or from the desktop in the same room. Closing the laptop does not end anything.
The machine is an Intel N100 with 15.4 GB of RAM and 4 cores, running Debian 13. It also runs 24 Docker containers across eight stacks: Plex, Immich, Nextcloud, Sonarr and qBittorrent, with Caddy in front of all of it. It is the same box. When I ask why a container keeps restarting, the session is already on the machine where it restarts.
Three ways in
There are three doors to that machine and I use all of them.
The first is the Claude Code app. A systemd unit runs claude remote-control on the server with a capacity of eight sessions, so the app opens one on demand from my phone or my notebook. I left it on the default permission mode. Every sensitive action comes back to me as an approval card, and I answer it from wherever I am. That session can change anything on the machine, so the card is the part I want.
The second is Telegram. A session sits there listening to the server’s own bot. When a disk alert or an audit warning lands in that channel I answer in the same thread, and the work happens on the machine that sent the alert. It restarts at 5am to clear the context. Claude Code resends the whole conversation on every message, so a session left open for days makes a one-line question cost the whole day.
The third is Orca, the ADE I wrote about here. It runs headless on the server now, on port 6768, paired to my phone over a NetBird mesh. The port is not open to the internet. An nftables rule holds it to loopback and to the mesh, and that rule is its own unit that starts before Orca does.
What I tried in Anthropic’s cloud
Claude provides its own cloud instances and I used them before this. I ran into bugs there. There were also things I needed it to do that it could not do in that environment. A dedicated computer that is mine turned out to be more interesting to me than an instance I get handed, and I already had the computer.
What it reaches from there
The stacks live in /srv/stacks, one compose.yaml each, in git. The agent edits the file, runs docker compose up -d in that directory, and commits. My own scripts are on the same disk: the audit that lists what is pending, the backup that waits for the 2 TB drive to be plugged in, the watcher that checks temperature and read-only filesystems every five minutes.
Before this, a question like “why did that import copy the file instead of hardlinking it” meant opening SSH, reading logs, and pasting them into a chat somewhere else. Now I ask it in the same channel the alert came from.
It reaches the alert bot too, which turns out to matter in the other direction. The image at the top of this post got to my phone that way. I was reviewing the draft from outside the house, the app session had no way to attach a file, so it rendered the PNG and pushed it to me through the bot that normally sends disk warnings. It sent it as a document instead of a photo, because Telegram compresses photos and the art is text.
Hermes is still on the machine
My own agent, Hermes, runs in a container on that same box. It reads RSS, email and Telegram, and I hand it research and work that takes several steps. Every Saturday it checks which models it should be running.
Running a procedure is where it has not held up for me, on the server or inside a project. So when there is something to execute I open a session for it, through the Claude Code app or through Orca. Orca drives other CLI agents too, so that session does not have to be Claude.
It comes back on its own
There is a UPS under the desk with no data cable, so nothing on the machine knows it is there, and a short outage passes without the machine noticing it either. Past that it is boot behavior. All 24 containers are restart: unless-stopped. The Claude services, the Orca server and the firewall rule that fences its port are enabled units. The firmware on this mini PC rewrites the boot order at every power on, so a small service rearms BootNext for Debian on each boot.
Power returns, the machine boots, the containers come up, the agent services come up, and my phone finds it again. There is no monitor plugged into it.
What I gave up
One machine, in my house, running everything I have. There is no redundancy. If the NVMe fails the way the SATA disk failed in July, all of it stops at the same moment, and the backup drive is only current up to the last time I plugged it in.
It also depends on my home connection. The machine comes back on its own after an outage, but while my link is down there is nothing to reach from outside, and the mesh does not help with that. A cloud instance does not have that problem.