SSH and RDP into the homelab: a phone as my only dev machine

2026.09.13 · 6 min · homelab, remote-dev, ssh, rdp, claude-code

I stopped syncing state across a laptop and a desktop and just moved the whole dev environment onto the H12D-8D. SSH for terminal work, RDP for anything that needs a screen, reachable from a phone.

Commuting was dead time. Pulling out a laptop on a train or between meetings isn't practical, there's nowhere to put it and no time to wait for it to wake up. But I didn't want to stop working just because I didn't have a laptop open. The fix was moving the actual dev environment off the laptop entirely, onto something I could reach from a phone.

One VM, two doors in

The Cloud Dev Machine is a KVM VM on the same Huananzhi H12D-8D host from Build Log MSN-002-B, sitting alongside the MI50 inference LXC and the rest of the tenants. I reach it two ways depending on what I'm doing: SSH for anything terminal-based, RDP when I need an actual desktop for a browser or a GUI tool. Both routes go over Tailscale, so there's no VPN client to configure on whatever device I'm holding and no ports opened to the public internet.

The laptop and the phone are both just terminals into the same machine now. Neither one holds any state that matters.

Persistent agents that outlive the connection

The part that actually solves the closed-lid problem is running Claude Code itself as a set of persistent background agents on that VM instead of a foreground terminal session:

claude --remote-control agent-cloud-1 --bg --name agent-cloud-1 --add-dir /home/ray/dev/a

Four of these run at once, `agent-cloud-1` through `agent-cloud-4`, each pinned to its own working directory. They're background processes managed by Claude Code itself, not tied to my SSH session, so closing the laptop or losing signal on the train doesn't touch them. A crontab `@reboot` entry restarts all four automatically if the VM itself reboots.

claude agents                    # list all
claude stop agent-cloud-1        # stop one, keeps the conversation
claude attach agent-cloud-1      # reconnect from wherever I am

From the phone, the Claude app's Remote Control panel connects straight into whichever agent I need. I've started something from a laptop at a desk and picked the same conversation back up from a phone on a train with the task still running in between.

Compute lives on the EPYC host, not on whatever battery I happen to be carrying. State survives disconnects instead of dying with the SSH session. And it doesn't matter which physical device I pick up, phone, laptop, a borrowed machine, since none of them hold anything, they're all just SSH or RDP into the same VM.

The trade-off

This only works because the homelab is reliably up. A local dev setup fails gracefully, worst case you're stuck on one device with everything intact. This fails all at once if the H12D-8D goes down or Tailscale can't reach it. I've accepted that trade for a single box I control over syncing state across multiple devices I don't always have with me.