开源项目 GitHub Trending Weekly 2026-08-23T00:00 正文 ok 1862 words

nodeterm:面向 AI 编程 Agent 的无限画布节点式终端管理器

英文标题:🔥 eneskirca/nodeterm

nodeterm 是一款节点式终端管理器,将真实终端、Claude Code 等 AI Agent、便签、编辑器和差异视图放置在可无限平移和缩放的画布上。它以 tmux 为基础实现会话持久化,可在应用重启乃至机器重启后恢复终端滚动记录和 Agent 会话,并提供 Kanban 看板、SSH 远程项目、iOS 配套应用及浏览器 Server Edition。该项目支持 Claude Code、Codex、Gemini、GitHub Copilot、opencode、Grok 等 Agent,并通过 Hook 提供“运行中/需要你处理”等实时状态。对开发者而言,nodeterm 试图用空间化工作流替代堆叠终端标签页,同时将本地、远程服务器和移动端的 AI 编程会话统一到同一套界面与架构中。
打开原文相关 6 · 机会 4
media31.6 KB media1.4 KB media4.7 KB media1.3 KB media1.4 KB media1.3 KB media1.3 KB media2.7 MB media1.2 MB media1.2 MB media984.3 KB media1.3 MB media836.4 KB media133.1 KB

中文

nodeterm

一款节点式终端管理器——让你的终端和 Agent 置于无限画布之上。

多个真实终端以可拖拽节点的形式存在于同一张可平移、缩放的画布上;每个项目同时也是一个由实时 Claude Code 会话构成的 Trello 风格看板。它为有 ADHD 和工作流分散的人而设计:以空间布局取代一叠隐藏的标签页。

平台 使用 Electron 构建 许可证 GitHub stars 最新版本

下载量


堆叠的终端标签页会隐藏上下文——你会失去对哪个任务正在何处运行的把握。nodeterm 将其转化为一张 地图:每个 shell 都是一个节点,你可以放置、分组、标注并缩放查看。会话具备空间性和持久性,因此即使重启,心智模型也不会被打断。应用围绕清晰的服务边界构建,同一张画布可以三种方式运行——作为 macOS 和 Linux 桌面应用、可从任意地点访问的 自托管浏览器应用(Server Edition),以及接入同一批实时会话的 iOS 配套应用。

📚 完整文档位于 nodeterm.dev/docs——包括快速入门、概念、Agent、远程访问和故障排查。

右键点击画布即可打开一个 终端,或一个 AI Agent。每个实例均运行在独立且持久的 tmux 会话中;旁边还可放置 便签(链接后可向 Agent 提供上下文)、Monaco 编辑器、差异视图以及 网页/视频 节点,并像地图一样进行空间化排布。退出应用,甚至 重启机器,所有会话都会恢复。 画布——终端、Agent、便签、编辑器和差异视图均以节点呈现;完整重启后会话仍可存续

知道 Agent 何时需要你

由 Hook 驱动的状态机制——无需抓取输出:闪烁的 RUNNING / NEEDS YOU 徽章、带实时转录内容的 子 Agent 卡片、每节点的 上下文计量器 以及操作系统通知。点击提醒,可直接在节点内回答权限提示,并会在该轮任务 完成 时立即收到通知。在 MacBook 上,Agent 还会显示在 刘海区域。 | Agent 状态——NEEDS YOU 状态切换、通知、回答权限提示及子 Agent 扇出
每个项目都是一张画布——也是一个 Kanban 看板。卡片 就是 你的实时会话:当 Agent 继续运行时,可将卡片拖到不同列;可将卡片打开为 实时卡片弹窗(真实会话、成员、截止日期、优先级和评论),还可分配给团队成员。使用 ⌘⇧B 切换。
视频/嵌入内容:观看带声音的看板视频 | Kanban 看板——实时会话卡片、跨列拖拽,以及包含实时 Claude Code 会话的卡片弹窗
使用一个二维码即可 配对手机——用 nodeterm iOS 应用扫描——同一个实时会话会延续到你的口袋中,并通过中继实现端到端加密,而不仅限于局域网。同一张画布还可作为自托管应用在任意浏览器中运行(Server Edition)。 | 配对手机——扫描二维码后,同一个实时会话会延续到 iPhone 上
按住 ⌘⌥ 后说话即可。设备端 Whisper 会在本地转录——先检查文本,再点击 发送(不会自动提交)。你的语音不会离开本机。 | 语音输入——按住 cmd-shift-D,说话、检查并发送至终端

