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
2.1K
+31 today
Forks
240
Watchers
7
Open issues
30
Open PRs
35
Contributors
~52
Commits
5.2K
Branches
570

TypeScriptOtherCreated Jun 15, 2026Last push todayLatest release v0.4.4+70 stars this week+217 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 2,106 stars and 240 forks on GitHub, and gained 70 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
01K2KAug 2026Sep 2026Oct 2026Oct 2026
2.1K stars as of Oct 25, 2026. Measured daily since Aug 23, 2026; GitHub no longer exposes earlier star timestamps.

Update history

2 recorded
  • Oct 22, 2026New release v0.4.4 (previously v0.4.3).
  • Oct 11, 2026New release v0.4.3 (previously v0.3.17).

Contribution activity

commits per day, last 52 weeks
OctNovDecJanFebMarAprMayJunJulAugSepOctMonWedFri2025-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: 5 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: 12 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: 16 commits2026-09-18: 3 commits2026-09-19: 3 commits2026-09-20: 2 commits2026-09-21: 6 commits2026-09-22: 5 commits2026-09-23: 155 commits2026-09-24: 17 commits2026-09-25: 10 commits2026-09-26: 87 commits2026-09-27: 17 commits2026-09-28: 106 commits2026-09-29: 174 commits2026-09-30: 169 commits2026-10-01: 65 commits2026-10-02: 4 commits2026-10-03: 18 commits2026-10-04: 33 commits2026-10-05: 1 commit2026-10-06: 3 commits2026-10-07: 25 commits2026-10-08: 7 commits2026-10-09: 1 commit2026-10-10: 0 commits2026-10-11: 0 commits2026-10-12: 98 commits2026-10-13: 30 commits2026-10-14: 2 commits2026-10-15: 7 commits2026-10-16: 39 commits2026-10-17: 2 commits2026-10-18: 5 commits2026-10-19: 3 commits2026-10-20: 2 commits2026-10-21: 0 commits2026-10-22: 0 commits2026-10-23: 0 commits2026-10-24: 0 commits
3,662 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Very active

    3,662 commits in 52 weeks

  • Continuous integration

    Automated checks passing

  • 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 · Sponsor · 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 / Cursor / 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). It lets the machine sleep anyway on battery below 5% or when the machine runs critically hot. No app can hold a machine awake through a closed lid (a Mac with the lid closed stays awake only while plugged in with an external display) — 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 install --cask nodeterm

    The cask is in the official homebrew/cask, so no tap is needed. The app updates itself (electron-updater), so brew upgrade is rarely needed for it. If you installed from the old nodeterm/tap, you can drop it with brew untap nodeterm/tap: the short name nodeterm already resolves to the official cask.

  • 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 (the app tells you when a new version is out and links the download), 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.

Sponsor

nodeterm is an indie project, built with Claude across several Claude accounts — about $2,000 a month to keep running. There are 10 Founding Sponsor spots at $200/month: your logo goes in this grid and on nodeterm.dev, and your feature requests go first.

0 of 10 spots taken · Become a Founding Sponsor →

Open Founding Sponsor spot Open Founding Sponsor spot Open Founding Sponsor spot Open Founding Sponsor spot Open Founding Sponsor spot
Open Founding Sponsor spot Open Founding Sponsor spot Open Founding Sponsor spot Open Founding Sponsor spot Open Founding Sponsor spot

Prefer a smaller amount, need an invoice, or want a different arrangement? Write to [email protected] — and a ⭐ helps too.

🛠 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 / [email protected]. 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 [email protected].

"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

