随时随地使用CLAUDE CODE

作者: mgranda
日期: 2026年1月
  

我在手机上并行运行六个Claude Code代理。没有笔记本电脑,没有台式机——只有iOS上的Termius和云虚拟机。

设置

flowchart 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

流程是:启动任务,将手机放入口袋,当Claude需要输入时收到通知。从任何地方进行异步开发。

基础设施

硅谷的Vultr虚拟机:

SpecValue
Instancevhf-8c-32gb
Cost$0.29/小时 (运行时约$7/天)
Access仅Tailscale (无公共SSH)

我只在工作时付费。两个脚本管理生命周期:

vm-start   # Start VM, wait for Tailscale, connect via mosh
vm-stop    # Halt VM

我还有一个直接调用Vultr API的iOS快捷指令——在我甚至打开Termius之前就从手机启动虚拟机。

虚拟机的公共IP没有SSH监听器。所有访问都通过Tailscale的私有网络。深度防御:云防火墙阻止除Tailscale协调之外的所有内容,本地nftables作为备份,fail2ban以防万一。

移动终端

Termius在iOS/Android上处理SSH和mosh。Mosh是关键——它能在网络切换中幸存。从WiFi切换到蜂窝网络,穿过信号盲区,让手机进入睡眠状态。连接持续存在。

mosh --ssh="ssh -p 47892" [email protected]

一个问题:mosh不转发SSH代理。对于需要GitHub身份验证的git操作,我在tmux中使用常规SSH。

会话持久性

Shell在登录时自动附加到tmux。关闭Termius,几小时后重新打开,一切都还在。

# In .zshrc
if [[ -z "$TMUX" ]]; then
    tmux attach -t main 2>/dev/null || tmux new -s main
fi

多个Claude代理在并行窗口中运行。C-a c用于新窗口,C-a n用于切换。在手机键盘上效果很好。

推送通知

这就是使移动开发变得实用的原因。没有通知,你会不断检查终端。有了通知,你可以走开。

~/.claude/settings.json中的钩子:

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "AskUserQuestion",
      "hooks": [{
        "type": "command",
        "command": "~/.claude/hooks/poke-notify.sh question"
      }]
    }]
  }
}

当Claude调用AskUserQuestion时,钩子触发。一个简单的脚本提取问题并POST到Poke的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\"}"

手机震动。通知显示问题。点击,回应,继续。

信任模型

我在宽松模式下运行Claude Code。虚拟机是隔离的——无法访问生产系统,除了开发所需的秘密之外没有其他秘密。最坏的情况:Claude在一次性虚拟机上做了一些意外的事情。

成本控制增加了另一层。虚拟机每小时花费$0.29。即使出现失控,每日上限也是有界的。

并行开发

Git工作树让我同时运行多个功能:

~/Code/myproject/              # main
~/Code/myproject-sidebar/      # feature branch
~/Code/myproject-dark-mode/    # another feature

每个工作树都有自己的tmux窗口和Claude代理。端口分配基于哈希——从分支名称确定性生成,无冲突:

hash_val = sum(ord(c) for c in branch_name)
django_port = 8001 + (hash_val % 99)

六个代理,六个功能,一部手机。

这带来了什么

等咖啡时审查PR。在火车上启动重构。在沙发上看电视时修复bug。

模式:启动一个需要Claude 10-20分钟的任务,做其他事情,收到通知,回应,重复。开发适合一天中的空隙时间,而不需要专门的办公时间。

组件

ToolPurpose
Vultr云虚拟机 ($0.29/小时,按使用付费)
Tailscale私有网络,安全访问
TermiusiOS/Android SSH客户端
mosh网络弹性shell
tmux会话持久性
Poke通过webhook推送通知
Claude Code实际工作

设置花了一个Claude Code会话来构建——给了它我的Vultr API密钥和对gh的访问权限,要求一个安全的开发虚拟机。现在我用手机编码。


Hacker News上讨论这篇文章