手机远程 Vibe Coding 配置教程(Moshi + Herdr + Pi)
Oct 31, 2026 · @eastseven
架构总览
手机只负责连接、查看和审批,Pi 始终在一台常驻开机的主机(本文以 Mac 为例)的 herdr 会话中运行。所有连接都通过 Tailscale,不需要在公网开放任何端口。

手机有两条通道连到主机:一条是 SSH/Mosh,用来操作终端;另一条是推送通道,由 moshi-hook 读取 Pi 的 hook 事件,经 Moshi 云端推到手机,你在手机上点的审批结果再沿同一条路返回给 Pi。
一、电脑端基础配置
被控主机是一台常驻开机的 Mac,下文用 <用户名> 指代它的登录用户。下面每一步都在这台 Mac 上执行,可以在本机终端里做,也可以从另一台电脑 SSH 进来做。
1. 确认 Tailscale
tailscale status # 手机和这台 Mac 都应显示在线
tailscale ip -4 # 记下本机的 100.x.x.x 地址
在 Tailscale 管理后台打开 MagicDNS 之后,可以用 <主机名>.<tailnet>.ts.net 代替 IP。
2. 开启 SSH(远程登录)
sudo systemsetup -setremotelogin on
# 或者打开「共享」设置页手动开启:
open "x-apple.systempreferences:com.apple.Sharing-Settings.extension"
在「远程登录 → 允许访问」里确认包含当前用户。系统设置链接前面必须加 open,直接把链接当命令执行会报 command not found。
3. 配置 SSH 密钥
在手机 Moshi 里生成密钥,把公钥追加到 Mac 上:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "<手机公钥>" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
全部跑通以后,可以在 /etc/ssh/sshd_config 里设置 PasswordAuthentication no,关闭密码登录。
4. 安装 Mosh
brew install mosh
which mosh-server # 应输出 /opt/homebrew/bin/mosh-server
后面执行 moshi-hook host setup 时会检查 mosh-server,找不到会直接报错退出。
5. 防止睡眠
sudo pmset -a sleep 0 disksleep 0
也可以在「系统设置 → 能源」里打开「防止自动睡眠」。主机一旦睡眠,SSH 连接和正在运行的 agent 都会中断。
6. 检查 ~/.config 的权限
ls -ld ~/.config # 所有者应为当前用户,而不是 root
sudo chown -R $(whoami):staff ~/.config # 仅在所有者是 root 时执行
如果以前用 sudo 装过工具,这个目录可能变成 root 所有,之后 moshi-hook 会报 mkdir ... permission denied。
二、安装 Herdr 与 Pi
Herdr 让 Pi 常驻后台运行,断网或关掉 App 都不会中断它。Pi 就是实际干活的编码 agent。
# Herdr
brew install herdr
# 或:curl -fsSL https://herdr.dev/install.sh | sh
herdr --version
# Pi
curl -fsSL https://pi.dev/install.sh | sh
# 或:npm install -g @earendil-works/pi-coding-agent(需要 Node.js 22.19+)
pi # 首次运行,配置模型和 API Key
herdr integration install pi # 让 herdr 能准确识别 Pi 的状态
herdr integration status
安装时注意三点:
- Pi 的 npm 包名已经从
@mariozechner/pi-coding-agent改为@earendil-works/pi-coding-agent。 - 必须先运行一次
pi,让~/.pi/agent目录生成出来,herdr integration install pi才会写入扩展。 - 第一次请在 Mac 本机的图形终端里运行
herdr,而不是通过 SSH。这样后台服务从图形会话启动,以后可以避免 Keychain 访问出问题。
herdr 常用操作:
| 操作 | 命令 / 按键 |
|---|---|
| 启动或连接会话 | cd ~/project && herdr |
| 分离(agent 继续运行) | ctrl+b q |
| 重新连接 | herdr |
| 彻底停止(会结束所有 agent) | herdr server stop |
| 查看所有生效的快捷键 | ctrl+b ? |
三、安装并配对 moshi-hook
用 herdr 时 moshi-hook 是必装的。它把 agent 的审批请求和完成事件推送到手机,Moshi 在 herdr 下没有抓屏识别作为后备,不装就收不到任何通知。
1. 安装
brew tap rjyo/moshi
brew trust --formula rjyo/moshi/moshi-hook # 新版 Homebrew 默认不信任第三方 tap
brew install moshi-hook
2. 写入各 agent 的 hook
moshi-hook install
输出里应能看到 pi -> installed。显示 not found, skipped 的是本机没装的 agent,可以忽略。
中途会询问是否关闭 Codex 的共享后台服务,选 Turn it off。它只在 ~/.codex/config.toml 里写一行 daemon_auto_start = false,可以随时删掉恢复。关掉后每个 Codex 会话独立运行在自己的窗格里,审批不会落到错误的窗格。
3. 配对(推荐用文件存储密钥)
先在手机 Moshi 的「设置 → Agent Hooks」里复制配对 token,然后执行:
moshi-hook pair --token <token> --store file
为什么不用默认的钥匙串:通过 SSH 操作时,macOS 登录钥匙串是锁着的,会报 macOS Keychain is locked。主机重启后如果没人在本机登录,钥匙串也会一直锁着,daemon 照样读不到密钥。存成文件就没有这些问题。
如果要走扫码流程,执行 moshi-hook host setup,并且要先装好 mosh。这个流程会同时配置手机的 SSH 接入。
4. 启动服务并检查
brew services restart moshi-hook
moshi-hook status # 应显示 paired
moshi-hook doctor # 所有检查项应为 ✓
doctor 里要确认三项:daemon 在运行、pairing 已完成、tmux/herdr 能找到。只要这三项是 ✓,下面的 Agent inbox、Chat View、Diff viewer 等功能就会一起恢复。
macOS 右上角弹出「App 后台活动」通知是正常现象,说明 moshi-hook 注册成了登录项。不要在「登录项与扩展」里关掉它,否则重启后服务不会自动启动。
四、手机端配置
手机端只需要两个 App:Tailscale 负责组网,Moshi 负责终端、收件箱和审批。
- 安装 Tailscale,登录和 Mac 同一个账号,确认显示 Connected。
- Android 同一时间只能运行一个 VPN。如果状态栏的钥匙图标属于别的代理工具,Tailscale 就会被挤掉,连接一定失败。
- 如果用主机名连不上、用 IP 能连上,就把「设置 → 网络 → 私人 DNS」关掉或改成自动。私人 DNS 会干扰 MagicDNS。
- 从 Google Play 或 App Store 安装 Moshi。
- 新建连接:
| 字段 | 填写 |
|---|---|
| 主机 | 主机的 Tailscale IP(100.x.x.x),或 <主机名>.<tailnet>.ts.net |
| 端口 | 22 |
| 用户名 | <用户名> |
| 认证 | SSH 密钥(公钥已写入主机的 authorized_keys) |
| Mosh server 路径(如需要) | /opt/homebrew/bin/mosh-server |
- 允许 Moshi 发送通知(Android 在「设置 → 应用 → Moshi → 通知」)。没有通知权限,审批和完成提醒会静默丢失。
- iPhone 用户可以在「Moshi → 设置 → Hooks」里打开 Live Activity,在锁屏上直接看到 agent 状态。
关于付费:免费版就有完整的 SSH 终端、无限会话、agent 推送(有频率限制)和语音输入,日常够用。Pro 版每月 7.99 美元或每年 69.99 美元,可用于三台设备,额外提供 Mosh 传输、herdr 多路复用界面、图片粘贴和 diff 查看。
五、验证与日常使用
收件箱里能出现 Pi 任务的卡片,就说明整条链路通了。按下面五步验证一次:
- 手机用 Moshi 连接主机。
- 执行
cd ~/某个项目 && herdr。 - 在窗格里运行
pi,给一个小任务,比如「给 README 加一段说明」。 - 锁屏等它完成,看 Moshi 是否收到推送。
- 打开 Moshi 收件箱,任务应该出现在「Needs you / Working / Done」其中一栏。
日常使用的几个习惯:
- 一个项目一个 workspace:手机屏幕小,侧边栏状态清楚才能一眼看出哪个 agent 在等你。
- 离开时只分离,不停止:按
ctrl+b q或直接关掉 App,Pi 会在主机上继续跑。herdr server stop会结束所有 agent。 - agent 必须在 herdr 里启动:在裸 shell 里运行的 agent,Moshi 无法跟踪。也不要在 herdr 里再套一层 tmux。
- hook 改动后重启 agent:agent 只在启动时读取 hook 配置。重装或更新 moshi-hook 之后,正在运行的 Pi 要重启一次。
- 用语音写需求:长任务交给 Pi 自己跑,你只在审批推送或它卡住的时候介入。
六、常见问题与排查
下表是配置过程中常见的报错,按通常出现的顺序排列。
| 现象 | 原因 | 解决 |
|---|---|---|
Refusing to load formula ... from untrusted tap | 新版 Homebrew 默认不信任第三方 tap | brew trust --formula rjyo/moshi/moshi-hook |
zsh: command not found: x-apple.systempreferences... | 把系统设置链接当成了命令 | 前面加 open |
mkdir ~/.config/moshi: permission denied | ~/.config 的所有者变成了 root | sudo chown -R $(whoami):staff ~/.config,不要用 su 或 root 运行 moshi-hook |
mosh-server was not found on PATH | 没装 mosh | brew install mosh |
macOS Keychain is locked or unavailable | 通过 SSH 操作时钥匙串是锁着的 | moshi-hook pair --token <token> --store file |
status: unpaired / doctor 显示 daemon not running | 还没配对,daemon 启动后马上退出 | 完成配对后执行 brew services restart moshi-hook |
doctor 显示 no tmux, herdr ... | 这台机器上没装 herdr | brew install herdr,然后重启 moshi-hook |
手机报 Connection failed: Disconnected | 远程登录没开、VPN 不是 Tailscale、MagicDNS 被私人 DNS 干扰,或主机在睡眠 | 按第一节第 2 步和第四节第 1 步逐项检查,先改用 IP 连接试试 |
| 收件箱一直没反应 | daemon 没运行,或配对的不是同一个 Moshi 账号 | moshi-hook doctor,再看 moshi-hook logs -f |
还查不出原因时,可以同时打开两组日志对照:
log stream --predicate 'process == "sshd"' --info # SSH 层:请求有没有到达 Mac
tail -50 ~/Library/Application\ Support/Moshi/hook.log # moshi-hook 层
最后提醒一点:moshi-hook host setup 生成的 moshi://host/setup?... 链接里带有一次性配对密钥,过期之前不要发到别处。