Releases
Latest release: v0.2.21 · 2026-07-23. These links always point at the newest build.
macOS
- Apple Silicon .dmg (140 MB) — M-series Macs.
- Intel .dmg (144 MB) — Intel Macs.
-
Homebrew:
brew tap nodeterm/tap && brew install --cask nodeterm
Linux (x64)
- AppImage (148 MB) —
portable, auto-updates.
chmod +xand run. - .deb (116 MB) — Debian/Ubuntu. Updates are manual: this page always serves the newest build.
Version history
v0.2.21 2026-07-23
Changes since v0.2.20
- feat: make SSH remote projects free (remove Pro gate)
- fix(handoff): make the resume instruction conditional on a task existing
- fix(handoff): context-budget the transfer file so the target agent survives reading it
- fix(workspace): same-lineage reconcile unions nodes — a phone session survives
- fix(hooks): sessions born on a bare host self-heal once a server appears
- fix(pty): frame injected prompts as bracketed paste so a multiplexer can't swallow the Enter
- fix(canvas): context links work for agents launched by hand in plain terminals
- feat(ssh): context link works in SSH projects
- chore(deps): bump actions/dependency-review-action from 4 to 5
- chore(deps-dev): bump the dev-dependencies group across 1 directory with 10 updates
- docs(hook-server): the sh shim is the only /control/ client now
- feat(ssh): canvas-control skill works in SSH projects
- chore(deps): bump softprops/action-gh-release from 2 to 3
- chore(deps): bump actions/checkout from 4 to 7
- chore(deps): bump actions/setup-node from 4 to 7
- chore(deps): bump github/codeql-action from 3 to 4
- ci: security pipeline — CodeQL, dependency review, Dependabot
- fix(canvas): fit view into the largest chrome-free rectangle
- fix(installer): download Node beside the destination, never /tmp
- fix(installer): provision a private Node when the host's is missing or old
- feat(hooks): endpoint failover — a dead pipe falls back to a live server
- feat(server): headless notification host — one-line install, zero open ports
- fix(ssh): rebuild an adopted orphan master whose hook tunnel is dead
- feat(server): reverse-proxy SSO header trust (#29, Option B)
- feat(canvas): opt-in 'pan' left-drag mode for empty canvas
- fix(canvas): Approve/Deny header buttons hide while a question is asked
- feat(push): granted mode — the Server Edition pushes to SSH-possessed phones
- fix(push): multiSelect rides the question pipeline; state edges are marked
- feat(canvas): the RUNNING badge walks — agent mascots on working nodes
- feat(scm): branch quick-pick lists remote-only branches after fetch
- feat(canvas): bump default terminal node size 600x400 → 640x440
- docs(readme): Linux desktop, opencode, docs links; fix dead CLAUDE.md link
- fix(ci): hermetic opencode plugin test + swallowed post-shutdown usage polls
- fix(inbox): instant state flip on answer + approval cards say WHAT needs approving
nodeterm-0.2.21.AppImage (148 MB) · node-terminal_0.2.21_amd64.deb (116 MB) · nodeterm-0.2.21.dmg (144 MB) · nodeterm-0.2.21-arm64.dmg (140 MB)
v0.2.20 2026-07-21
Changes since v0.2.19
- fix(inbox): AskUserQuestion pickers are questions, not approvals
- feat(push): needsYou live-updates carry kind, question options and pendingId
- feat(scm): branch menu is a type-to-filter quick-pick
- feat(approvals): hook-reply Approve/Deny — the decision IS the hook's answer
- feat(push): question options + Live Activity update stream
- fix(onboarding): consistent Back+Next footer on the notifications step
- feat(terminal): show upload overlay while a dropped file scps to an SSH host
- feat(onboarding): real UI in scenes, sequenced dictation, centered kanban, mobile step
- feat(license): wire the live add-seats Payment Link
- fix(scm): branch menus scroll instead of running past the viewport
- feat(license): new $10 Pro link + separate add-seats checkout URL
- fix(onboarding): platform-aware ⌘⇧C label + SVG check (Linux glyph tofu)
- feat(onboarding): first-run setup tour — info + interaction per step
- feat(telemetry): count every install via /v1/check; telemetry opt-out
- feat(license): Pro includes 3 free team seats; extra seats $5/seat/mo
- ci(release): cask sync moved into the tap's own workflow (org disables deploy keys)
- ci(release): Homebrew cask lives in the official org tap (nodeterm/homebrew-tap)
- ci(release): publish job updates the Homebrew cask (eneskirca/homebrew-tap)
- fix(kanban): color the actor in board-log activity + comment rows (Trello-style)
- feat(kanban): card priority (low/medium/high/urgent) with chips and activity events
- fix(ssh): self-healing mux children + master watchdog — stop the silent per-exec reconnect churn
- ci(release): platform jobs create a prerelease; a publish job promotes to latest only when both succeed
node-terminal_0.2.20_amd64.deb (115 MB) · nodeterm-0.2.20.AppImage (147 MB) · nodeterm-0.2.20-arm64.dmg (139 MB) · nodeterm-0.2.20.dmg (143 MB)
v0.2.19 2026-07-19
Changes since v0.2.18
- test(worktree): drop the chat-node fixture — the chat kind was removed
- feat(kanban): Trello-style card metadata — members, due dates, dated activity feed
- feat(kanban): context-window pill + popover in the card modal header
- fix(kanban): long card titles wrap (2-line clamp) instead of widening the column
- polish(kanban): click opens the card, Trello-style drop highlight, bigger type, motion pass
- feat(push): send the node's display title so alerts lead with it
- chore(chat): sweep the last dead chat references (worktree displacement branch, test comment)
- fix(usage): mount the indicator outside <ReactFlow> so the open popover rises above the sessions sidebar (#20)
- feat(board-log): relay guests read and write the host board with their own identity
- feat(chat)!: drop @anthropic-ai/claude-agent-sdk (−240MB bundled binary per platform)
- feat(chat)!: remove chat driver, IPC surface and SDK types
- feat(speech): center-anchored equalizer bars replace the VU dots in the capsule
- feat(chat)!: remove the SDK chat node — renderer + sticky tombstone
- feat(kanban): header chat icon becomes comments — right flyout on the node, default-open panel toggle in the modal
- feat(settings): Usage section with per-provider toggles; regroup the sidebar (#18)
- feat(speech): recording pill matches the mobile capsule — live VU dots · Dictating… · red pause
- feat(kanban): terminal actions in the card modal — search, dictate, AI-name, markdown view
- feat(push): per-kind selection for mobile push events
- fix(server): usage poll must not gate on connected browsers
- fix(speech): a superseded overlay instance delivers its transcript but never closes the successor (review)
- fix(board-log): clamp comment text (SSH arg-max silent loss, unbounded file growth)
- feat(speech): hold-to-talk — modifier-only chord records while held (v3)
- fix(board-log): IME-safe composer, scoped error note, stable empty-list selector
- feat(board-log): comments & activity panel in the card modal, event emission from the board funnels
- feat(push): notify relay-paired phones over APNs on actionable agent events
- feat(board-log): project-routed append/read/changed across desktop, server and ssh
- feat(usage): add the opencode provider, and generalize cookie storage (#15)
- ci(release): caffeinate the mac build; idempotent asset upload with retries
- feat(board-log): append-only board history core + pure event diff
- feat(usage): add the MiniMax provider, with its cookie stored outside settings.json (#14)
- fix(kanban): modal seed paint uses xterm text transforms; guard the cold-path await
- feat(kanban): live viewer terminal in the card modal
- fix(pty): keep a client's per-connection socket pause when one view leaves
- feat(usage): surface enabled providers in the pill, not just the popover (#12)
- feat(pty): viewer identity — one connection can hold multiple detachable views of a session
- feat(usage): add the Grok and Kimi providers (#11)
- fix(kanban): Esc during a modal rename cancels the edit, not the modal
- feat(kanban): Trello-style card modal shell (scrim/Esc, rename, sticky editing)
node-terminal_0.2.19_amd64.deb (115 MB) · nodeterm-0.2.19.AppImage (147 MB) · nodeterm-0.2.19.dmg (143 MB) · nodeterm-0.2.19-arm64.dmg (139 MB)
v0.2.18 2026-07-19
Changes since v0.2.17
- feat(mobile): feed Usages + Inbox to the companion through the agent-status mirror
- feat(usage): add the Gemini provider (#10)
- feat(usage): generalize to multiple providers and add Codex (#9)
- feat(kanban): per-column + New session menu (agents/terminal/sticky); sticky notes are board cards
- refactor(usage): move the usage service into core so Server Edition serves it (#7)
- feat(usage): read the generic limits[] contract, surfacing scoped model caps (#6)
- feat(kanban): Trello-style tab toggle, board title strip, collapsible cards with meter detail row
- feat(kanban): view toggle moves to the controls cluster; column half-pill on session nodes
nodeterm-0.2.18.AppImage (296 MB) · node-terminal_0.2.18_amd64.deb (229 MB) · nodeterm-0.2.18-arm64.dmg (203 MB) · nodeterm-0.2.18.dmg (208 MB)
v0.2.15 2026-07-18
Changes since v0.2.14
- feat(opencode): question dialog drives NEEDS YOU (blocked) instead of sitting on RUNNING
- fix(speech): a dismissed pill drops the in-flight transcript — nothing lands after cancel (Task 2 review)
- feat(speech): diagnosable smart-whisper load failures (press-to-talk Task 3)
- feat(speech): press-to-talk pill — record on press, insert on stop (press-to-talk Task 2)
- fix(linux): wrap Dictate hint with hintLabel; drop dead blockmap glob
- fix(updater): degrade auto-update to a manual-download link on Linux .deb/.rpm
- fix(kanban): drop malformed kanban from hand-edited files; banners paint above the board
- fix(opencode): dedupe user message.updated — post-idle touch pinned nodes on RUNNING
- fix(kanban): last-column delete is a no-op, not a dead confirm dialog
- style(speech): move isMac below the import block (Task 1 review nit)
- feat(speech): configurable dictation shortcut (press-to-talk Task 1)
- fix(opencode): dead hook exports + missing unix-socket transport killed all statuses
- ci: release-linux job (AppImage + deb to the same GitHub Release)
- fix(linux): keychain version warning is macOS-only
- feat(linux): platform-aware shortcut labels (⌘ → Ctrl off-mac, incl. Server Edition)
- feat(linux): window/taskbar icon from bundled png
- feat(linux): electron-builder AppImage + deb target, dist:linux script
- chore(deps): vite 7 / vitest 4 / electron-vite 5 — fix 6 npm-audit vulnerabilities
- feat(kanban): full-page board toggle (tab bar, palette, cmd-shift-b) over the mounted canvas
- feat(kanban): board UI components (view/column/card) + styles
- feat(kanban): per-project view-mode store + setProjectKanban action
- feat(kanban): pure board transforms + tests
- feat(kanban): kanban board types ride .nodeterm/project.json
- fix(speech): reject unknown model ids in delete() — no path traversal via the authed surface (final review)
- fix(speech): route Pro errors to License, actionable consent message (final review)
- fix(speech): cap takes at 2:30 — an oversized ws frame would drop the whole bridge (final review)
- fix(speech): mac mic usage description + hardened-runtime audio-input entitlement (final review)
- fix(speech): externalize smart-whisper in the server bundle — inlined loader can't find its native binding (final review)
- docs(speech): server-edition dictation notes (desktop-dictation Task 12)
- feat(speech): Settings → Speech — engine, models, language (desktop-dictation Task 11)
- feat(speech): Insert without Enter — sendText gains an enter:false variant (desktop-dictation Task 10b)
- feat(speech): dictation overlay + dock mic + shortcut (desktop-dictation Task 10)
- feat(speech): preload + real ws-bridge speech API (desktop-dictation Task 9)
- fix(speech): adopt the mic stream before context construction — a failed start() must stop its tracks (Task 8 review)
- fix(speech): airtight start() re-entry guard + worklet port teardown (Task 8 review)
- feat(speech): renderer PCM capture via AudioWorklet (desktop-dictation Task 8)
- feat(speech): smart-whisper native dependency (desktop-dictation Task 7)
- fix(speech): reference IPC constants in the speech registrar, not literals (Task 6 review)
- feat(speech): speech IPC surface wired in main + server (desktop-dictation Task 6)
- feat(speech): cloud engine + pinned multipart contract (desktop-dictation Task 5)
- fix(speech): @ts-ignore the optional smart-whisper import — expect-error would break the build once the dep lands (Task 4 review)
- feat(speech): core speech service — pro gate, model lifecycle, FIFO (desktop-dictation Task 4)
- fix(speech): sweep orphaned part files, un-dead delete()'s part cleanup (Task 3 review)
- fix(speech): delete() must not yank a newer download's part file (Task 3 review)
- feat(speech): whisper model store with fenced downloads (desktop-dictation Task 3)
- fix(speech): copy base64 pcm out of the Buffer pool — alignment is not an API guarantee (Task 2 review)
- feat(speech): pcm/wav codecs (desktop-dictation Task 2)
- feat(speech): shared model catalog + speech settings (desktop-dictation Task 1)
node-terminal_0.2.15_amd64.deb (229 MB) · nodeterm-0.2.15.AppImage (296 MB) · nodeterm-0.2.15-arm64.dmg (203 MB) · nodeterm-0.2.15.dmg (208 MB)
v0.2.14 2026-07-17
Changes since v0.2.13
- fix(pty): a failed has-session probe is not a cold start
- fix(canvas): notification click into a closed project reopens its tab first
- feat(agent-status): wire mirror settings providers (local caps/accounts, per-SSH-host)
- feat(agent-status): SSH status push injects per-host settings into each slice
- feat(agent-status): optional settings block (permission mode, accounts) in the mirror
- feat(context-meter): show the session's model name on the header pill
- fix(ssh): verify the reverse hook tunnel end-to-end; start hookServer first
nodeterm-0.2.14.dmg (205 MB) · nodeterm-0.2.14-arm64.dmg (200 MB)
v0.2.13 2026-07-17
Changes since v0.2.12
- fix(remote): jail the phone bridge to every local project root, not the focused tab
nodeterm-0.2.13-arm64.dmg (200 MB) · nodeterm-0.2.13.dmg (205 MB)
v0.2.12 2026-07-17
No release notes.
nodeterm-0.2.12-arm64.dmg (200 MB) · nodeterm-0.2.12.dmg (205 MB)
v0.2.11 2026-07-16
No release notes.
nodeterm-0.2.11-arm64.dmg (200 MB) · nodeterm-0.2.11.dmg (205 MB)
v0.2.10 2026-07-15
No release notes.
nodeterm-0.2.10-arm64.dmg (200 MB) · nodeterm-0.2.10.dmg (205 MB)
Older versions and full details live on GitHub Releases .