# purplemux
**Claude Code 與 Codex,多項任務同時進行。更快速。**
一個畫面縱覽所有工作階段,在手機上也毫無中斷。
繁體中文 | English | 한국어 | 日本語 | 简体中文 | Deutsch | Español | Français | Русский | Português (Brasil) | Türkçe


## 安裝
```bash
npx purplemux@latest
```
在瀏覽器中開啟 [http://localhost:8022](http://localhost:8022)。完成。
> 需要 Node.js 20+ 與 tmux。macOS 或 Linux。
想用原生應用程式?可從[最新發行版](https://github.com/subicura/purplemux/releases/latest)下載 macOS Electron 版(適用於 Apple Silicon 與 Intel 的 `.dmg`)。
## 為什麼選擇 purplemux
- **多工作階段儀表板** — 一眼掌握所有 Claude Code 與 Codex 工作階段的「執行中 / 等待輸入」狀態
- **速率限制監控** — 顯示 5 小時 / 7 天剩餘額度與重置倒數
- **推播通知** — 任務完成或需要輸入時,透過桌面與行動裝置推播提醒
- **行動裝置 & 多裝置** — 在手機、平板或其他桌面都能存取同一工作階段
- **即時工作階段檢視** — 不必捲動 CLI 輸出,進度以時間軸形式整理呈現
此外
- **不中斷的工作階段** — 以 tmux 為基礎。關閉瀏覽器後工作階段與作業環境依然保留。重新連線時,分頁、窗格、目錄都維持最後狀態
- **自架 & 開源** — 程式碼與工作階段資料僅存在本機,不經任何外部伺服器
- **加密遠端存取** — 透過 Tailscale 在任何地方使用 HTTPS 連線
## 與官方 Remote Control 的差異
> 官方 Remote Control 專注於單一工作階段的遠端控制。當你需要多工作階段管理、推播通知與工作階段持久化時,請使用 purplemux。
## 特色
### 終端機
- **窗格分割** — 水平 / 垂直自由分割,可拖曳調整大小
- **分頁管理** — 多分頁、拖曳排序、依據行程名稱自動命名
- **鍵盤快速鍵** — 分割、切換分頁、移動焦點
- **終端機佈景主題** — 深色 / 淺色模式,多種配色佈景主題
- **工作區 & 群組** — 以工作區為單位儲存 / 還原窗格配置、分頁與工作目錄。可透過拖曳將工作區組織為群組進行管理
- **Git 工作流程** — 支援 Side-by-side / Line-by-line 切換與語法高亮,並可行內展開 hunk、分頁瀏覽歷史紀錄分頁。可從窗格直接 fetch / pull / push (含 ahead/behind 指示) — 同步失敗時 (dirty worktree、衝突) 一鍵 Ask Claude 或 Codex
- **內建瀏覽器窗格** — 在終端機旁嵌入瀏覽器檢視開發結果 (Electron)。可透過 `purplemux` CLI 控制,並以內建裝置模擬器切換視口
- **代理分頁** — 從新增分頁選單啟動 Claude、Codex 或整合工作階段列表
### Claude Code 與 Codex 整合
- **即時狀態** — 執行中 / 等待輸入指示,可於工作階段間切換
- **即時工作階段檢視** — 訊息、工具呼叫、任務、權限請求、thinking 區塊
- **Codex 分頁** — 以與 Claude 相同的 tmux 持久化能力啟動 Codex CLI 工作階段
- **工作階段列表** — 在單一整合檢視中瀏覽並恢復最近的 Claude 與 Codex 工作階段
- **一鍵 Resume** — 直接從瀏覽器恢復已中斷的 Claude 或 Codex 工作階段
- **自動 Resume** — 伺服器啟動時自動還原先前的 Claude 工作階段
- **快速提示** — 註冊常用提示,一鍵送出
- **附件** — 在聊天輸入中拖放圖片,或附加檔案以自動插入路徑。行動裝置同樣可用
- **訊息紀錄** — 重複使用先前的訊息
- **使用量統計** — Claude + Codex Token、成本、依專案分析、每日 AI 報告
- **速率限制** — 支援的提供方的 5 小時 / 7 天剩餘額度,重置倒數
### 行動裝置 & 易用性
- **響應式 UI** — 在手機 / 平板上使用終端機與時間軸
- **PWA** — 加入主畫面,體驗接近原生應用
- **Web Push** — 關閉分頁仍可接收通知
- **多裝置同步** — 工作區變更即時同步
- **Tailscale** — 透過 WireGuard 加密隧道從外部進行 HTTPS 連線
- **密碼驗證** — scrypt 雜湊,對外暴露也安全
- **多語系支援** — 한국어、English、日本語、中文 等 11 種語言
## 支援的平台
| 平台 | 狀態 | 備註 |
|---|---|---|
| macOS (Apple Silicon / Intel) | ✅ | 內含 Electron 應用程式 |
| Linux | ✅ | 不含 Electron |
| Windows | ❌ | 不支援 |
## 安裝細節
### 前置需求
- macOS 13+ 或 Linux
- [Node.js](https://nodejs.org/) 20+
- [tmux](https://github.com/tmux/tmux)
Claude 分頁需要。安裝 Claude Code,並在啟動 Claude 分頁前登入:
```bash
curl -fsSL https://claude.ai/install.sh | bash
# 或使用 Homebrew latest 頻道
brew install --cask claude-code@latest
```
Codex 分頁為選用。安裝 Codex CLI,並在啟動 Codex 分頁前登入:
```bash
npm i -g @openai/codex
# 或
brew install --cask codex
```
### npx (最快速)
```bash
npx purplemux@latest
```
### 全域安裝
```bash
npm install -g purplemux
purplemux
```
### CLI 範例
```bash
purplemux tab create -w WS -t codex-cli -n "fix auth"
purplemux tab create -w WS -t agent-sessions
```
### 從原始碼執行
```bash
git clone https://github.com/subicura/purplemux.git
cd purplemux
pnpm install
pnpm start
```
開發模式:
```bash
pnpm dev
```
#### 記錄層級設定
整體層級以 `LOG_LEVEL` (預設 `info`) 調整。
```bash
LOG_LEVEL=debug pnpm dev
```
若只想開啟特定模組,將 `模組=層級` 組合以逗號分隔寫入 `LOG_LEVELS`。可用層級: `trace` / `debug` / `info` / `warn` / `error` / `fatal`。
```bash
# 只以 debug 追蹤 Claude Code hook 行為
LOG_LEVELS=hooks=debug pnpm dev
# 同時指定多個模組
LOG_LEVELS=hooks=debug,status=warn pnpm dev
```
未在 `LOG_LEVELS` 中指定的模組,會沿用 `LOG_LEVEL`。
## 外部連線 (Tailscale Serve)
```bash
tailscale serve --bg 8022
```
透過 `https://..ts.net` 連線。停用:
```bash
tailscale serve --bg off 8022
```
## 安全性
### 密碼
首次連線時設定密碼。使用 scrypt 雜湊後儲存於 `~/.purplemux/config.json`。
如需重置,請刪除 `~/.purplemux/config.json` 並重新啟動,引導畫面會再次出現。
### HTTPS
預設使用 HTTP。對外暴露時請務必套用 HTTPS:
- **Tailscale Serve** — WireGuard 加密 + 自動憑證
- **Nginx / Caddy** — 必須轉送 WebSocket 升級標頭 (`Upgrade`, `Connection`)
### 資料目錄 (`~/.purplemux/`)
| 檔案 | 說明 |
|---|---|
| `config.json` | 驗證資訊 (雜湊) 與應用設定 |
| `workspaces.json` | 工作區配置、分頁、目錄 |
| `vapid-keys.json` | Web Push VAPID 金鑰 (自動產生) |
| `push-subscriptions.json` | 推播訂閱資訊 |
| `hooks/` | 使用者自訂 hook |
## 架構
```
┌─────────────────────────────────────────────────────────────┐
│ Browser │
│ ┌───────────┐ ┌───────────┐ ┌──────────┐ ┌─────────────┐ │
│ │ xterm.js │ │ Timeline │ │ Status │ │ Multi-device│ │
│ │ Terminal │ │ │ │ │ │ Sync │ │
│ └─────┬─────┘ └─────┬─────┘ └────┬─────┘ └──────┬──────┘ │
└────────┼─────────────┼────────────┼──────────────┼──────────┘
│ws │ws │ws │ws
│/terminal │/timeline │/status │/sync
▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ Node.js Server (:8022) │
│ ┌──────────┐ ┌───────────────┐ ┌─────────────────────┐ │
│ │ node-pty │ │ JSONL Watcher │ │ Status Manager │ │
│ │ PTY↔WS │ │ File watch → │ │ Process tree + │ │
│ │ Binary │ │ Parse → Send │ │ JSONL tail analysis │ │
│ └────┬─────┘ └───────┬───────┘ └──────────┬──────────┘ │
└───────┼────────────────┼─────────────────────┼──────────────┘
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ System │
│ tmux (purple socket) Agent CLIs │
│ ┌────────┐ ┌────────┐ ┌────────────────────────────┐ │
│ │Session1│ │Session2│ ... │ Claude Code │ │
│ │ (shell)│ │ (shell)│ │ ~/.claude/projects/*.jsonl │ │
│ └────────┘ └────────┘ │ Codex │ │
│ │ ~/.codex/sessions/*.jsonl │ │
│ └────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
**終端機 I/O** — xterm.js 透過 WebSocket 連線至 node-pty,node-pty 再接上 tmux 工作階段。使用二進位協定處理 stdin / stdout / resize 並控制背壓。
**狀態偵測** — 代理事件 hook 透過 HTTP POST 立即推送更新。Claude Code 使用 `SessionStart`、`Stop`、`Notification`;Codex 使用 `SessionStart`、`UserPromptSubmit`、`PreToolUse`、`PostToolUse`、`Stop`、`PermissionRequest`。每 5–15 秒輪詢一次行程樹,並分析 JSONL 檔案末尾 8KB。
**時間軸** — 監聽 `~/.claude/projects/` 與 `~/.codex/sessions/` 下的 JSONL 工作階段記錄,檔案變動時解析新行並將結構化項目串流至瀏覽器。
**tmux 隔離** — 使用專屬的 `purple` socket,與現有 tmux 完全隔離。無前置鍵,無狀態列。
**自動還原** — 伺服器啟動時以 `claude --resume {sessionId}` 還原先前的 Claude 工作階段。Codex 工作階段可從工作階段列表恢復,也可使用 `codex resume {sessionId}`。
## License
[MIT](LICENSE)