🖥 终端(xterm + tmux,AI 命名)· 🤖 Agent(Claude Code / Codex / Gemini / GitHub Copilot / opencode / Grok / 自定义)· 📝 便签(可链接给 Agent 作为上下文)· 🗂 分组(绑定到 git worktree,实现每分支一个 Agent)· ✏️ 编辑器(Monaco,⌘S)· 🔀 差异 · 🌐 网页 / 视频

  • 会话连续性(tmux)——终端可在节点重新挂载 以及 完整应用重启后持续运行,包括实时进程;机器重启后会恢复滚动记录并继续 Agent 会话(claude --resume)。macOS 应用 内置自己的 tmux,因此无需预先安装任何组件;若系统中已安装 tmux,将始终优先使用系统版本。升级前打开的终端会保持原样,直至你刷新该节点。
  • 与终端对话——设备端 Whisper 听写(按住 ⌘⌥):说话、检查、发送。
  • Agent 超能力——通过 上下文链接,Agent 节点可按需读取彼此的转录记录;仅限 Claude 的 分支对话 和 托管账户 功能支持多个已登录 Claude 身份并排使用;Agent 可通过内置画布控制 CLI 操作画布(打开节点、创建团队、相互验证工作)。
  • 远程 / SSH 项目——通过 SSH 在远程主机上打开项目;终端、文件、git 乃至看板均在远程运行,而画布保持在本地。
  • 源代码控制——支持类似 VS Code 的暂存/取消暂存、丢弃更改、切换/创建分支、提交、推送/同步/发布、worktree 以及 gh 登录,由系统 git 提供支持。
  • Kanban 中的 GitHub Issues——可选择启用 Issue 卡片、标签到列的精确映射、全部 / GitHub / 会话筛选,以及双向移动、关闭和重新打开同步。参见设置与安全细节。
  • AI 提交信息与终端名称——使用你自带的本地 Agent CLI,以只读方式处理已暂存差异或捕获的输出。
  • 口袋中的会话——nodeterm mobile(iOS)接入同一批实时 tmux 会话:可查看 Agent 工作、响应“需要你处理”的请求,或从手机向任意终端输入;还支持推送通知和移动端看板视图。
  • 电源与休眠——当 Agent 工作时,nodeterm 会阻止机器因空闲进入睡眠;任务完成后会立即解除阻止(默认启用;可在设置引导或“设置 → 行为”中切换)。没有应用可以在合上笔记本盖子时让机器保持唤醒——如需整夜运行,请保持笔记本打开并接通电源,或通过 Server Edition 在不会休眠的服务器上运行 Agent。
  • 命令面板(⌘K)、文件资源管理器(⌘⇧E)、Markdown 视图(⌘M)、撤销/重做,以及原生 macOS 深色界面。
  • 自动更新与应用内公告——应用会检查自托管更新源,并显示“重启以更新”横幅和产品新闻。

🌍 Server Edition——浏览器中的 nodeterm

同一张画布可在 Linux(或 macOS)主机上以无头模式运行,并通过任意浏览器使用——因此你的终端、编辑器、源代码控制、看板和 Agent 都位于一台可从任何地点访问的服务器上。它提供单用户认证(密码 + 安全 Cookie)、WebSocket 桥接,以及与桌面应用完全相同的渲染器。

npm run server:dev     # build + serve; open http://127.0.0.1:8443 and set a password

