eneskirca/nodetermPublic

Node-based terminal manager for AI coding agents — tmux-backed terminals and parallel agent sessions as draggable nodes on an infinite pan/zoom canvas. macOS, Linux, and a browser Server Edition.

AI summary: A spatial terminal manager that organizes tmux sessions and AI agents as draggable nodes on an infinite canvas.

Stars
2K
+29 today
Forks
217
Watchers
7
Open issues
60
Open PRs
58
Contributors
~45
Commits
4.3K
Branches
422

TypeScriptOtherCreated Jun 15, 2026Last push todayLatest release v0.3.17+52 stars this week+221 this month

Quick answers

What is nodeterm?
A spatial terminal manager that organizes tmux sessions and AI agents as draggable nodes on an infinite canvas.
What does nodeterm do?
Nodeterm radically reimagines the terminal environment by placing real, tmux-backed terminal sessions onto an infinite pan-and-zoom canvas. Instead of burying workflows in hidden tabs or rigid panes, it treats every project as a spatial workspace where terminals, code editors, and live AI agent sessions exist as draggable nodes. It integrates deeply with AI coding tools like Claude Code, allowing developers to monitor and interact with parallel agent sessions through a Kanban-style board interface. The architecture ensures that all sessions are persistent and survive full machine restarts. It is specifically designed to help developers manage scattered workflows and maintain visual context across complex tasks.
Who is nodeterm for?
Aimed at developers managing complex, multi-service architectures, users of autonomous coding agents, and individuals who benefit from spatial organization over traditional tabbed interfaces. Users are expected to have a basic understanding of the relevant underlying technologies.
How do I get started with nodeterm?
curl -sL https://nodeterm.dev/install | bash
How popular is nodeterm on GitHub?
eneskirca/nodeterm has 1,954 stars and 217 forks on GitHub, and gained 52 stars in the last 7 days.
What license does nodeterm use?
eneskirca/nodeterm is released under the Other license.

Star history

since Aug 23, 2026
05001K1.5KAug 2026Sep 2026Sep 2026Oct 2026
2K stars as of Oct 4, 2026. Measured daily since Aug 23, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

