TL;DR

I run an autonomous coding agent (built on Claude Code) on a Mac mini at home, and for months the only way to check on it away from my desk was SSH from my phone — which is exactly as miserable as it sounds. So I built a small remote control layer: a file-based command queue with an allowlist of safe intents, polled by a watcher daemon, with results pushed back to my phone. This post covers the architecture, the code, and 5 lessons about designing async interfaces for AI agents. 📱🤖

The Problem

For about a year I've been running a fully autonomous implementation system — a set of Claude Code sessions that pick up tasks, write code, verify their own work, and commit, mostly without me. It lives on a Mac mini in my apartment and runs on a schedule, day and night.

Here's the thing nobody tells you about autonomous agents: the more autonomous they get, the more your anxiety becomes the bottleneck. The agent is fine. It's been fine for months. But when I'm out for dinner and a run kicks off at 9pm, some part of my brain goes: did it start? did it get stuck? is it currently rewriting my git history?