tmux の Web UI。ブラウザ(特にスマホ)から tmux ペインの閲覧・操作ができる。
Tailscale 等の VPN 経由で iPhone から自宅の tmux セッションを操作する用途を想定。
- tmux セッション/ウィンドウ/ペインをツリー構造で一覧表示
- 各ペインのターミナル内容をプレビュー表示
- xterm.js によるリアルタイムターミナルレンダリング(ANSI カラー対応)
- WebSocket による 100ms ポーリングでリアルタイム更新
- スマホ向けの特殊キー・Ctrl キーツールバー
- QR コード表示でスマホから簡単接続
- トークンベースの認証
- Bun v1.0+
- tmux が起動中であること
npm install -g shoji-terminaltmux セッションが動いているマシンで:
shoji起動すると QR コードが表示される。スマホでスキャンしてブラウザでアクセス。
-p, --port <number> ポート番号 (デフォルト: 3274)
--host <address> バインドアドレス (デフォルト: 0.0.0.0)
# 依存関係インストール
bun install
# 開発サーバー起動(サーバー + クライアント HMR)
bun run dev
# ビルド
bun run buildsrc/
├── server/ # Bun + Hono サーバー
│ ├── index.ts # エントリーポイント(Bun.serve + QR コード表示)
│ ├── app.ts # Hono アプリ(REST API + 静的ファイル配信)
│ ├── auth/ # トークン認証
│ ├── routes/ # API ルート(/api/sessions, /api/panes/:id/preview)
│ ├── tmux/ # tmux コマンドラッパー(capture-pane, send-keys 等)
│ └── ws/ # WebSocket ハンドラ + PaneStreamManager
├── client/ # React 19 SPA
│ ├── components/ # PaneList, TerminalView, SpecialKeys
│ ├── hooks/ # useAuth, useWebSocket, usePaneStream
│ └── pages/ # HomePage, PanePage
└── shared/ # クライアント・サーバー共有の型定義
└── protocol.ts # WebSocket メッセージ型
- サーバー: Bun, Hono, WebSocket
- クライアント: React 19, xterm.js, Tailwind CSS v4, react-router v7
- ビルド: Vite
MIT