---
title: "11 - 遠端與手機工作流（iPhone）"
type: note
specialty: Programming
tags: [herdr從0開始使用教學, 11-遠端, iphone, ssh, persistence]
created: 2026-08-04
updated: "2026"
modified: 2026-08-04
---

# 11 - 遠端與手機工作流（iPhone）

← [[10-實戰-Obsidian醫學筆記庫]] | [[00-Index]] | 下一篇 → [[12-設定檔-通知-Plugins-SocketAPI]]

---

## 核心觀念：Herdr 跑在「工作所在的機器」上

一句話：**Run Herdr where the work lives. Attach from wherever you are.**

Herdr = 背景 session server + 一個或多個終端 client。**Pane 在 server 裡跑，client 只是接上去畫畫面。**

所以「用手機看 agent」不是「把 agent 搬到手機上」，而是「用手機當 client 接回那台電腦」。

---

## 三條路徑

| 路徑 | 指令 | 什麼時候用 |
|---|---|---|
| 本機 | `herdr` | 平常在自己電腦前 |
| SSH 進去再跑（tmux 式）| `ssh you@server` → `herdr` | **手機 / 平板 SSH client**、或你本來就活在 SSH shell 裡 |
| 本機薄客戶端連遠端 | `herdr --remote workbox` | 想讓遠端 session「感覺像本機」，需要本機剪貼簿貼圖 |

> ⚠️ **原生 Windows binary 不支援 `herdr --remote`**（也不支援 direct terminal attach 和 live handoff）。從 Windows 要連遠端，官方建議就是 `ssh you@server` 再跑 `herdr`。

---

## iPhone 怎麼用（你的實際情境）

官方講得很直白：

> **You do not need a Herdr mobile app or a web dashboard.** Install any SSH client on your phone, connect to the machine where your agents run, and start Herdr there.

```bash
ssh you@server
herdr
```