commits per day, last 52 weeks
OctNovDecJanFebMarAprMayJunJulAugSepMonWedFri2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 0 commits2026-04-07: 0 commits2026-04-08: 0 commits2026-04-09: 0 commits2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 0 commits2026-04-13: 0 commits2026-04-14: 0 commits2026-04-15: 0 commits2026-04-16: 0 commits2026-04-17: 0 commits2026-04-18: 0 commits2026-04-19: 0 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 0 commits2026-04-26: 0 commits2026-04-27: 0 commits2026-04-28: 0 commits2026-04-29: 0 commits2026-04-30: 0 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 0 commits2026-05-06: 0 commits2026-05-07: 0 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 0 commits2026-05-12: 0 commits2026-05-13: 0 commits2026-05-14: 0 commits2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 0 commits2026-05-19: 0 commits2026-05-20: 0 commits2026-05-21: 0 commits2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 0 commits2026-05-28: 0 commits2026-05-29: 0 commits2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 0 commits2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 0 commits2026-06-05: 0 commits2026-06-06: 0 commits2026-06-07: 0 commits2026-06-08: 0 commits2026-06-09: 0 commits2026-06-10: 0 commits2026-06-11: 0 commits2026-06-12: 0 commits2026-06-13: 0 commits2026-06-14: 0 commits2026-06-15: 3 commits2026-06-16: 32 commits2026-06-17: 16 commits2026-06-18: 43 commits2026-06-19: 31 commits2026-06-20: 2 commits2026-06-21: 0 commits2026-06-22: 9 commits2026-06-23: 22 commits2026-06-24: 39 commits2026-06-25: 50 commits2026-06-26: 16 commits2026-06-27: 5 commits2026-06-28: 5 commits2026-06-29: 21 commits2026-06-30: 27 commits2026-07-01: 29 commits2026-07-02: 5 commits2026-07-03: 20 commits2026-07-04: 16 commits2026-07-05: 30 commits2026-07-06: 30 commits2026-07-07: 11 commits2026-07-08: 8 commits2026-07-09: 12 commits2026-07-10: 50 commits2026-07-11: 34 commits2026-07-12: 118 commits2026-07-13: 139 commits2026-07-14: 52 commits2026-07-15: 44 commits2026-07-16: 8 commits2026-07-17: 39 commits2026-07-18: 39 commits2026-07-19: 51 commits2026-07-20: 21 commits2026-07-21: 17 commits2026-07-22: 11 commits2026-07-23: 17 commits2026-07-24: 15 commits2026-07-25: 16 commits2026-07-26: 37 commits2026-07-27: 12 commits2026-07-28: 18 commits2026-07-29: 4 commits2026-07-30: 7 commits2026-07-31: 2 commits2026-08-01: 12 commits2026-08-02: 27 commits2026-08-03: 41 commits2026-08-04: 27 commits2026-08-05: 30 commits2026-08-06: 5 commits2026-08-07: 3 commits2026-08-08: 3 commits2026-08-09: 75 commits2026-08-10: 29 commits2026-08-11: 95 commits2026-08-12: 48 commits2026-08-13: 29 commits2026-08-14: 53 commits2026-08-15: 103 commits2026-08-16: 43 commits2026-08-17: 10 commits2026-08-18: 36 commits2026-08-19: 149 commits2026-08-20: 59 commits2026-08-21: 6 commits2026-08-22: 0 commits2026-08-23: 6 commits2026-08-24: 21 commits2026-08-25: 5 commits2026-08-26: 12 commits2026-08-27: 8 commits2026-08-28: 10 commits2026-08-29: 19 commits2026-08-30: 32 commits2026-08-31: 31 commits2026-09-01: 51 commits2026-09-02: 101 commits2026-09-03: 24 commits2026-09-04: 6 commits2026-09-05: 6 commits2026-09-06: 6 commits2026-09-07: 11 commits2026-09-08: 0 commits2026-09-09: 16 commits2026-09-10: 6 commits2026-09-11: 11 commits2026-09-12: 2 commits2026-09-13: 2 commits2026-09-14: 12 commits2026-09-15: 15 commits2026-09-16: 15 commits2026-09-17: 15 commits2026-09-18: 3 commits2026-09-19: 3 commits2026-09-20: 0 commits2026-09-21: 6 commits2026-09-22: 4 commits2026-09-23: 155 commits2026-09-24: 15 commits2026-09-25: 8 commits2026-09-26: 73 commits2026-09-27: 7 commits2026-09-28: 96 commits2026-09-29: 95 commits2026-09-30: 0 commits2026-10-01: 0 commits2026-10-02: 0 commits2026-10-03: 0 commits
3,024 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Very active

    3,024 commits in 52 weeks

  • Repeat trending

    5 trending appearances

What nodeterm does

Nodeterm radically reimagines the terminal environment by placing real, tmux-backed terminal sessions onto an infinite pan-and-zoom canvas. Instead of burying workflows in hidden tabs or rigid panes, it treats every project as a spatial workspace where terminals, code editors, and live AI agent sessions exist as draggable nodes. It integrates deeply with AI coding tools like Claude Code, allowing developers to monitor and interact with parallel agent sessions through a Kanban-style board interface. The architecture ensures that all sessions are persistent and survive full machine restarts. It is specifically designed to help developers manage scattered workflows and maintain visual context across complex tasks.

Aimed at developers managing complex, multi-service architectures, users of autonomous coding agents, and individuals who benefit from spatial organization over traditional tabbed interfaces. Users are expected to have a basic understanding of the relevant underlying technologies.

  • Infinite spatial canvas: Organizes terminal sessions, code editors, and AI agents as freely movable nodes on a zoomable workspace.
  • Tmux-backed persistence: Ensures all terminal sessions run continuously and survive application crashes or full system restarts.
  • AI session Kanban board: Visualizes parallel Claude Code sessions in a Trello-style layout for easy tracking of autonomous tasks.
  • Cross-platform compatibility: Runs seamlessly on macOS, Linux, and provides a Server Edition for browser-based remote access.
  • Visual context management: Eliminates hidden tabs by allowing developers to spatially arrange their tools according to their mental model.

Where teams use it

Managing parallel AI agents