69 total
  1. v0.4.4v0.4.4Oct 17, 202615.8K downloads

    ## Highlights **Windows is a real target now — as an unsigned beta, and that word is doing work.** The session-host phase landed, so the whole core experience works there: agent sessions and their hooks, managed Claude and Codex accounts, native SSH (port and agent forwarding, `ProxyCommand`, Pageant, `ssh.exe`), live links and co-attach, the phone relay, dev tools, run configurations, the tray with background mode, and the session reaper and memory panel. What it does **not** have is a code-signing certificate, so Windows SmartScreen will warn on the installer, and the build cannot update itself: it checks for new versions and shows a card that links to the download, and you run the new installer over the old one. Your projects and settings are kept, and on 0.4.1+ your running sessions survive the update. Signing is the next phase. **A simulator is a node now.** iOS simulator and Android emulator screens live on the canvas: click to tap, drag or scroll to swipe, type straight into the device, Home and Lock buttons, and a device picker that boots one. It is a real stream rather than a screenshot — nothing is encoded while the screen sits still, about 19–30 fps while it moves, fir

  2. v0.4.3v0.4.3Oct 9, 202623.5K downloads

    ## Highlights **If you use hold-to-talk dictation, take this release.** A support report traced a bug that had been there for many versions: after a short Cmd+Alt tap — or any Cmd+Opt shortcut, or the window simply losing focus — the microphone could stay open and keep typing into your selected terminal, one line every couple of minutes for about ten minutes. Sometimes what it typed was speech from the user's meetings. Opening a microphone is asynchronous, and the overlay could close before the capture handle existed, so the cleanup found nothing to cancel and the capture lived on alone. **A run node.** VS Code's "Run Without Debugging" for any `.vscode/launch.json` configuration, as a node on the canvas: pick a folder, a configuration or compound, and for Flutter a device, then Run / Stop / Restart — with hot reload, hot restart and reload-on-save. It is under **New view ▸ New run configuration** (⌘K: "New run configuration"). Several run nodes can live in one project, each pointed at a different checkout and simulator, which is the case it was built for. **Canvas and window handling.** Terminals resize from every edge with Liquid Glass on, the grab zone is wider, and a hovered

  3. v0.4.2v0.4.2Oct 5, 202614.2K downloads

    ## Highlights **Live links grew up.** v0.4.1 introduced them read-only. This release puts a **Share live link** button straight in the terminal node header, drops the limit on how many you can have, adds a **Live chat** drawer where you follow and answer a link's chat, and adds the one thing v0.4.1 could not do: a **Control** role that lets the other side actually type. Control is opt-in per link and gated, because handing someone your terminal is not a small thing. A viewer needs a name plus a password you send them separately — 8 to 128 characters, or a generated 16-symbol one shown once — and it is stored only as an scrypt hash beside the link, never in the URL and never logged. Wrong guesses are throttled on your machine: one attempt every two seconds, three wrong ends that connection, ten wrong locks control until you press "Allow control again", and that count survives an app restart. What a typist sends reaches the **pane** rather than a tmux client, so they cannot use the tmux prefix key to wander into your other sessions. **Groundwork for the Android companion**: phone pairing is now platform-neutral instead of assuming iOS. **⌘M fixes.** The composer stays usable whil

  4. v0.4.1v0.4.1Oct 2, 20266.8K downloads

    ## Highlights **Windows gets real SSH projects.** An SSH project on Windows used to go through the system `ssh` binary down a POSIX-shaped path that does not exist there; it now runs over an in-process SSH transport written for it, with **ProxyJump** support and an opt-in way to add a passphrase-unlocked key to the Windows ssh-agent. If you work from Windows against a remote host, this is the release to take. **Live links (Pro).** A read-only, expiring browser link to one terminal: you send the link, the other side watches the session live, nothing can be typed back, and it stops working when it expires. **Ports and recents.** A session's dev-server ports are listed and can be forwarded over SSH, so a server running on the remote host opens in the browser on your own machine. And "Open recent" resumes a past agent conversation from its history instead of making you dig out a session id. **The ⌘M composer completes as you type** — slash commands, skills and `@files` — and a script or a CI job can ring your paired phone through a push webhook. Smaller, and opt-in wherever it would change a habit: custom sounds for agent alerts, per-terminal font size on Cmd/Ctrl + / − / 0, one-w

  5. v0.4.0v0.4.0Sep 30, 20268.2K downloads

    ## Highlights **The kanban board runs work now.** Drag an issue card into a dispatch column and it starts its own agent run. A board comment that @mentions a session reaches that agent. An orchestrator's card shows its team's progress instead of repeating facts you have already read, and agents can read the board's GitHub lane themselves through new read-only `issues` and `prs` verbs. Orchestration state also survives an app restart, `--after-pr` holds a node's launch until a pull request passes checks or merges, and `--run-now` starts a queued node headless. **⌘M is no longer Claude-only.** The chat view now works for Gemini — on the desktop and on the phone over the relay — and for Codex, Copilot, opencode and Grok on SSH hosts. **Antigravity** joins the agent list too. **A team can be hosted from a Server Edition core**, joinable by invite code, so the machine holding the session no longer has to be running the desktop app. **Clicking a path in terminal output got serious.** Unicode, bracketed, spaced and bare paths and `file://` URIs are all detected; a relative path resolves against the pane's live cwd; hovering shows you the resolved path before you commit to the click; S

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
5530Week 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: 138 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: 53 commitsWeek of 2026-09-13: 66 commitsWeek of 2026-09-20: 282 commitsWeek of 2026-09-27: 553 commitsWeek of 2026-10-04: 70 commitsWeek of 2026-10-11: 178 commitsWeek of 2026-10-18: 10 commitsOct 26, 2025Oct 18, 2026
3.7K commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 22 commitsSun 1:00 — 37 commitsSun 2:00 — 14 commitsSun 3:00 — 13 commitsSun 4:00 — 7 commitsSun 5:00 — 5 commitsSun 6:00 — 7 commitsSun 7:00 — 3 commitsSun 8:00 — 1 commitsSun 9:00 — 0 commitsSun 10:00 — 13 commitsSun 11:00 — 14 commitsSun 12:00 — 28 commitsSun 13:00 — 33 commitsSun 14:00 — 24 commitsSun 15:00 — 29 commitsSun 16:00 — 38 commitsSun 17:00 — 21 commitsSun 18:00 — 17 commitsSun 19:00 — 30 commitsSun 20:00 — 23 commitsSun 21:00 — 31 commitsSun 22:00 — 42 commitsSun 23:00 — 37 commitsMon 0:00 — 95 commitsMon 1:00 — 37 commitsMon 2:00 — 31 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 — 11 commitsMon 10:00 — 5 commitsMon 11:00 — 11 commitsMon 12:00 — 32 commitsMon 13:00 — 28 commitsMon 14:00 — 19 commitsMon 15:00 — 22 commitsMon 16:00 — 50 commitsMon 17:00 — 38 commitsMon 18:00 — 29 commitsMon 19:00 — 23 commitsMon 20:00 — 18 commitsMon 21:00 — 30 commitsMon 22:00 — 34 commitsMon 23:00 — 84 commitsTue 0:00 — 60 commitsTue 1:00 — 68 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 — 2 commitsTue 11:00 — 8 commitsTue 12:00 — 39 commitsTue 13:00 — 55 commitsTue 14:00 — 40 commitsTue 15:00 — 18 commitsTue 16:00 — 19 commitsTue 17:00 — 26 commitsTue 18:00 — 16 commitsTue 19:00 — 22 commitsTue 20:00 — 25 commitsTue 21:00 — 34 commitsTue 22:00 — 37 commitsTue 23:00 — 45 commitsWed 0:00 — 34 commitsWed 1:00 — 57 commitsWed 2:00 — 40 commitsWed 3:00 — 33 commitsWed 4:00 — 16 commitsWed 5:00 — 24 commitsWed 6:00 — 8 commitsWed 7:00 — 2 commitsWed 8:00 — 7 commitsWed 9:00 — 4 commitsWed 10:00 — 8 commitsWed 11:00 — 6 commitsWed 12:00 — 31 commitsWed 13:00 — 52 commitsWed 14:00 — 63 commitsWed 15:00 — 65 commitsWed 16:00 — 64 commitsWed 17:00 — 49 commitsWed 18:00 — 56 commitsWed 19:00 — 102 commitsWed 20:00 — 41 commitsWed 21:00 — 48 commitsWed 22:00 — 35 commitsWed 23:00 — 28 commitsThu 0:00 — 32 commitsThu 1:00 — 27 commitsThu 2:00 — 16 commitsThu 3:00 — 11 commitsThu 4:00 — 1 commitsThu 5:00 — 0 commitsThu 6:00 — 1 commitsThu 7:00 — 2 commitsThu 8:00 — 5 commitsThu 9:00 — 6 commitsThu 10:00 — 3 commitsThu 11:00 — 14 commitsThu 12:00 — 11 commitsThu 13:00 — 17 commitsThu 14:00 — 31 commitsThu 15:00 — 35 commitsThu 16:00 — 29 commitsThu 17:00 — 31 commitsThu 18:00 — 19 commitsThu 19:00 — 19 commitsThu 20:00 — 26 commitsThu 21:00 — 19 commitsThu 22:00 — 15 commitsThu 23:00 — 15 commitsFri 0:00 — 7 commitsFri 1:00 — 18 commitsFri 2:00 — 12 commitsFri 3:00 — 12 commitsFri 4:00 — 0 commitsFri 5:00 — 4 commitsFri 6:00 — 1 commitsFri 7:00 — 1 commitsFri 8:00 — 1 commitsFri 9:00 — 2 commitsFri 10:00 — 3 commitsFri 11:00 — 4 commitsFri 12:00 — 19 commitsFri 13:00 — 15 commitsFri 14:00 — 52 commitsFri 15:00 — 26 commitsFri 16:00 — 11 commitsFri 17:00 — 13 commitsFri 18:00 — 17 commitsFri 19:00 — 19 commitsFri 20:00 — 25 commitsFri 21:00 — 31 commitsFri 22:00 — 18 commitsFri 23:00 — 10 commitsSat 0:00 — 34 commitsSat 1:00 — 38 commitsSat 2:00 — 16 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 — 10 commitsSat 12:00 — 13 commitsSat 13:00 — 11 commitsSat 14:00 — 11 commitsSat 15:00 — 14 commitsSat 16:00 — 25 commitsSat 17:00 — 10 commitsSat 18:00 — 4 commitsSat 19:00 — 8 commitsSat 20:00 — 15 commitsSat 21:00 — 13 commitsSat 22:00 — 30 commitsSat 23:00 — 20 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits3,582 (68%)
Community commits1,662 (32%)

5,244 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.

    457.9K stars · TypeScript

  • openclaw/openclaw

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

    393K stars · TypeScript

  • morluto/rea

    Reverse engineer anything with agents, from app behavior down to native binaries.

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

    288.8K stars · JavaScript

  • NousResearch/hermes-agent

    The agent that grows with you

    257K stars · Python

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

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

    253.2K stars