终端、文件/编辑器/差异视图、完整 git 面板、Kanban 看板和 Agent 状态徽章目前均可在浏览器中使用。参见 docs/SERVER.md,了解快速入门、安全模型和当前限制。

🔔 从任意 SSH 主机接收推送通知

同一服务器还可作为 无头 后台通知主机运行:将它安装在你通过 SSH 访问的任意 Linux 主机上,手机便可收到该主机上运行的 Agent 的 RUNNING / NEEDS YOU 推送通知和实时活动状态——无需开放任何端口(Hook 服务器仅监听回环地址,推送则通过 HTTPS 发出,使用手机经 SSH 写入的授权)。

curl -fsSL https://raw.githubusercontent.com/eneskirca/nodeterm/main/scripts/install-server.sh | bash

一条命令即可完成安装、构建,并将其作为 systemd 服务运行(NODETERM_HEADLESS=1);再次运行即可更新。详情参见无头通知主机章节。

从 nodeterm.dev 获取最新构建——下载按钮会检测你的平台。所有版本也列于 nodeterm.dev/releases:

  • macOS——适用于 Apple Silicon 和 Intel 的 .dmg(自动更新),或通过 Homebrew 安装:

    brew tap nodeterm/tap
    brew trust nodeterm/tap        # Homebrew ≥6 refuses to load an untrusted tap
    brew install --cask nodeterm
    

两条前置命令缺一不可。单独执行 brew install --cask nodeterm 时,Homebrew 只会搜索 homebrew/cask,并报告找不到该 cask;若未授予信任,Homebrew ≥6 会直接失败而不会提示。该 cask 跟随每个已推广版本,应用本身也会通过 electron-updater 自动更新,因此通常无需执行 brew upgrade。

  • Linux(x64)——可自动更新的 AppImage,或适用于 Debian/Ubuntu 的 .deb(sudo apt install ./nodeterm-*.deb;.deb 需要手动更新)。

  • iOS——可在 App Store 获取 nodeterm mobile。

需要在 macOS 或 Linux 上安装 Node.js 20+(建议安装 tmux——它是会话可跨重启存续的关键)。源代码检出版本不包含内置 tmux:在 macOS 上运行一次 node scripts/build-tmux.mjs,将其构建到 resources/bin/tmux(发布任务会自动完成此操作),或者自行安装 tmux。

npm install        # deps + rebuilds node-pty against Electron's ABI (postinstall)
npm run dev        # dev mode with renderer HMR
npm run build      # production build into out/
npm start          # preview the production build
npm run typecheck  # fastest correctness gate
npm test           # vitest unit + integration suite
npm run dist       # local UNSIGNED .dmg into dist/ (smoke test)
npm run dist:linux # AppImage + .deb into dist/ (on a Linux host)
npm run server:dev # build + run the browser Server Edition (needs Node 22 + tmux)

以下为默认快捷键——每一项都可在 设置 → 键盘快捷键 中重新映射。

快捷键 操作
⌘K 命令面板
⌘T / ⌘⇧C 新建终端 / 新建 Claude Code
⌘⇧B 切换 Kanban 看板
⌘W 关闭选中的节点
⌘Z / ⌘⇧Z 撤销 / 重做
⌘M 切换 Markdown 视图(终端 / 编辑器)
按住 ⌘⌥(Ctrl+Alt) 向当前聚焦终端进行语音输入
⌘⇧E 文件资源管理器
⌘, 设置 · ⌘/ 快捷键
右键点击 操作菜单(空白区域或节点)
  • Electron,三个上下文——src/main(Electron 外壳)、src/preload(唯一桥接层,window.nodeTerminal)、src/renderer(React UI)。src/shared 保存三个上下文共用的类型和 IPC 通道名称。
  • CorePlatform 边界——每项服务(PTY、工作区/设置、git、Agent、Hook)均位于 src/core 中,并通过一个小型平台接口实现,且从不导入 electron。Electron 是该边界的一种实现;浏览器 Server Edition(src/server)是另一种实现,它通过 WebSocket-RPC 桥接启动完全相同的服务(src/renderer/bridge 在浏览器中填充 window.nodeTerminal)。一套代码库、一个渲染器、多个运行外壳。
  • TerminalTransport 抽象——渲染器仅依赖该接口,从不直接依赖 IPC 或 node-pty。LocalTransport 与本地主机通信;RemoteTransport 通过 SSH 与远程 Agent 通信——因此远程项目无需改动画布 UI 即可接入。
  • React Flow 是实时节点的唯一事实来源;项目将序列化节点持久化到磁盘,tmux 则让会话跨重启持续存活。
  • 三个终端界面——桌面应用、浏览器 Server Edition 和 移动配套应用(独立的 SwiftUI 仓库)均基于同一套核心与传输边界。