Visually tracking multiple autonomous coding agents working on different parts of a project simultaneously without losing context.

Spatial project organization

Grouping relevant server logs, build processes, and editor nodes visually based on the specific microservice they relate to.

Persistent remote development

Using the Server Edition to maintain a persistent, visual layout of terminal sessions accessible from any browser.

ADHD-friendly workflows

Providing a spatial interface that keeps all necessary context visible, preventing developers from losing track of hidden terminal tabs.

Getting started: curl -sL https://nodeterm.dev/install | bash

README

main branch
nodeterm

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

eneskirca%2Fnodeterm | Trendshift

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


Why nodeterm

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, Linux and Windows (beta), 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 at nodeterm.dev/docs — get started, concepts, agents, remote access, troubleshooting.

✨ Features

Everything is a node

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 — right-click to add Claude Code, a terminal, a sticky note, an editor and a diff; link the note to Claude; restart, and every session comes back

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 — subagent fan-out with a context meter; a permission prompt lights the notch and posts a macOS notification; Go jumps to the node; ✓ Approve in its header

One project, two views

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 — ⌘⇧B turns the canvas into cards, drag one to Done while it keeps running, the card modal with the live Claude Code session and comments

Your sessions, anywhere

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, every session is one tap away, the real Claude Code on the iPhone, answer its permission prompt from there

Talk to your terminal

Hold ⌘⌥, say it, let go. On-device Whisper transcribes it locally and types the text into the terminal's prompt — you press Enter (nothing auto-submits). Your voice never leaves the machine.

Dictation — hold ⌘⌥ and speak, let go, local Whisper types the words into Claude Code's prompt, you press Enter

Node kinds

🖥 Terminal (xterm + tmux, AI naming) · 🤖 Agent (Claude Code / Codex / Antigravity / 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

More

  • 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.
  • 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.

📦 Download

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, a .deb for Debian/Ubuntu (sudo apt install ./node-terminal_*.deb), or an .rpm for Fedora/RHEL (sudo dnf install ./node-terminal-*.rpm). Updates are manual for both packages: the app tells you when a new version is out and links the download. The AppImage needs FUSE 2, which Fedora does not install by default: sudo dnf install fuse-libs if it exits with a libfuse.so.2 error.

  • Windows (x64) — beta — nodeterm-Setup-<version>.exe (per-user installer) or a portable -win.zip. Early support, so know what you are getting: the installer is unsigned (SmartScreen will ask — More info → Run anyway), updates are manual for now (grab the next build from the same page), and session continuity across restarts is still landing — Windows has no tmux, so the standalone session host that replaces it is being packaged in #579. Everything else — canvas, agents, kanban, hooks — is the same app. Please report what breaks.

  • iOS — nodeterm mobile on the App Store.

Trying it out? Removal is one script — it stops every process nodeterm started, reverts the status-hook/skill entries it merged into your agent CLIs' config (your own hooks and credentials are never touched), and deletes all of nodeterm's own state. Run it with --dry-run first to see the full list of what it found:

curl -fsSL https://raw.githubusercontent.com/eneskirca/nodeterm/main/scripts/uninstall.sh | bash -s -- --dry-run
curl -fsSL https://raw.githubusercontent.com/eneskirca/nodeterm/main/scripts/uninstall.sh | bash -s -- --yes

The full inventory of what nodeterm writes where (and what the script keeps, like the .nodeterm/ canvas folders inside your own repos) is documented in docs/uninstall.md.

🛠 Build from source

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. On Windows, run bootstrap-windows.bat from a fresh checkout first — it checks for Node, the Visual Studio C++ build tools and Python 3 (needed to compile node-pty) and points you at the exact winget commands for anything missing, then runs npm ci.

On Fedora (and any distro shipping GCC 14 or newer), export CFLAGS=-D_GNU_SOURCE for the install: smart-whisper's bundled whisper.cpp uses GNU-only CPU-affinity calls without asking for them, and GCC 14 turned that from a warning into an error, so a plain npm install fails while building it. Packaging additionally wants rpm-build (for the .rpm target) and libxcrypt-compat (electron-builder's bundled fpm runs a Ruby that still links libcrypt.so.1, without which both .deb and .rpm fail):

