
# 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.
[%20·%20Linux%20(x64)%20·%20Windows%20(x64%2C%20beta)-black)](https://nodeterm.dev)
[](https://www.electronjs.org/)
[](./LICENSE)
[](https://github.com/eneskirca/nodeterm/stargazers)
[](https://github.com/eneskirca/nodeterm/releases)
[](https://github.com/eneskirca/nodeterm/releases)

[Download](#-download) · [Docs](https://nodeterm.dev/docs) · [Features](#-features) · [Build from source](#-build-from-source) · [Architecture](#-architecture) · [Sponsor](#sponsor) · [License](#-license)
---
|
### 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.
|
 |
|
### 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.
|
 |
### 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
|
 |
|
### 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).
|
 |
|
### 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.
|
 |
### 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](./docs/github-issues-kanban.md).
- **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](./docs/SERVER.md).
- **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.
```bash
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`](./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).
```bash
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](./docs/SERVER.md#headless-notification-host)
section for details.
## 📦 Download
Grab the latest build from **[nodeterm.dev](https://nodeterm.dev)** — the download button
detects your platform. Everything is also listed at
[nodeterm.dev/releases](https://nodeterm.dev/releases):
- **macOS** — `.dmg` for Apple Silicon and Intel (auto-updates), or **Homebrew**:
```bash
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-