有关 Server Edition,请参见 docs/SERVER.md;更深入的说明请参见 docs/ 下的设计文档。

欢迎提交 Issue 和 Pull Request。

English / 原文

nodeterm

A node-based terminal manager — your terminals and agents on an infinite canvas.

Multiple real terminals live as draggable nodes on a single pan/zoom canvas, and every project doubles as a Trello-style board of live Claude Code sessions. Built for people with ADHD and scattered workflows: a spatial layout instead of a stack of hidden tabs.

Platform Built with Electron License GitHub stars Latest release

Downloads

Download · Docs · Features · Build from source · Architecture · License


Stacked terminal tabs hide context — you lose track of what's running where. nodeterm turns that into a map : every shell is a node you can place, group, label, and zoom into. Sessions are spatial and persistent, so your mental model stays intact across restarts. And because the app is built around a clean service seam, the same canvas runs three ways — as the desktop app for macOS and Linux , as a self-hosted browser app you reach from anywhere (Server Edition), and an iOS companion that attaches to the same live sessions.

📚 Full documentation lives atnodeterm.dev/docs — get started, concepts, agents, remote access, troubleshooting.

Right-click the canvas to open a terminal — or an AI agent. Each runs in its own persistent tmux session, next to sticky notes (link one to feed an agent context), Monaco editors , diff views , and web/video nodes — arranged spatially, like a map. Quit the app, even restart the machine — every session comes back. The canvas — terminals, agents, notes, editors and diffs as nodes; sessions survive a full restart

Know when an agent needs you

Hook-driven status — no output scraping: pulsing RUNNING / NEEDS YOU badges, subagent cards with live transcripts, a per-node context meter , and OS notifications. Click the ping, answer the permission prompt right in the node, and get told the moment the turn is done. On a MacBook, agents live in the notch too. | Agent status — NEEDS YOU flip, notification, answering a permission prompt, subagent fan-out
Every project is a canvas — and also a kanban board. Cards are your live sessions: drag them across columns while the agent keeps running, open a card into a live card modal (the real session + members, due date, priority, comments), and assign teammates. Toggle with ⌘⇧B.
▶ Watch the board video with sound | The kanban board — live session cards, drag between columns, the card modal with a live Claude Code session
Pair your phone with one QR — scan with the nodeterm iOS app — and the same live session continues in your pocket , E2E encrypted over the relay, not just your LAN. The same canvas also runs self-hosted in any browser (Server Edition). | Pair your phone — scan the QR, the same live session continues on the iPhone
Hold ⌘⌥ and say it. On-device Whisper transcribes locally — review the text, then Send (nothing auto-submits). Your voice never leaves the machine. | Dictation — hold cmd-shift-D, speak, review, send into the terminal