sudo dnf install -y rpm-build libxcrypt-compat
CFLAGS=-D_GNU_SOURCE npm install
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 + .rpm into dist/ (on a Linux host; .rpm needs rpmbuild)
npm run dist:win   # unsigned NSIS installer + zip into dist/ (on a Windows host)
npm run server:dev # build + run the browser Server Edition (needs Node 22 + tmux)

⌨️ Keyboard shortcuts

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
⌘← ⌘→ ⌘↑ ⌘↓ Focus the node left / right / above / below (Ctrl+Shift+arrow off macOS)
⌘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)

Pasting screenshots on macOS: in a terminal, Cmd+V saves the image and pastes its file path. Ctrl+V sends a control key to the foreground program. A local agent with clipboard-image support, such as Claude Code, may attach the image directly at its input prompt; shells and editors give that key other meanings. nodeterm does not detect this capability or retry with the other route. Use Cmd+V for SSH sessions: the image is uploaded and its remote path is pasted. In Server Edition, image paste uploads to the terminal host and depends on browser clipboard access; Ctrl+V does not transfer the browser's clipboard to the host. This distinction also appears in Keyboard shortcuts → Pasting screenshots on macOS and applies to both canvas and kanban terminals.

🏗 Architecture

  • 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.

🤝 Contributing

Issues and pull requests are welcome. Start with CONTRIBUTING.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.

📜 License

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.

View on GitHub

Recent activity

commits and pull requests

Releases and announcements