TUI 會自適應窄螢幕，所以你可以在手機上檢視 agent、切 workspace、看 pane。官方在 iPhone 上推薦 [moshi](https://getmoshi.app/)（Termius、Blink 也可以）。

### 你需要搭建的東西（⚠️ 以下非 Herdr 官方文件，是環境建置建議）

你的 agent 跑在 Windows PC（建議在 WSL2 裡，理由見 [[02-安裝與環境選擇]]）。要讓 iPhone 連進去：

**1. 在 WSL2 裡跑 sshd**

```bash
sudo apt install -y openssh-server
sudo systemctl enable --now ssh
```

**2. 網路連通**

WSL2 是 NAT 網路，從外部連進來要處理。兩個選項：

| 做法 | 優點 | 缺點 |
|---|---|---|
| **Tailscale**（推薦）| 不用開 router port、不用固定 IP、自動加密、手機直接裝 app | 多一個服務要管 |
| Windows netsh portproxy + router port forwarding | 不依賴第三方 | 設定繁瑣、WSL2 IP 會變、暴露在公網要自己顧安全 |

Tailscale 直接裝在 WSL2 裡：

```bash
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
```

手機裝 Tailscale app 登入同帳號，就能用 `ssh you@<tailscale-name>` 連進去。

**3. 手機端**

```bash
ssh you@wsl-box
herdr
```

接回**同一個 session**，電腦上跑到一半的 Codex 原封不動在那裡。

---

## 手機上實際要做的事（別想太多）

手機螢幕小，**不要試圖在上面寫程式**。它的價值是**巡場**：

| 動作 | 怎麼做 |
|---|---|
| 掃一眼誰在跑、誰卡住 | 看 sidebar（`prefix+b` 開關）|
| 回答 `blocked` 的批准提示 | 點進那個 pane，按 y / Enter |
| 切 workspace | `prefix+w` 或直接點 |
| 快速跳轉 | `prefix+g` |
| 讀某個 agent 的結論 | 點進去用 `prefix+[` copy 模式捲 |
| 派下一批任務 | 切到 Claude 那個 pane 打字 |
| 走人 | `prefix+q` detach |

> 💡 手機上打長 prompt 很痛苦。**實務做法**：在電腦上先把任務檔寫好，手機上只要跟 Claude 說「跑第 3 批」就好。

---

## 通知設定（手機情境的關鍵）

Herdr 可以在 agent 做完或需要輸入時通知你：

```toml
[ui.toast]
delivery = "terminal"      # SSH 情境用這個
delay_seconds = 1
```

四種 delivery：

| 值 | 行為 | 適用 |
|---|---|---|
| `herdr` | App 內 toast | 坐在電腦前 |
| `terminal` | **外層終端機通知，SSH 上運作良好** | **手機 / 遠端** |
| `system` | 本機 OS 通知服務 | 本機桌面 |
| `off` | 關掉 | |

Herdr 會**自動抑制 active tab 的彈出通知**（你正在看的東西不用再通知你）。

聲音：

```toml
[ui.sound]
done_path = "sounds/done.mp3"
request_path = "sounds/request.mp3"

[ui.sound.agents]
codex = "on"
claude = "on"
```

> ⚠️ **聲音是在「本機 Herdr client」播的**。所以你 detach 之後電腦不會響；手機 attach 著的話，是手機那個終端 app 的行為。

腳本裡主動叫自己：

```bash
herdr notification show "詳解量產完成" --body "114 心臟 24 題已產出" --sound done
```

---

## 什麼東西撐得過什麼（持久性總表）

這張表決定你能多放心地關東西：

| 情況 | Process 繼續跑 | 版面回來 | 近期畫面回來 | Agent 對話續接 |
|---|---|---|---|---|
| **Detach / reattach** | ✅ | ✅ | ✅ 從活的終端 | ✅ process 從沒停過 |
| **Server 重啟** | ❌ | ✅ | 只有開 pane history 才有 | 只有 native session restore 才有 |
| 更新（無 `--handoff`）| 相容的 server 繼續跑；需重啟的可能要 stop/restart | ✅ 重啟後 | 同上 | 同上 |
| 更新（`--handoff`）| 支援的 server 盡力保留 | ✅ | ✅ handoff 成功的話 | ✅ process 沒停 |

### 1. Detach 是最強的持久性

因為**原本的 process 從來沒有停過**。這是你日常最該依賴的路徑。

```
prefix+q          → detach（或直接關終端機視窗）
herdr             → 回來
herdr server stop → 真的結束（會停掉所有 pane process）
```

### 2. Snapshot restore（server 重啟後）

Server 停掉再開，原本的 pane process 就沒了。Herdr 會還原**版面形狀**：workspace、tab、pane、cwd、layout、focus。**不會還原正在跑的 shell、server、測試或任意 process**——它們變回該目錄下的新 shell。

### 3. Pane screen history（預設關閉）⚠️

可以在 server 全重啟後還原**近期終端內容**（還原的是「畫面」，不是 process）：

```toml
[experimental]
pane_history = true
```

> 🔴 **預設關閉是有理由的**：pane 輸出可能包含**密碼、token、prompt 和指令輸出**。開了之後 Herdr 會存在 `session-history.json`（在 `session.json` 旁邊）。**把 Herdr 的 config/session 目錄當成 shell history 一樣看待。**
>
> 你的 vault 有醫學內容、理財對帳單資料，**建議不要開**，或至少想清楚再開。

### 4. Native agent session restore（預設開啟）

有些 agent 可以續接自己的對話。Herdr 用 integration 回報的原生 session reference，在 server 重啟後重新啟動這些 agent pane：

| Agent | 最低 integration 版本 | 續接指令 |
|---|---|---|
| **Claude Code** | `6` | `claude --resume <id>` |
| **Codex** | `5` | `codex resume <id>` |

檢查你裝的版本：

```bash
herdr integration status
herdr integration install claude   # 過舊就重裝
```

要關掉：

```toml
[session]
resume_agents_on_restore = false
```

> 💡 如果 native session restore 適用於某個 pane，Herdr 會**優先續接 agent session，而不是重播 pane history**。

---

## `herdr --remote`（Linux/macOS client 才有）

如果你之後有 Linux/macOS 機器當 client：

```bash
herdr --remote workbox
herdr --remote ssh://you@server:2222
herdr --remote workbox --session agents      # 遠端的具名 session
```

本機 Herdr 當**薄客戶端**：透過 SSH 連線、啟動或接上遠端 Herdr server、把 UI 串回本機終端。

好處是**本機桌面功能可以橋接到遠端**（例如剪貼簿貼圖：把圖複製到遠端暫存檔再貼路徑）。如果你是先 SSH 再跑 `herdr`，Herdr 整個跑在 server 上，**讀不到你本機桌面的剪貼簿**。

SSH config 讓它更好用：

```text
Host workbox
  HostName server.example.com
  User you
  Port 2222
```

其他細節：

- 預設用**本機的 keybinding**（保留肌肉記憶）；要用遠端設定就 `--remote-keybindings server`。本機 keybinding 是 attach 當下的快照，改完要 detach 再 attach。
- 遠端沒有相容 binary 時，互動式執行會問要不要裝到 `~/.local/bin/herdr`；非互動式則直接失敗（不會偷改主機）。
- 用 passphrase 保護的 key 且在無法顯示提示的環境（腳本、CI、手機終端）→ 先 `ssh-add`。
- 認證失敗時，**先確認 `ssh workbox` 這個純 SSH 能不能通**，再回頭試 `herdr --remote`。

---

## Direct terminal attach（Unix only）

不想開整個 Herdr UI，只想接一個終端：

```bash
herdr agent attach reviewer
herdr agent attach reviewer --takeover
herdr terminal attach term_abc123
```

- Detach 用 `ctrl+b q`；送出字面上的 `ctrl+b` 用 `ctrl+b ctrl+b`。
- 用滑鼠滾輪或 PageUp/PageDown 捲動；**正常輸入會跳回底部**。
- 同時只有一個可寫的 direct attach client 擁有輸入和 resize 權，要搶用 `--takeover`。

> ⚠️ **Windows beta 不支援 direct terminal attach。**

**手機上的實用場景**：只想看某一個 Codex 的畫面、不想被整個 TUI 的 sidebar 佔掉小螢幕時，`herdr agent attach w-心臟a` 會清爽很多（前提是你連的是 Linux/WSL 端）。

---

## 一個實際的「離開電腦」檢查清單

離開前：

- [ ] 每個 worker 都已經 `agent prompt` 派完工了嗎？
- [ ] 有沒有哪個 pane 正等著你回 y/n？（sidebar 看 `blocked`）
- [ ] `[ui.toast] delivery` 設成 `terminal` 了嗎？
- [ ] `prefix+q` detach（**不要 `herdr server stop`**）

回來時：

- [ ] `herdr` 接回來
- [ ] 掃 sidebar：誰 `done`、誰 `blocked`、誰還在 `working`
- [ ] **驗收看檔案，不要只看狀態**（見 [[08-Claude當大腦-Codex當雙手]]）

---

## 🔗 相關筆記

- [[10-實戰-Obsidian醫學筆記庫]] — 上一步：實際的日常場景
- [[12-設定檔-通知-Plugins-SocketAPI]] — 下一步：完整設定選項
- [[02-安裝與環境選擇]] — WSL2 與 iPhone 環境建置
- [[03-核心概念]] — client / server 分離的原理

---

*最後更新：2026-08-04*
