Claude Code On-the-Go
I run six Claude Code agents in parallel from my phone. No laptop, no desktopâjust Termius on iOS and a cloud VM.The Setupflowchart LR A[Phone] -->|Termius + mosh| B[Tailscale VPN] B --> C[Vul...
I run six Claude Code agents in parallel from my phone. No laptop, no desktopâjust Termius on iOS and a cloud VM.The Setupflowchart LR
A[Phone] -->|Termius + mosh| B[Tailscale VPN]
B --> C[Vultr VM]
C --> D[Claude Code]
D -->|PreToolUse hook| E[Poke webhook]
E -->|Push notification| A
The loop is: kick off a task, pocket the phone, get notified when Claude needs input. Async development from anywhere.InfrastructureA Vultr VM in Silicon Valley:SpecValueInstancevhf-8c-32gbCost$0.29/hr (~$7/day when running)AccessTailscale-only (no public SSH)I pay only when working. Two scripts handle lifecycle:vm-start # Start VM, wait for Tailscale, connect via mosh
vm-stop # Halt VM
I also have an iOS Shortcut that calls the Vultr API directlyâstart the VM from my phone before I even open Termius.The VMâs public IP has no SSH listener. All access goes through Tailscaleâs private network. Defense in depth: cloud firewall blocks everything except Tailscale coordination, local nftables as backup, fail2ban for good measure.Mobile TerminalTermius handles SSH and mosh on iOS/Android. Mosh is the keyâit survives network transitions. Switch from WiFi to cellular, walk through a dead zone, put the phone to sleep. The connection persists.One gotcha: mosh doesnât forward SSH agent. For git operations that need GitHub auth, I use regular SSH inside tmux.Session PersistenceThe shell auto-attaches to tmux on login. Close Termius, reopen hours later, everythingâs still there.# In .zshrc
if [[ -z "$TMUX" ]]; then
tmux attach -t main 2>/dev/null || tmux new -s main
fi
Multiple Claude agents run in parallel windows. C-a c for new window, C-a n to cycle. Works well on a phone keyboard.Push NotificationsThis is what makes mobile development practical. Without notifications, youâd constantly check the terminal. With them, you can walk away.The hook in ~/.claude/settings.json:{
"hooks": {
"PreToolUse": [{
"matcher": "AskUserQuestion",
"hooks": [{
"type": "command",
"command": "~/.claude/hooks/poke-notify.sh question"
}]
}]
}
}
When Claude calls AskUserQuestion, the hook fires. A simple script extracts the question and POSTs to Pokeâs webhook:QUESTION=$(echo "$EVENT_DATA" | jq -r '.tool_input.questions[0].question')
MESSAGE="$PROJECT_NAME: Claude needs input - $QUESTION"
curl -X POST "$API_URL" -d "{\"message\": \"$MESSAGE\"}"
Phone buzzes. Notification shows the question. Tap, respond, continue.Trust ModelI run Claude Code in permissive mode. The VM is isolatedâno access to production systems, no secrets beyond whatâs needed for development. Worst case: Claude does something unexpected on a disposable VM.Cost control adds another layer. The VM costs $0.29/hr. Even if something runs away, the daily cap is bounded.Parallel DevelopmentGit worktrees let me run multiple features simultaneously:~/Code/myproject/ # main
~/Code/myproject-sidebar/ # feature branch
~/Code/myproject-dark-mode/ # another feature
Each worktree gets its own tmux window with a Claude agent. Port allocation is hash-basedâdeterministic from branch name, no conflicts:hash_val = sum(ord(c) for c in branch_name)
django_port = 8001 + (hash_val % 99)
Six agents, six features, one phone.What This EnablesReview PRs while waiting for coffee. Kick off a refactor on the train. Fix a bug from the couch while watching TV.The pattern: start a task that will take Claude 10-20 minutes, do something else, get notified, respond, repeat. Development fits into the gaps of the day instead of requiring dedicated desk time.The ComponentsToolPurposeVultrCloud VM ($0.29/hr, pay-per-use)TailscalePrivate network, secure accessTermiusiOS/Android SSH clientmoshNetwork-resilient shelltmuxSession persistencePokePush notifications via webhookClaude CodeThe actual workThe setup took one Claude Code session to buildâgave it my Vultr API key and access to gh, asked for a secure dev VM. Now I code from my phone.