64 total
  1. v0.3.17v0.3.17Sep 27, 20266.2K downloads

    ## Highlights **Update for this one: a project switch could overwrite a canvas with another project's nodes.** It happened in the field on 2026-09-26 — the 7 nodes of an SSH project replaced the 18 nodes of a local one, and the next autosave wrote that to `.nodeterm/project.json`. The guard meant to stop it compared the canvas against a tag saying which project's nodes it held, but the tag and the nodes were set on different React lanes, so for a moment a render paired the new project's tag with the old project's nodes, and every commit in that window passed: a switch, an autosave, a launch write. Both now move in the same tick. If a project's node list already looks wrong, restore it from git — `.nodeterm/project.json` is a committed file, which is exactly why it is recoverable. **Two new right-click menus.** Links in terminal output have one, so a URL or file path an agent printed is no longer reachable only by Cmd/Ctrl+click, and the file-manager node's menu gained Download. **Relay reconnection stops hammering.** v0.3.15's backoff cut host-token 429s from about 15% to about 1%; two remaining loops are now closed. A host whose relay WebSocket fails while the API is still answ

  2. v0.3.16v0.3.16Sep 26, 20264.6K downloads

    ## Highlights **The ⌘M chat view answers back.** You can approve a plan — accept-edits or manual — send one back for revision, and pick AskUserQuestion options, all from the chat view, without a keystroke going into the terminal pane. It rides the existing PermissionRequest hook channel. The same change fixes a silent no-op that was worse than it looked: the node header's ✓ Approve, and the phone's allow, did **nothing** on a plan, because Claude Code drops a bare allow for tools that require interaction — the answer has to carry the updated input with it. **And it reads like a conversation.** The panel gained a claude.ai-style thread — user bubbles, unbubbled assistant text, a turn action row — and a real composer with file attach, dictation, and model · effort labels. A working indicator and live refresh show the agent answering, and a long transcript now loads in pages instead of making you wait for the whole file. **It also got cheaper to leave open.** CPU and GPU drop during camera moves, animations, polling and autosave: the viewport raster scale freezes while the camera moves, the minimap projects transform-only, the working glow settles after four pulses, SSH transcript

  3. v0.3.15v0.3.15Sep 25, 20263.4K downloads

    ## Highlights Fixes only — and the two that matter most happen when your Mac comes back. **Waking from sleep.** An open SSH project's terminals used to show their last screen and then take no input for about a minute — measured at 74 seconds — while agent badges sat on RUNNING. Sleep kills the connection but leaves the local `ssh` master process alive, and `ssh -O check` asks that master about itself, so it cheerfully answered "Master running" and the wake pass did nothing. It now makes a real round trip over each master and drops one that cannot answer, so the project reconnects instead of freezing. Relatedly, a single slow tunnel probe no longer flashes "lost verified connection" when nothing was lost. **Coming back from another Space.** Swipe away with four fingers, click something over there, swipe back — and the canvas was stuck in pan mode: scrolling over a terminal panned the canvas and clicking did not focus it, until you pressed Escape. The Cmd/Ctrl latch behind the hover guard now reads the state the OS reports on the next mouse event, so the first movement after you return corrects it. Cmd+wheel zoom over a terminal is unchanged. Also: `~/`-prefixed paths in terminal

  4. v0.3.14v0.3.14Sep 25, 20261.6K downloads

    ## Highlights **Liquid Glass.** Settings → Appearance has a fourth option beside Follow terminal / Dark / Light: windows, menus, the sidebar, the dock, Settings and the kanban board all become frosted glass, with a wallpaper behind the canvas (on a Mac it can read your own system wallpapers), a Clear → Tinted slider whose "Readable" mark shows where text stays legible over any wallpaper, and switches for the grid dots and for keeping blur while you pan. It is **off by default** — change nothing and the only difference is a colour clean-up: duplicate shades merged, "needs you" dots always red, and a few light-theme text colours made easier to read. macOS Reduce Transparency, Increase Contrast and Reduce Motion are respected. Persistent agent sessions on Windows now actually persist: they run through the session host, so they survive a restart instead of quietly becoming plain shells. The macOS and Windows packages also ship the Codex relay, which was missing from both. Two ways of losing work quietly are closed. A restart no longer gives up on an agent CLI that is slow to quit — it keeps watching and hands over the resume line — and opening a new agent on an SSH project no longer

  5. v0.3.13v0.3.13Sep 23, 20267.1K downloads

    ## Highlights **This supersedes the incomplete v0.3.10–v0.3.12 prereleases and is the urgent macOS compatibility release for v0.3.9.** The bundled tmux in v0.3.9 could crash at startup on older macOS versions, leaving terminals unable to start for users without a separately installed tmux. The rebuilt binary uses private bundled compatibility functions instead of newer-SDK-only system symbols, and the release build rejects unguarded weak imports before they can ship. This release also includes the account controls and reliability improvements merged since v0.3.9, including local and SSH account switching, configurable terminal parking, browser zoom, and fixes across agent approvals, retained launches, hooks, context links, Windows updates, and editor UI. ## New - **canvas** — group the node menu — Transfer ▸ and Restart ▸ submenus · [#881](https://github.com/eneskirca/nodeterm/pull/881) by [@eneskirca](https://github.com/eneskirca) - **canvas** — move Switch model / account out of Restart ▸ · [#884](https://github.com/eneskirca/nodeterm/pull/884) by [@eneskirca](https://github.com/eneskirca) - **terminal** — configurable park window + cap, remote parks evicted last ([#886](http

Code frequency

additions and deletions
+97.8K-97.8KWeek of 2026-06-14: +28,631 linesWeek of 2026-06-14: -2,567 linesWeek of 2026-06-21: +19,333 linesWeek of 2026-06-21: -5,354 linesWeek of 2026-06-28: +12,487 linesWeek of 2026-06-28: -3,227 linesWeek of 2026-07-05: +26,381 linesWeek of 2026-07-05: -10,242 linesWeek of 2026-07-12: +59,303 linesWeek of 2026-07-12: -10,591 linesWeek of 2026-07-19: +28,845 linesWeek of 2026-07-19: -8,766 linesWeek of 2026-07-26: +15,449 linesWeek of 2026-07-26: -2,122 linesWeek of 2026-08-02: +34,115 linesWeek of 2026-08-02: -5,111 linesWeek of 2026-08-09: +97,838 linesWeek of 2026-08-09: -9,369 linesWeek of 2026-08-16: +81,738 linesWeek of 2026-08-16: -4,932 linesWeek of 2026-08-23: +18,461 linesWeek of 2026-08-23: -3,759 linesWeek of 2026-08-30: +40,891 linesWeek of 2026-08-30: -4,601 linesJun 14, 2026Aug 30, 2026
+463.5K lines added, -70.6K removed over the last year.

Commits per week

