kabby:讓 Claude Code 脫離終端視窗的 PTY 多工器
把 cc 的進程生命週期與 client 連線解耦,attach 的入口從終端變成一個網址。
前言
用 Claude Code 久了會遇到一個結構性的限制:cc 跑在哪個終端視窗,它的命就綁在那個視窗上。視窗關了、SSH 斷了,跑到一半的 session 就沒了;換一台裝置想接手,只能重開一個新的 cc,前面累積的脈絡全部重來。
kabby 是為了解決這件事寫的開源工具(MIT)。它把 cc 的進程跟 client 的連線拆開,讓同一個 cc 可以被多個視窗同時看見。

一、問題:終端視窗是個太脆弱的容器
實際工作流往往是這樣的:先在桌面終端開 cc 進入專案,跑了一陣子,人離開座位,想在手機或另一台機器上接續。傳統做法有兩條路,但都不理想。
一是用 tmux。tmux 確實解決了「進程活著」的問題,但 attach 的入口仍然是一個終端——手機上沒有、嵌在網頁裡也沒有。
二是把終端嵌進網頁(iframe)。這類方案通常是「點一下按鈕開一個新的 cc」,每次進來都是空白的新對話,沒有「接續」的概念。
兩者缺的是同一件事:一個與終端無關、可以隨處打開的 attach 入口。
二、解法:PTY 留在 daemon 裡
kabby 的做法是把 PTY 從 client 手上收回來,交給一個常駐的 daemon 管。
client(桌面 App / 瀏覽器 / iframe / 手機)
│ WebSocket ws://host:3700/ws/<session>
▼
daemon.js ── HTTP API + WS upgrade + fan-out
│
Session ── node-pty(一個 cc 進程)+ ring buffer(scrollback)
每個 session 是一個 node-pty 開出來的 cc 進程,外加一個 100KB 的 ring buffer 存 scrollback。client 用 WebSocket 接上來時,daemon 先把 ring buffer 裡的歷史輸出 replay 一次,再把後續輸出即時 fan-out 給所有連著的 client。
結果就是:桌面 App、瀏覽器分頁、手機、嵌在別的系統裡的 iframe,看到的是同一個畫面、同一份捲動歷史。關掉任何一個視窗,cc 照樣在跑。行為等同 tmux attach,只是 attach 的入口從終端變成了一個網址。
UI 這層再往上疊:把常用專案存成「項目」卡片,一鍵開新對話或接續上次(直接把 cc 自己的歷史 session 接回來);多 tab、pane 可上下左右分割,每個 pane 是獨立 session;Claude Code 與 Codex 都能開。
三、共享終端房間
既然 attach 入口是網址,把它分享出去就是很自然的下一步。
在主頁開一個房間、綁定一個運行中的 session、設一組入房 key,對方打開 room.html 輸入 key 就能進來,即時看到那個 session 的畫面(含 scrollback replay),旁邊附帶文字聊天、貼圖與 @mention。
權限的設計是保守的:房間預設唯讀,而且唯讀是在伺服器端強制的,不是前端把輸入框藏起來而已。訪客的 key 只換得該房綁定 session 的 WebSocket 與聊天通道,打不到其他 API。
需要協作時,房主可以即時打開「可輸入」開關——但這件事要想清楚:開了就等於讓對方在你的機器上用你的權限執行任意指令,只給信任的人。
四、遠端接入
daemon 預設綁 127.0.0.1,只有本機看得到。要從外面連回來,有兩條路。
簡單的做法是 HOST=0.0.0.0 搭配 AUTH_TOKEN,同網段的手機直接連內網 IP。但這只適用於可信網段。
建議的做法是 daemon 維持綁 127.0.0.1,由 Cloudflare Tunnel 對外暴露成 https://kabby.你的網域——對外走 443、TLS 自動處理、防火牆不用開任何 inbound port。再搭配 systemd 把 daemon 設成 service,達成開機自啟、崩潰重啟、不隨 SSH 斷線而停。
組合起來,就是一台永遠在線的 cc 主機:機器在家裡或雲端跑著,你在任何地方用手機瀏覽器打開網址,就接回那個正在跑的 session。
另外 kabby 提供一個精簡版終端頁 embed.html,可以直接用 iframe 掛進自己的工單或任務系統,讓終端出現在業務流程該出現的地方。
五、用量與成本分析
cc 每一輪的 token 與成本資訊都寫在本機的歷史 jsonl 裡,只是沒人去看。kabby 用一個背景 watcher 持續掃這些檔案建索引,做成一個唯讀的監控面板。
面板頂端是總計:session 數、輪數、input/output token、cache 建立與讀取、成本估算。下面逐 session 列出 model、輪數、token、成本與最後活動時間,可以展開看逐輪明細——找「哪一輪 context 突然爆掉」特別有用。Claude Code 與 Codex 分開統計。
同一套採集流程還兼做敏感詞:送出的輸入會在伺服器端比對詞庫,命中就直接擋下、不進 PTY,並在監控頁留下命中記錄。詞庫可自訂,改完可以重掃一次套用到既有對話。
索引與定價都是本地計算,對話內容不會送去任何地方。
結語
kabby 刻意做得很薄:Node.js 加四個依賴(express / ws / node-pty / cors),沒有資料庫,session 在記憶體、設定在 ~/.kabby/。三行指令就能跑起來。
git clone https://github.com/jokerjkeeper/kabby.git
cd kabby && npm install && npm start
# → http://localhost:3700
如果你也遇過「關掉視窗 cc 就沒了」的問題,或想把跑到一半的 session 分享給同事看,歡迎試試:github.com/jokerjkeeper/kabby(MIT 授權,歡迎 issue 與 PR)。