# purplemux
**Claude Code と Codex、複数のタスクを同時に。もっと速く。**
1 つの画面ですべてのセッションを、スマホでも途切れることなく。
日本語 | 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、コンフリクト) はワンクリックで Claude または Codex に質問
- **Web ブラウザペイン** — ターミナル隣の組み込みブラウザで開発結果を確認 (Electron)。`purplemux` CLI から操作でき、内蔵のデバイスエミュレータでビューポートを切り替え
- **エージェントタブ** — 新規タブメニューから Claude、Codex、または統合セッション一覧を開始
### Claude Code と Codex 連携
- **リアルタイムステータス** — 作業中 / 入力待ちインジケーター、セッション間の切り替え
- **ライブセッションビュー** — メッセージ、ツール呼び出し、タスク、権限リクエスト、thinking ブロック
- **Codex タブ** — Claude と同じ tmux ベースの永続性で Codex CLI セッションを起動
- **セッション一覧** — 最近の Claude と Codex セッションを 1 つの統合ビューで参照・再開
- **ワンクリック Resume** — 中断した Claude または Codex セッションをブラウザからそのまま再開
- **自動 Resume** — サーバー起動時に以前の Claude セッションを自動復元
- **クイックプロンプト** — よく使うプロンプトを登録してワンクリック送信
- **添付** — チャット入力に画像をドロップ、またはファイル添付でパスを自動挿入。モバイルでも動作
- **メッセージ履歴** — 過去のメッセージを再利用
- **使用量分析** — Claude + Codex のトークン、コスト、プロジェクト別分析、日次 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
# Claude Code フックの動作だけ debug で追跡
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/` | ユーザー定義フック |
## アーキテクチャ
```
┌─────────────────────────────────────────────────────────────┐
│ 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 を処理し、バックプレッシャーを制御します。
**ステータス検出** — エージェントイベントフックが 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` ソケットを使用し、既存の tmux と完全に分離されています。prefix キーなし、ステータスバーなし。
**自動復旧** — サーバー起動時に `claude --resume {sessionId}` で以前の Claude セッションを復元します。Codex セッションはセッション一覧または `codex resume {sessionId}` で再開できます。
## License
[MIT](LICENSE)