nodeterm
eneskirca/nodeterm加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。

终端管理器的形态几乎三十年没变过:标签页。Windows Terminal、iTerm2、tmux 本身、VS Code 的终端面板——都是一列横向排列的标签。标签页的隐含假设是你一次只关注一件事,其余的靠记忆管理。
这个假设在 AI 编码智能体时代崩了。你同时开着三个 Claude Code 会话:一个在改后端、一个在写测试、一个卡在权限提示上等你点确认。标签页无法告诉你哪个在跑、哪个在等你、哪个已经死了。你只能来回切、切到一半发现自己在看的是昨天那个会话。
nodeterm 的答案是把终端从标签页换成画布。作者 Enes Kirca 的说明很直接——目标用户是有 ADHD、 workflows 零散的人,空间布局比堆叠式标签更适合他们。BUSL-1.1,2,311 星、268 fork、45 位贡献者,2026 年 6 月立项。
这是整个产品最核心的设计。每个项目既是无限画布,也是看板:
⌘⇧B 切换。换句话说,画布回答「东西在哪」,看板回答「事到哪一步了」,而它们是同一份数据的两种投影,不是两个要同步的工具。
多数工具判断「智能体在不在忙」靠正则扫终端输出——这在 Claude Code 那种流式 UI 输出上非常脆。nodeterm 用hook 驱动:
RUNNING / NEEDS YOU 徽章作者还支持了 Claude、Codex、Antigravity、Gemini、GitHub Copilot、opencode、Grok、Cursor 以及自定义智能体,通过一个注册表 + 能力列表(AGENT_HOOK_TARGETS、RESUMABLE_AGENTS、SUBAGENT_CAPABLE、BRANCH_CAPABLE、CONTEXT_LINK_CAPABLE 等)来描述各智能体支持什么,而不是一堆布尔开关。
每个终端跑在自己的 tmux 会话里。退出应用、甚至重启机器,会话都还在——机器重启后还能恢复 scrollback 并 claude --resume 续上智能体会话。
macOS 版自带编译好的 tmux,所以什么都不用装;系统里已有 tmux 则优先用系统的。README 提到一个细节:升级前打开的终端会保持原状,直到你刷新该节点。
两个智能体节点之间画一条边,任一方就能按需读取对方的 transcript。Claude 专属还支持从一个会话分支出新节点,以及多账号并行(几个已登录的 Claude 身份并排跑)。
更激进的是智能体可以反过来操作画布——内置的 canvas-control CLI 让智能体能开节点、组队、互相验证产出。这已经不是「在终端里跑智能体」,而是「智能体住在画布里」。
| 形态 | 说明 |
|---|---|
| 桌面应用 | macOS(arm64+x64)、Linux x64、Windows x64(beta) |
| Server Edition | 无头跑在 Linux/macOS,浏览器访问,同一套渲染器 |
| 移动端 | iOS / Android App,扫码配对,手机上接管同一批会话 |
手机端不是远程桌面——它E2E 加密接入同一批实时 tmux 会话,可以看智能体干活、批准权限提示、往任意终端打字,还有推送通知。
这部分是整个项目工程上最值得学的地方。README 的架构说明只有五条,但每条都切在正确的位置:
src/main(Electron 壳)、src/preload(唯一桥接 window.nodeTerminal)、src/renderer(React UI);src/shared 放三边共用的类型与 IPC 频道名。CorePlatform 缝——所有服务(PTY、工作区/设置、git、智能体、hooks)都住在 src/core,从不 import electron。Electron 是这个缝的一种实现,浏览器 Server Edition(src/server)是另一种,通过 WebSocket-RPC 桥启动完全相同的服务(浏览器端 src/renderer/bridge 填充 window.nodeTerminal)。一套代码,一个渲染器,多种壳。TerminalTransport 抽象——渲染器只依赖这个接口,从不直接碰 IPC 或 node-pty。LocalTransport 走本地,RemoteTransport 通过 SSH 走远程。所以远程项目能直接拖进画布,画布 UI 一行不用改。仓库规模印证了这一点:src/renderer 1,451 文件、src/core 941、src/shared 508、src/main 326、src/server 61、src/session-host 54,加上 1,740 个测试文件(.test.ts / .test.tsx)。
无头跑在同一台 Linux 上,npm run server:dev 起来访问 http://127.0.0.1:8443。终端、文件/编辑器/diff、完整 git 面板、看板、智能体状态徽章都能用。
认证是单用户密码 + secure cookie,首次启动打印一次性 setup URL(token 只在内存里,不落盘,进程重启就重新生成)。容器场景可以用 NODETERM_SERVER_PASSWORD 环境变量预置密码。
它还能当纯通知主机用——装在你 SSH 进去的任何 Linux 机器上,手机就能收到那台机器上智能体的 RUNNING / NEEDS YOU 推送,零开放端口(hook 服务只监听回环,推送走 HTTPS):
curl -fsSL https://raw.githubusercontent.com/eneskirca/nodeterm/main/scripts/install-server.sh | bash
一行装好、构建好、并注册成 systemd 服务(NODETERM_HEADLESS=1)。
官方 Dockerfile 是三阶段构建(build / deps / runtime),runtime 用 node:22-bookworm-slim,装 tmux、git、curl,暴露 8443,/login 做健康检查。文件里有段注释写得很实在——node-pty 的 ABI 陷阱:仓库的 postinstall 会把 node-pty 编译成 Electron 的 ABI,而服务器跑在普通 node 下,所以容器里必须 --ignore-scripts 并显式 npm rebuild node-pty,且 deps 与 runtime 阶段必须用同一个 Node 大版本。
按住 ⌘⌥ 说话,松开即可。本地 Whisper(smart-whisper 内嵌 whisper.cpp)转写后打进终端提示符,由你按回车——不自动提交。语音不出本机。
BUSL-1.1 不是一个宽松许可证。 明确禁止两件事:一是不得以与 nodeterm 或其授权方产品竞争的方式托管/嵌入/作为独立产品服务提供(Additional Use Grant 的竞争条款);二是不得在生产中使用移除、禁用或绕过 license key / entitlement / usage-limit 检查的副本(为开发、测试、贡献而改这部分代码是允许的)。每个版本发布满四年后自动转为 MIT。这个协议适合自用和内部部署,但不适合做二次分发的 SaaS——如果打算把 nodeterm 画布包成产品对外提供,这是硬约束。
Windows 只是 beta,且安装包未签名。 SmartScreen 会弹窗,要手动「更多信息 → 仍要运行」;更新是手动的(AppImage 则是自更新)。更要命的是会话连续性在 Windows 上还没落地——Windows 没有 tmux,替代它的独立 session host 还在打包中(PR #579)。画布、智能体、看板、hooks 都是同一个应用,但这块是空的。
版本号下限卡得很死,而且原因是工具链不是产品。 macOS 最低 12 Monterey:Electron 42 只发 Monterey 及以上的二进制,Big Sur 上 .dmg 起不来;esbuild 二进制用 Go 1.25 编译,Go 1.25 砍掉了 macOS 11,Big Sur 上 npm install 会死在 esbuild 的 postinstall,报 dyld: Symbol not found: _SecTrustCopyCertificateChain。老 Mac 的出路是:在 Linux 上跑 Server Edition,用浏览器访问。
Linux 打包有真实的坑。 Fedora / GCC 14 及以上必须 export CFLAGS=-D_GNU_SOURCE,否则 smart-whisper 的 whisper.cpp 用的 GNU 专属 CPU 亲和性调用会从警告变成错误,npm install 直接失败。打 .rpm 还要装 rpm-build 和 libxcrypt-compat(electron-builder 自带的 fpm 跑的是链接 libcrypt.so.1 的 Ruby),否则 .deb 和 .rpm 双双失败。AppImage 需要 FUSE 2,Fedora 默认没有,得 sudo dnf install fuse-libs。
容器里重启会杀掉所有 tmux 会话。 Dockerfile 注释明确写了:tmux server 本身跑在容器内,所以容器重启/重新部署会杀掉全部会话(桌面版只有机器重启才会)。冷启动路径会回放 scrollback 并从 /data 恢复可恢复的智能体。
容器不能直接暴露到公网。 Dockerfile 头部明确警告:TLS 由前置反代(Dokploy/Traefik/nginx/Caddy)终止,容器内跑明文 HTTP,所以 CMD 带 --insecure-http(服务器拒绝在非回环地址上无此标志启动);它靠 X-Forwarded-Proto 自行设置 Secure cookie 标记。不要把容器端口直接发布到公网接口。
Server Edition 官方定位是「Phase 2:仅终端」。 docs/SERVER.md 开门见山写了 scope,并列出限制。这说明浏览器形态还在补齐中。
商业模式依赖赞助。 作者自陈每月约 2,000 美元成本,用 Claude 跨多个 Claude 账号搭建;有 10 个 200 美元/月的创始赞助位,目前只占 1 个。项目健康度与个人订阅强相关。
大文件说明文档。 CLAUDE.md 1,037KB、CONTRIBUTING.md 142KB——这是给 AI 协作代理读的深度参考,不是给人读的。想上手的人别从头读。
2026 年 AI 编码工具的竞争已经从「谁的模型更强」转向「谁能管理好多个并行的智能体」。这个方向上已有 tmuxinator、Zellij、Wave Terminal、Conductor、multiple-cursor 类工具,但大多停留在终端复用或简单的会话列表。
nodeterm 的差异化有三层:
一,它把「智能体需要你」当成一等公民。 多数工具的 UI 是「进程列表」;nodeterm 的 UI 是「谁在跑、谁卡住了、谁完成了」。这个区别在并行场景下是决定性的——你不可能每秒刷新一遍终端输出去找那个 Do you want to proceed?。
二,画布与看板共用同一份活会话。 这不是两个视图的同步问题,而是同一个对象的两种投影。Trello 的卡片是虚拟的、跟实际工作脱节;nodeterm 的卡片背后就是那个还在跑的 claude 进程。Kanban 与执行的耦合,是这个项目最聪明的一处设计。
三,服务层缝 + 多壳。 CorePlatform 和 TerminalTransport 两个抽象让它用一份 React 渲染器跑出了桌面应用、浏览器服务端和移动端。这种「核心一次实现、壳可插拔」的结构,是团队从桌面走向多端时最省事的路径。
对做内部研发工具的团队,它的价值不只是「好用」,而是那份 CorePlatform 的分层思路——把平台相关的东西(PTY、文件、git、hooks)全部挡在一个小接口后面,业务逻辑一行都不改。这是可以直接抄的架构。
npm run server:dev,浏览器打开。如果只是想「多个智能体同时跑」,这比装桌面应用更快brew install --cask nodeterm,自带 tmux 不需另装sudo dnf install fuse-libs;Fedora 源码构建务必先 export CFLAGS=-D_GNU_SOURCE/data 要挂卷,否则每次重启密码和画布都没了BUSL-1.1(四年后转 MIT),TypeScript + Electron + React,1,740 个测试文件。一款为「同时盯多个智能体」这个具体问题做得相当彻底的桌面工具。