🖥 Terminal (xterm + tmux, AI naming) · 🤖 Agent (Claude Code / Codex / Gemini / GitHub Copilot / opencode / Grok / custom) · 📝 Sticky note (link to an agent as context) · 🗂 Group (bind to a git worktree for agent-per-branch) · ✏️ Editor (Monaco, ⌘S) · 🔀 Diff · 🌐 Web / Video

  • Session continuity (tmux) — terminals keep running across node remounts and full app restarts, including live processes; machine reboots restore scrollback and resume agent sessions (claude --resume). The macOS app ships its own tmux , so this works with nothing installed; a tmux already on your system is always used in preference to it, and terminals opened before an upgrade stay as they were until you refresh the node.
  • Talk to your terminal — on-device Whisper dictation (hold ⌘⌥): speak, review, send.
  • Agent superpowers — context links so agent nodes read each other's transcripts on demand; Claude-only branch a conversation and managed accounts for several logged-in Claude identities side by side; agents can drive the canvas (open nodes, spawn teams, verify each other's work) via the built-in canvas-control CLI.
  • Remote / SSH projects — open a project on a remote host over SSH; terminals, files, git, and even the board run there while the canvas stays local.
  • Source control — VS Code-style stage/unstage, discard, branch switch/create, commit, push/sync/publish, worktrees , and gh sign-in — backed by system git.
  • GitHub Issues on Kanban – opt-in issue cards, exact label-to-column mapping, All / GitHub / Sessions filtering, and two-way move, close, and reopen sync. See setup and security details.
  • AI commit messages & terminal names — bring-your-own local agent CLI run read-only on the staged diff or captured output.
  • Your sessions, in your pocket — nodeterm mobile (iOS) attaches to the same live tmux sessions: watch an agent work, answer a "needs you", or type into any terminal from your phone — plus push notifications and a mobile board view.
  • Power & sleep — while an agent is working, nodeterm keeps the machine from idle-sleeping, and lets go the moment it finishes (on by default; toggle in the setup tour or Settings → Behavior). No app can hold a machine awake through a closed lid — for overnight runs keep the laptop open and plugged in, or run the agents on a box that doesn't sleep via the Server Edition.
  • Command palette (⌘K), file explorer (⌘⇧E), markdown view (⌘M), undo/redo , and a native macOS dark UI.
  • Auto-update & in-app announcements — the app checks a self-hosted feed and surfaces a "Restart to update" banner and product news.

🌍 Server Edition — nodeterm in your browser

The same canvas runs headless on a Linux (or macOS) host and is used from any browser — so your terminals, editors, source control, board, and agents live on a server you reach from anywhere. Single-user auth (password + secure cookie), a WebSocket bridge, and the exact same renderer as the desktop app.

npm run server:dev     # build + serve; open http://127.0.0.1:8443 and set a password

Terminals, files/editor/diff, the full git panel, the kanban board, and agent-status badges all work in the browser today. See docs/SERVER.md for the quickstart, security model, and current limitations.

🔔 Get push notifications from any SSH host

The same server also runs headless as a background notification host: install it on any Linux box you SSH into, and your phone gets RUNNING / NEEDS YOU push + Live-Activity coverage for the agents running there — with zero open ports (the hook server stays loopback-only and push goes out over HTTPS under a grant your phone drops over SSH).

curl -fsSL https://raw.githubusercontent.com/eneskirca/nodeterm/main/scripts/install-server.sh | bash

One line installs, builds, and runs it as a systemd service (NODETERM_HEADLESS=1); re-run it to update. See the headless notification host section for details.

Grab the latest build from nodeterm.dev — the download button detects your platform. Everything is also listed at nodeterm.dev/releases:

  • macOS — .dmg for Apple Silicon and Intel (auto-updates), or Homebrew :

    brew tap nodeterm/tap
    brew trust nodeterm/tap        # Homebrew ≥6 refuses to load an untrusted tap
    brew install --cask nodeterm
    

Both first lines are required. On its own, brew install --cask nodeterm only searches homebrew/cask and reports the cask as not found; without the trust grant, Homebrew ≥6 fails rather than prompting. The cask tracks each promoted release, and the app updates itself (electron-updater), so brew upgrade is rarely needed for it.

  • Linux (x64) — self-updating AppImage , or a .deb for Debian/Ubuntu (sudo apt install ./nodeterm-*.deb; updates are manual for .deb).

  • iOS — nodeterm mobile on the App Store.