last 52 weeks
4390Week of 2025-10-05: 0 commitsWeek of 2025-10-12: 0 commitsWeek of 2025-10-19: 0 commitsWeek of 2025-10-26: 0 commitsWeek of 2025-11-02: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 0 commitsWeek of 2026-04-05: 0 commitsWeek of 2026-04-12: 0 commitsWeek of 2026-04-19: 0 commitsWeek of 2026-04-26: 0 commitsWeek of 2026-05-03: 0 commitsWeek of 2026-05-10: 0 commitsWeek of 2026-05-17: 0 commitsWeek of 2026-05-24: 0 commitsWeek of 2026-05-31: 0 commitsWeek of 2026-06-07: 0 commitsWeek of 2026-06-14: 127 commitsWeek of 2026-06-21: 141 commitsWeek of 2026-06-28: 123 commitsWeek of 2026-07-05: 175 commitsWeek of 2026-07-12: 439 commitsWeek of 2026-07-19: 148 commitsWeek of 2026-07-26: 92 commitsWeek of 2026-08-02: 136 commitsWeek of 2026-08-09: 432 commitsWeek of 2026-08-16: 303 commitsWeek of 2026-08-23: 81 commitsWeek of 2026-08-30: 251 commitsWeek of 2026-09-06: 52 commitsWeek of 2026-09-13: 65 commitsWeek of 2026-09-20: 261 commitsWeek of 2026-09-27: 198 commitsOct 5, 2025Sep 27, 2026
3K commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 17 commitsSun 1:00 — 33 commitsSun 2:00 — 11 commitsSun 3:00 — 9 commitsSun 4:00 — 4 commitsSun 5:00 — 4 commitsSun 6:00 — 5 commitsSun 7:00 — 1 commitsSun 8:00 — 1 commitsSun 9:00 — 0 commitsSun 10:00 — 13 commitsSun 11:00 — 7 commitsSun 12:00 — 25 commitsSun 13:00 — 33 commitsSun 14:00 — 24 commitsSun 15:00 — 26 commitsSun 16:00 — 36 commitsSun 17:00 — 21 commitsSun 18:00 — 17 commitsSun 19:00 — 29 commitsSun 20:00 — 15 commitsSun 21:00 — 31 commitsSun 22:00 — 40 commitsSun 23:00 — 37 commitsMon 0:00 — 18 commitsMon 1:00 — 34 commitsMon 2:00 — 30 commitsMon 3:00 — 0 commitsMon 4:00 — 0 commitsMon 5:00 — 3 commitsMon 6:00 — 5 commitsMon 7:00 — 1 commitsMon 8:00 — 0 commitsMon 9:00 — 8 commitsMon 10:00 — 5 commitsMon 11:00 — 11 commitsMon 12:00 — 28 commitsMon 13:00 — 28 commitsMon 14:00 — 19 commitsMon 15:00 — 22 commitsMon 16:00 — 50 commitsMon 17:00 — 34 commitsMon 18:00 — 28 commitsMon 19:00 — 23 commitsMon 20:00 — 17 commitsMon 21:00 — 30 commitsMon 22:00 — 33 commitsMon 23:00 — 66 commitsTue 0:00 — 35 commitsTue 1:00 — 67 commitsTue 2:00 — 36 commitsTue 3:00 — 18 commitsTue 4:00 — 14 commitsTue 5:00 — 6 commitsTue 6:00 — 4 commitsTue 7:00 — 18 commitsTue 8:00 — 5 commitsTue 9:00 — 7 commitsTue 10:00 — 1 commitsTue 11:00 — 8 commitsTue 12:00 — 24 commitsTue 13:00 — 37 commitsTue 14:00 — 33 commitsTue 15:00 — 18 commitsTue 16:00 — 18 commitsTue 17:00 — 26 commitsTue 18:00 — 15 commitsTue 19:00 — 19 commitsTue 20:00 — 16 commitsTue 21:00 — 21 commitsTue 22:00 — 25 commitsTue 23:00 — 36 commitsWed 0:00 — 31 commitsWed 1:00 — 53 commitsWed 2:00 — 30 commitsWed 3:00 — 22 commitsWed 4:00 — 13 commitsWed 5:00 — 10 commitsWed 6:00 — 4 commitsWed 7:00 — 1 commitsWed 8:00 — 7 commitsWed 9:00 — 3 commitsWed 10:00 — 8 commitsWed 11:00 — 3 commitsWed 12:00 — 24 commitsWed 13:00 — 48 commitsWed 14:00 — 57 commitsWed 15:00 — 43 commitsWed 16:00 — 43 commitsWed 17:00 — 24 commitsWed 18:00 — 47 commitsWed 19:00 — 83 commitsWed 20:00 — 29 commitsWed 21:00 — 41 commitsWed 22:00 — 29 commitsWed 23:00 — 24 commitsThu 0:00 — 27 commitsThu 1:00 — 22 commitsThu 2:00 — 14 commitsThu 3:00 — 1 commitsThu 4:00 — 0 commitsThu 5:00 — 0 commitsThu 6:00 — 1 commitsThu 7:00 — 1 commitsThu 8:00 — 5 commitsThu 9:00 — 6 commitsThu 10:00 — 2 commitsThu 11:00 — 14 commitsThu 12:00 — 11 commitsThu 13:00 — 17 commitsThu 14:00 — 29 commitsThu 15:00 — 32 commitsThu 16:00 — 28 commitsThu 17:00 — 20 commitsThu 18:00 — 13 commitsThu 19:00 — 14 commitsThu 20:00 — 20 commitsThu 21:00 — 12 commitsThu 22:00 — 6 commitsThu 23:00 — 8 commitsFri 0:00 — 6 commitsFri 1:00 — 15 commitsFri 2:00 — 12 commitsFri 3:00 — 12 commitsFri 4:00 — 0 commitsFri 5:00 — 3 commitsFri 6:00 — 0 commitsFri 7:00 — 0 commitsFri 8:00 — 1 commitsFri 9:00 — 1 commitsFri 10:00 — 2 commitsFri 11:00 — 3 commitsFri 12:00 — 15 commitsFri 13:00 — 12 commitsFri 14:00 — 30 commitsFri 15:00 — 25 commitsFri 16:00 — 11 commitsFri 17:00 — 10 commitsFri 18:00 — 14 commitsFri 19:00 — 19 commitsFri 20:00 — 25 commitsFri 21:00 — 30 commitsFri 22:00 — 18 commitsFri 23:00 — 9 commitsSat 0:00 — 30 commitsSat 1:00 — 37 commitsSat 2:00 — 13 commitsSat 3:00 — 21 commitsSat 4:00 — 15 commitsSat 5:00 — 3 commitsSat 6:00 — 1 commitsSat 7:00 — 10 commitsSat 8:00 — 28 commitsSat 9:00 — 11 commitsSat 10:00 — 6 commitsSat 11:00 — 8 commitsSat 12:00 — 11 commitsSat 13:00 — 10 commitsSat 14:00 — 11 commitsSat 15:00 — 13 commitsSat 16:00 — 22 commitsSat 17:00 — 9 commitsSat 18:00 — 4 commitsSat 19:00 — 8 commitsSat 20:00 — 14 commitsSat 21:00 — 4 commitsSat 22:00 — 28 commitsSat 23:00 — 16 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits3,352 (79%)
Community commits900 (21%)

4,252 commits in total over the last year.

DateListRankStars gained
Aug 27, 2026weekly#14+375
Aug 26, 2026weekly#14+375
Aug 25, 2026weekly#12+529
Aug 24, 2026weekly#12+424
Aug 23, 2026weekly#12+424
  • freeCodeCamp/freeCodeCamp

    freeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.

    456.7K stars · TypeScript

  • openclaw/openclaw

    The AI that really does things. Any OS. Any Platform. The lobster way. 🦞

    391.3K stars · TypeScript

  • affaan-m/ECC

    The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

    272.9K stars · JavaScript

  • NousResearch/hermes-agent

    The agent that grows with you

    251.2K stars · Python

  • trimstray/the-book-of-secret-knowledge

    A collection of inspiring lists, manuals, cheatsheets, blogs, hacks, one-liners, cli/web tools and more.

    247.9K stars

  • anomalyco/opencode

    The open source coding agent.

    211.8K stars · TypeScript