Build · 01 Case study
I run my whole dev workflow from my phone
Claude Code lives in a tmux session on a VPS that exposes nothing to the internet. Three private ways in from my phone.
// Problem
My laptop is shut more hours than it is open, and every build stopped when I shut it. I wanted the editor, the terminal session, and the coding agent to live on a box that never sleeps, reachable from the phone in my pocket, without opening a single port to the internet for any of it.
// What I built
An Oracle Cloud free-tier ARM box that answers nothing on its public IP. Tailscale puts it on a private WireGuard mesh, and every service binds to loopback or the tailnet address: SSH, n8n, code-server, the Syncthing GUI. Once the tailnet worked I dropped the inbound SSH rule, so a port scan from outside finds nothing to attack. Everything else here is safe to leave running because of that one decision.
On top of it, three ways in from the phone, and I use all three depending on where I am:
The Claude app. Claude Code runs inside a tmux session with /remote-control switched on, so the session shows up in the Claude mobile app under the same account. I read what it is doing, send the next instruction, and approve tool calls with one hand on a bus. Back at a keyboard, tmux a puts me in the same session mid-command.
SSH from a phone terminal. The phone is on the tailnet like everything else. One alias opens the connection, forwards the loopback dashboards to matching ports on whatever device I am holding, and drops me into that same tmux session. This is the fallback when the job is not a conversation: restart a container, tail journalctl, unwedge a service.
A Telegram bot. OpenClaw runs as a user service on the box and bridges a model to Telegram, with filesystem access to the same checkout. I message it small errands and it works while I do something else.
Reading a diff on a phone tells you nothing about whether a page renders, so for visual work the agent serves the project on the tailnet address and I watch it change in the phone browser as it edits.
// Result
I start something at my desk, shut the laptop, and pick up the same running session on my phone an hour later without moving a file. Long jobs keep going whether or not I am watching. The convenience costs me no open ports, because two of the three routes ride my own tailnet and the third is an outbound connection from the box.
// Proof
I wrote the setup up as a guide anyone can follow, with the real config files beside it. Each chapter below documents one piece of what you just read.