Requires Node.js 20+ on macOS or Linux (tmux recommended — it's what makes sessions survive restarts). A source checkout does not carry the bundled tmux: run node scripts/build-tmux.mjs once on macOS to build it into resources/bin/tmux (the release job does this automatically), or just install tmux yourself.

npm install        # deps + rebuilds node-pty against Electron's ABI (postinstall)
npm run dev        # dev mode with renderer HMR
npm run build      # production build into out/
npm start          # preview the production build
npm run typecheck  # fastest correctness gate
npm test           # vitest unit + integration suite
npm run dist       # local UNSIGNED .dmg into dist/ (smoke test)
npm run dist:linux # AppImage + .deb into dist/ (on a Linux host)
npm run server:dev # build + run the browser Server Edition (needs Node 22 + tmux)

These are the defaults — every one of them is remappable in Settings → Keyboard Shortcuts.

Shortcut Action
⌘K Command palette
⌘T / ⌘⇧C New terminal / New Claude Code
⌘⇧B Toggle the kanban board
⌘W Close the selected node
⌘Z / ⌘⇧Z Undo / Redo
⌘M Toggle markdown view (terminal / editor)
Hold ⌘⌥ (Ctrl+Alt) Dictate into the focused terminal
⌘⇧E File explorer
⌘, Settings · ⌘/ Shortcuts
Right-click Actions menu (empty space or node)
  • Electron, three contexts — src/main (the Electron shell), src/preload (the only bridge, window.nodeTerminal), src/renderer (React UI). src/shared holds the types and IPC channel names used by all three.
  • CorePlatform seam — every service (PTY, workspace/settings, git, agents, hooks) lives in src/core behind a small platform interface and never imports electron. Electron is one implementation of that seam; the browser Server Edition (src/server) is another, booting the exact same services over a WebSocket-RPC bridge (src/renderer/bridge fills window.nodeTerminal in the browser). One codebase, one renderer, multiple shells.
  • TerminalTransport abstraction — the renderer depends only on this interface, never on IPC or node-pty directly. LocalTransport talks to the local host; RemoteTransport talks to a remote agent over SSH — so remote projects drop in without touching the canvas UI.
  • React Flow is the single source of truth for live nodes; projects persist serialized nodes to disk, and tmux keeps sessions alive across restarts.
  • Three surfaces — the desktop app, the browser Server Edition , and the mobile companion (a separate SwiftUI repo) all ride the same core + transport seams.

See docs/SERVER.md for the Server Edition, and the design docs under docs/ for deeper notes.

Issues and pull requests are welcome. Start withCONTRIBUTING.md — setup, the process-boundary rules, and the house rules that come up in review. CLAUDE.md is the deep reference behind them (and is loaded automatically if you work with an AI coding agent). Questions or bug reports are also happy at nodeterm.dev/support / support@nodeterm.dev. nodeterm is licensed under the Business Source License 1.1 — you can use, modify, and redistribute it freely, including in production, except offering it as a competing product or service (see License).

By submitting a contribution (pull request, patch, or code snippet), you agree that it is licensed under the same BUSL-1.1 terms as the rest of the project, and that the project may continue to relicense future versions (including your contribution) as part of its normal licensing model.

BUSL-1.1 (Business Source License): you may copy, modify, redistribute, and — under the Additional Use Grant — make production use of nodeterm; the one thing you may not do is offer it (hosted, embedded, or as a standalone product/service) in a way that competes with nodeterm or with the Licensor's products built on it. Each release automatically becomes plain MIT four years after it is published. See LICENSE for the full terms and THIRD-PARTY-NOTICES.md for the bundled open-source components. For a commercial license beyond the grant, contact eneskirca@gmail.com.

"Claude" and "Claude Code" are trademarks of Anthropic, and "Trello" is a trademark of Atlassian; nodeterm is not affiliated with or endorsed by either.