Coding from my phone
Terminus, Tailscale, and a NUC in the study. The setup I use to get real work done from a phone, and the two places it stops being pleasant.
The machine that does my work sits in the study. I’m frequently somewhere else — a car park, a waiting room, the couch — and for a while now that’s stopped mattering.
Four pieces, none of them clever.
The box is an Intel NUC 11 Enthusiast, the Phantom Canyon model: i7-1165G7, RTX 2060, small enough to hide behind a monitor. It runs Ubuntu with the whole dev stack on it — runtimes, Docker, the repos I actually work in, and Claude Code. It was bought for other reasons and spent a long time underused.
Tailscale puts the phone and the NUC on the same network without opening a port on the router or thinking about dynamic DNS. Install it both ends, sign in, done. The NUC has no public surface at all; it’s reachable from my devices and nothing else. This is the piece I’d have expected to be fiddly and it simply wasn’t.
Terminus on iOS is the terminal. SSH over the tailnet, key auth, one saved host. That’s the entire client story.
Then it’s just: shell in, run claude, describe what I want, watch it work.
Why a phone is enough
The agent changes what the small screen has to do. Typing code on glass is miserable and always will be. Typing a paragraph that describes an intent is fine — that’s the same thing the phone is already good at. So the handset becomes an input device for direction, and the part that actually needs a keyboard happens at the other end of the tunnel on a machine that has one.
I do nothing special about dropped connections. No mosh, no tmux acrobatics. Mobile data drops sometimes, I reconnect and pick up where I was. It hasn’t been enough of a problem to engineer around, which surprised me more than it should have.
Review happens in a different app. Claude pushes a branch and raises a PR, and I read it in the GitHub mobile app, which is a much better diff viewer than anything I’d get in a terminal pager on a phone. Comment, approve, merge, all from the same place. That split — Terminus to direct the work, GitHub to inspect it — is most of what makes the loop feel complete rather than like a party trick.
Where it stops being pleasant
Long prompts. Anything past a couple of sentences on a touch keyboard is a grind, and the temptation is to under-specify because typing hurts. That’s exactly the wrong economy — a vague prompt costs more in the round trips it causes than the thirty seconds saved. I’ve learned to just take the time, or to dictate and clean up the mess afterwards.
And reviewing anything large. You can read a diff on a six-inch screen; you can’t really review one. Small, self-contained changes are fine. Anything touching several files at once gets a mental note to look at it properly later, and waits for a desk. I don’t merge what I haven’t read, so those sit.
Neither is a dealbreaker, because this was never meant to replace sitting down. It replaces the work not happening at all — the twenty minutes in a waiting room that used to be a write-off and now closes a ticket.