自托管 · tmux web 客户端

它跑完了,
而你不在电脑前。

Claude Code 想一轮要几分钟。tmux-next 把那几分钟还给你—— 在手机上看到每个会话的最后几行输出,谁在等你回复一眼就知道, 点进去接着聊。


它解决什么

终端是唯一没跟着你走的东西

邮件、日历、聊天早就在手机上了。可你让 Claude Code 跑一个重构,它要五分钟—— 这五分钟你只能守着电脑,不是因为有事做,是因为你不知道它什么时候需要你

tmux 本来就是解药:进程留在机器上,随时能连回去。缺的只是一个能装进口袋的客户端。 tmux-next 就是这个客户端——手机上列出所有会话、看到谁在等你、点进去接着聊。

快速开始

装上就能用,没有构建步骤

$ bunx tmux-next # 需要 tmux 3.2+ 和 Bun。不支持 node——入口是未编译的 TypeScript。

跑起来后打开 http://127.0.0.1:7682/本机所有 tmux 会话就列在那儿—— 每个带最后几行输出,等你回复的排最前。

点一个会话进到终端。软键盘没有的键(Esc / Ctrl / 方向键…)做成了工具条, 拖动能滚全屏程序的历史。

想从手机连?在前面架一个反向代理做 TLS 和认证—— 因为这个服务没有内置认证,见下方。

这个服务没有任何内置认证,默认只绑 loopback,假设前面有反向代理负责 TLS 和身份验证。 直接暴露到网络等于把一个免密 shell 交给任何能连上端口的人。反代还得单独处理 WebSocket—— 浏览器发起 WS 握手时不带 Basic Auth 头。完整配置见 SECURITY.mddeploy.md
想改代码,或看完整前置条件
tmux 3.2+
每次 resize 走 refresh-client -C 列,行,逗号写法是 3.2 引入的;更早的版本启动时会被拒绝。
Bun 1.0+
直接跑 TypeScript,入口没有编译产物——所以不支持 node。
macOS / Linux
依赖 tmux 与 POSIX shell。
$ git clone https://github.com/niletry/tmux-next.git $ cd tmux-next && bun install && bun run src/index.ts

长什么样

两个界面,就这些

会话列表:三个会话,每个显示最后几行输出;等待回复的带绿点,未发送的输入单独一行。

绿点是「在等你回复」。Claude Code 打完一轮会输出 ✻ Cogitated for …, 列表据此把等你的会话排到最前面——不用一个个点进去看。

能做什么

三件事

看到状态,不用点开

每个会话显示最后几行输出、还没发出去的输入、最后活跃时间。等你回复的排在最前。

从手机开新会话

点选目录一路往下钻,可以起名,也可以选择让 Claude 跳过权限确认直接跑。

断了就重建

锁屏、进地铁、换 Wi-Fi。不缓冲也不重放——重连时从 tmux 重新抓一次完整画面。

怎么做到的

用 control mode,不是起一个 PTY

tmux 有一个讲结构化协议的模式。用它,输出就是按 pane 分发的, 于是浏览器里看到的是程序本身的画面——没有 tmux 的分屏边框,没有状态栏。

浏览器 xterm.js │ WebSocket ▼ Bun 服务 127.0.0.1 │ tmux -C attach (control mode)tmux server ──┬── 你的会话 PROJ-1042 └── 你的会话 billing-ci 每个浏览器连接建一个 web-<uuid> grouped session 当作可销毁的挂载点,断开即销毁。

尺寸是共享的

window 尺寸是 window 的属性,同一个 window 无法对两个客户端渲染成两种宽度。 这是 tmux 的事实,不是缺陷。断开时调 resize-window -A 把尺寸还给剩下的客户端。

一条规则覆盖两种屏幕

先算「让 80 列铺满需要多大字号」,没超上限就用它——手机因此永远是 80 列。 超过上限(约 576px 宽)字号钉死,多余宽度换成列数。没有设备嗅探,切换点是算出来的。

拖动滚的是程序

tmux 原地重绘屏幕,从不让行滚出顶部,所以 xterm 的滚动缓冲永远是空的。 手势被翻译成合成的 WheelEvent,由 xterm 按程序协商好的鼠标协议编码; 程序不理会鼠标时一个字节都不会发出去,而这个「零输出」正好被当作信号,退化成 PgUp/PgDn。

命令是常量

启动命令会经过 sh -c,所以任何来自请求的东西都不允许拼进去。 目录作为独立 argv 传递,「跳过权限确认」是在两个固定字符串之间二选一,而不是拼接。

规模

小到可以整个读完

214个测试,大多真的起 tmux
0个前端框架
0个构建步骤
~4k行 TypeScript / JS