[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-95074":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":9,"totalLinesOfCode":9,"stars":12,"forks":13,"watchers":14,"openIssues":14,"contributorsCount":9,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":14,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":15,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":16,"fork":16,"defaultBranch":17,"hasWiki":16,"hasPages":16,"topics":9,"createdAt":9,"pushedAt":9,"updatedAt":18,"readmeContent":19,"aiSummary":20,"trendingCount":14,"starSnapshotCount":14,"syncStatus":21,"lastSyncTime":9,"discoverSource":22},95074,"nodeterm","eneskirca\u002Fnodeterm","eneskirca","Node-based terminal manager for AI coding agents — tmux-backed terminals and parallel agent sessions as draggable nodes on an infinite pan\u002Fzoom canvas. macOS, Linux, and a browser Server Edition.",null,"https:\u002F\u002Fgithub.com\u002Feneskirca\u002Fnodeterm","TypeScript",955,108,0,47.11,false,"main","2026-08-24 04:01:23","\u003Cdiv align=\"center\">\n\n\u003Cimg src=\"docs\u002Fassets\u002Fnodeterm.png\" alt=\"nodeterm\" width=\"120\" height=\"120\" \u002F>\n\n# nodeterm\n\n**A node-based terminal manager — your terminals and agents on an infinite canvas.**\n\nMultiple real terminals live as draggable nodes on a single pan\u002Fzoom canvas, and every\nproject doubles as a **Trello-style board of live Claude Code sessions**. Built for\npeople with ADHD and scattered workflows: a spatial layout instead of a stack of\nhidden tabs.\n\n[![Platform](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatform-macOS%20(arm64%20%2B%20x64)%20·%20Linux%20(x64)-black)](https:\u002F\u002Fnodeterm.dev)\n[![Built with Electron](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fbuilt%20with-Electron-47848F?logo=electron&logoColor=white)](https:\u002F\u002Fwww.electronjs.org\u002F)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-BUSL--1.1-blue)](.\u002FLICENSE)\n[![GitHub stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Feneskirca\u002Fnodeterm?style=flat)](https:\u002F\u002Fgithub.com\u002Feneskirca\u002Fnodeterm\u002Fstargazers)\n[![Latest release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Feneskirca\u002Fnodeterm?include_prereleases&sort=semver)](https:\u002F\u002Fgithub.com\u002Feneskirca\u002Fnodeterm\u002Freleases)\n\u003C!-- Installer downloads: .dmg + .AppImage + .deb across every release, hand-written on purpose.\n     shields' github\u002Fdownloads\u002F…\u002Ftotal reads ~12× higher because electron-updater's own traffic\n     (latest-*.yml polls, mac .zip deltas, blockmaps) is counted as downloads there. Recount with:\n     gh api --paginate repos\u002Feneskirca\u002Fnodeterm\u002Freleases --jq \\\n       '[.[].assets[] | select(.name|test(\"\\\\.(dmg|AppImage|deb)$\")) | .download_count] | add' -->\n[![Downloads](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdownloads-1.2k-brightgreen)](https:\u002F\u002Fgithub.com\u002Feneskirca\u002Fnodeterm\u002Freleases)\n\n[Download](#-download) · [Docs](https:\u002F\u002Fnodeterm.dev\u002Fdocs) · [Features](#-features) · [Build from source](#-build-from-source) · [Architecture](#-architecture) · [License](#-license)\n\n\u003C\u002Fdiv>\n\n---\n\n\u003Cdiv align=\"center\">\n  \u003Ca href=\"docs\u002Fassets\u002Fhero-tour.mp4\">\n    \u003Cimg src=\"docs\u002Fassets\u002Fhero-tour.webp\" alt=\"nodeterm in 30 seconds — canvas, agents, kanban board, three surfaces\" width=\"900\" \u002F>\n  \u003C\u002Fa>\n  \u003Cbr\u002F>\n  \u003Csub>▶ \u003Ca href=\"docs\u002Fassets\u002Fhero-tour.mp4\">Watch the 30-second tour with sound\u003C\u002Fa>\u003C\u002Fsub>\n\u003C\u002Fdiv>\n\n## Why nodeterm\n\nStacked terminal tabs hide context — you lose track of what's running where. nodeterm\nturns that into a **map**: every shell is a node you can place, group, label, and zoom\ninto. Sessions are spatial and persistent, so your mental model stays intact across\nrestarts. And because the app is built around a clean service seam, the same canvas runs\nthree ways — as the **desktop app for macOS and Linux**, as a **self-hosted browser app**\nyou reach from anywhere (Server Edition), and an **iOS companion** that attaches to the\nsame live sessions.\n\n📚 **Full documentation lives at [nodeterm.dev\u002Fdocs](https:\u002F\u002Fnodeterm.dev\u002Fdocs)** — get\nstarted, concepts, agents, remote access, troubleshooting.\n\n## ✨ Features\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"42%\" valign=\"middle\">\n\n### Everything is a node\n\nRight-click the canvas to open a **terminal** — or an AI **agent**. Each runs in its own\npersistent tmux session, next to **sticky notes** (link one to feed an agent context),\n**Monaco editors**, **diff views**, and **web\u002Fvideo** nodes — arranged spatially, like a\nmap. Quit the app, even **restart the machine** — every session comes back.\n\n\u003C\u002Ftd>\n\u003Ctd>\u003Cimg src=\"docs\u002Fassets\u002Fcanvas-tour.webp\" alt=\"The canvas — terminals, agents, notes, editors and diffs as nodes; sessions survive a full restart\" \u002F>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd width=\"42%\" valign=\"middle\">\n\n### Know when an agent needs you\n\nHook-driven status — no output scraping: pulsing **RUNNING \u002F NEEDS YOU** badges,\n**subagent** cards with live transcripts, a per-node **context meter**, and OS\nnotifications. Click the ping, answer the permission prompt right in the node, and get\ntold the moment the turn is **done**. On a MacBook, agents live in the **notch** too.\n\n\u003C\u002Ftd>\n\u003Ctd>\u003Cimg src=\"docs\u002Fassets\u002Fagents-tour.webp\" alt=\"Agent status — NEEDS YOU flip, notification, answering a permission prompt, subagent fan-out\" \u002F>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd width=\"42%\" valign=\"middle\">\n\n### One project, two views\n\nEvery project is a canvas — **and also a kanban board**. Cards *are* your live\nsessions: drag them across columns while the agent keeps running, open a card into a\n**live card modal** (the real session + members, due date, priority, comments), and\nassign teammates. Toggle with `⌘⇧B`.\n\u003Cbr\u002F>\u003Csub>▶ \u003Ca href=\"docs\u002Fassets\u002Fkanban-launch.mp4\">Watch the board video with sound\u003C\u002Fa>\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd>\u003Cimg src=\"docs\u002Fassets\u002Fkanban-launch.webp\" alt=\"The kanban board — live session cards, drag between columns, the card modal with a live Claude Code session\" \u002F>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd width=\"42%\" valign=\"middle\">\n\n### Your sessions, anywhere\n\n**Pair your phone** with one QR — *scan with the nodeterm iOS app* — and the **same\nlive session continues in your pocket**, E2E encrypted **over the relay, not just your\nLAN**. The same canvas also runs self-hosted in any browser (Server Edition).\n\n\u003C\u002Ftd>\n\u003Ctd>\u003Cimg src=\"docs\u002Fassets\u002Fremote-tour.webp\" alt=\"Pair your phone — scan the QR, the same live session continues on the iPhone\" \u002F>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd width=\"42%\" valign=\"middle\">\n\n### Talk to your terminal\n\nHold `⌘⌥` and say it. On-device **Whisper** transcribes locally — review the text,\nthen **Send** (nothing auto-submits). Your voice never leaves the machine.\n\n\u003C\u002Ftd>\n\u003Ctd>\u003Cimg src=\"docs\u002Fassets\u002Fdictation-tour.webp\" alt=\"Dictation — hold cmd-shift-D, speak, review, send into the terminal\" \u002F>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n### Node kinds\n\n🖥 **Terminal** (xterm + tmux, AI naming) · 🤖 **Agent** (Claude Code \u002F Codex \u002F Gemini \u002F\nGitHub Copilot \u002F opencode \u002F Grok \u002F custom) · 📝 **Sticky note** (link to an agent as context) · 🗂 **Group**\n(bind to a **git worktree** for agent-per-branch) · ✏️ **Editor** (Monaco, ⌘S) ·\n🔀 **Diff** · 🌐 **Web \u002F Video**\n\n### More\n\n- **Session continuity (tmux)** — terminals keep running across node remounts *and* full\n  app restarts, including live processes; machine reboots restore scrollback and resume\n  agent sessions (`claude --resume`). The macOS app **ships its own tmux**, so this works\n  with nothing installed; a tmux already on your system is always used in preference to it,\n  and terminals opened before an upgrade stay as they were until you refresh the node.\n- **Talk to your terminal** — on-device Whisper dictation (hold ⌘⌥): speak, review, send.\n- **Agent superpowers** — **context links** so agent nodes read each other's transcripts\n  on demand; Claude-only **branch a conversation** and **managed accounts** for several\n  logged-in Claude identities side by side; agents can drive the canvas (open nodes,\n  spawn teams, verify each other's work) via the built-in canvas-control CLI.\n- **Remote \u002F SSH projects** — open a project on a remote host over SSH; terminals, files,\n  git, and even the board run there while the canvas stays local.\n- **Source control** — VS Code-style stage\u002Funstage, discard, branch switch\u002Fcreate,\n  commit, push\u002Fsync\u002Fpublish, **worktrees**, and `gh` sign-in — backed by system `git`.\n- **GitHub Issues on Kanban** – opt-in issue cards, exact label-to-column mapping,\n  All \u002F GitHub \u002F Sessions filtering, and two-way move, close, and reopen sync. See\n  [setup and security details](.\u002Fdocs\u002Fgithub-issues-kanban.md).\n- **AI commit messages & terminal names** — bring-your-own local agent CLI run read-only\n  on the staged diff or captured output.\n- **Your sessions, in your pocket** — **nodeterm mobile** (iOS) attaches to the same live\n  tmux sessions: watch an agent work, answer a \"needs you\", or type into any terminal\n  from your phone — plus push notifications and a mobile board view.\n- **Power & sleep** — while an agent is working, nodeterm keeps the machine from\n  idle-sleeping, and lets go the moment it finishes (on by default; toggle in the setup\n  tour or Settings → Behavior). No app can hold a machine awake through a closed lid —\n  for overnight runs keep the laptop open and plugged in, or run the agents on a box\n  that doesn't sleep via the [Server Edition](.\u002Fdocs\u002FSERVER.md).\n- **Command palette** (⌘K), **file explorer** (⌘⇧E), **markdown view** (⌘M),\n  **undo\u002Fredo**, and a native macOS dark UI.\n- **Auto-update & in-app announcements** — the app checks a self-hosted feed and\n  surfaces a \"Restart to update\" banner and product news.\n\n### 🌍 Server Edition — nodeterm in your browser\n\nThe same canvas runs headless on a Linux (or macOS) host and is used from any browser —\nso your terminals, editors, source control, board, and agents live on a server you reach\nfrom anywhere. Single-user auth (password + secure cookie), a WebSocket bridge, and the\nexact same renderer as the desktop app.\n\n```bash\nnpm run server:dev     # build + serve; open http:\u002F\u002F127.0.0.1:8443 and set a password\n```\n\nTerminals, files\u002Feditor\u002Fdiff, the full git panel, the kanban board, and agent-status\nbadges all work in the browser today. See [`docs\u002FSERVER.md`](.\u002Fdocs\u002FSERVER.md) for the\nquickstart, security model, and current limitations.\n\n#### 🔔 Get push notifications from any SSH host\n\nThe same server also runs **headless** as a background notification host: install it on any\nLinux box you SSH into, and your phone gets **RUNNING \u002F NEEDS YOU** push + Live-Activity\ncoverage for the agents running there — with **zero open ports** (the hook server stays\nloopback-only and push goes out over HTTPS under a grant your phone drops over SSH).\n\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Feneskirca\u002Fnodeterm\u002Fmain\u002Fscripts\u002Finstall-server.sh | bash\n```\n\nOne line installs, builds, and runs it as a systemd service (`NODETERM_HEADLESS=1`); re-run it\nto update. See the [headless notification host](.\u002Fdocs\u002FSERVER.md#headless-notification-host)\nsection for details.\n\n## 📦 Download\n\nGrab the latest build from **[nodeterm.dev](https:\u002F\u002Fnodeterm.dev)** — the download button\ndetects your platform. Everything is also listed at\n[nodeterm.dev\u002Freleases](https:\u002F\u002Fnodeterm.dev\u002Freleases):\n\n- **macOS** — `.dmg` for Apple Silicon and Intel (auto-updates), or **Homebrew**:\n\n  ```bash\n  brew tap nodeterm\u002Ftap\n  brew trust nodeterm\u002Ftap        # Homebrew ≥6 refuses to load an untrusted tap\n  brew install --cask nodeterm\n  ```\n\n  Both first lines are required. On its own, `brew install --cask nodeterm` only searches\n  `homebrew\u002Fcask` and reports the cask as not found; without the trust grant, Homebrew ≥6\n  fails rather than prompting. The cask tracks each promoted release, and the app updates\n  itself (electron-updater), so `brew upgrade` is rarely needed for it.\n- **Linux (x64)** — self-updating **AppImage**, or a `.deb` for Debian\u002FUbuntu\n  (`sudo apt install .\u002Fnodeterm-*.deb`; updates are manual for `.deb`).\n- **iOS** — **nodeterm mobile** on the\n  [App Store](https:\u002F\u002Fapps.apple.com\u002Fapp\u002Fnodeterm\u002Fid6790581233).\n\n## 🛠 Build from source\n\nRequires Node.js 20+ on macOS or Linux (tmux recommended — it's what makes sessions\nsurvive restarts). A source checkout does **not** carry the bundled tmux: run\n`node scripts\u002Fbuild-tmux.mjs` once on macOS to build it into `resources\u002Fbin\u002Ftmux` (the\nrelease job does this automatically), or just install tmux yourself.\n\n```bash\nnpm install        # deps + rebuilds node-pty against Electron's ABI (postinstall)\nnpm run dev        # dev mode with renderer HMR\nnpm run build      # production build into out\u002F\nnpm start          # preview the production build\nnpm run typecheck  # fastest correctness gate\nnpm test           # vitest unit + integration suite\nnpm run dist       # local UNSIGNED .dmg into dist\u002F (smoke test)\nnpm run dist:linux # AppImage + .deb into dist\u002F (on a Linux host)\nnpm run server:dev # build + run the browser Server Edition (needs Node 22 + tmux)\n```\n\n## ⌨️ Keyboard shortcuts\n\nThese are the defaults — every one of them is remappable in **Settings → Keyboard Shortcuts**.\n\n| Shortcut | Action |\n| --- | --- |\n| `⌘K` | Command palette |\n| `⌘T` \u002F `⌘⇧C` | New terminal \u002F New Claude Code |\n| `⌘⇧B` | Toggle the kanban board |\n| `⌘W` | Close the selected node |\n| `⌘Z` \u002F `⌘⇧Z` | Undo \u002F Redo |\n| `⌘M` | Toggle markdown view (terminal \u002F editor) |\n| Hold `⌘⌥` (`Ctrl+Alt`) | Dictate into the focused terminal |\n| `⌘⇧E` | File explorer |\n| `⌘,` | Settings · `⌘\u002F` Shortcuts |\n| `Right-click` | Actions menu (empty space or node) |\n\n## 🏗 Architecture\n\n- **Electron, three contexts** — `src\u002Fmain` (the Electron shell), `src\u002Fpreload` (the only\n  bridge, `window.nodeTerminal`), `src\u002Frenderer` (React UI). `src\u002Fshared` holds the types\n  and IPC channel names used by all three.\n- **`CorePlatform` seam** — every service (PTY, workspace\u002Fsettings, git, agents, hooks) lives\n  in `src\u002Fcore` behind a small platform interface and never imports `electron`. Electron is\n  one implementation of that seam; the browser Server Edition (`src\u002Fserver`) is another,\n  booting the exact same services over a WebSocket-RPC bridge (`src\u002Frenderer\u002Fbridge` fills\n  `window.nodeTerminal` in the browser). One codebase, one renderer, multiple shells.\n- **`TerminalTransport` abstraction** — the renderer depends only on this interface, never on\n  IPC or node-pty directly. `LocalTransport` talks to the local host; `RemoteTransport` talks\n  to a remote agent over SSH — so remote projects drop in without touching the canvas UI.\n- **React Flow is the single source of truth** for live nodes; projects persist serialized\n  nodes to disk, and tmux keeps sessions alive across restarts.\n- **Three surfaces** — the desktop app, the browser **Server Edition**, and the\n  **mobile companion** (a separate SwiftUI repo) all ride the same core + transport seams.\n\nSee [`docs\u002FSERVER.md`](.\u002Fdocs\u002FSERVER.md) for the Server Edition, and the design docs\nunder [`docs\u002F`](.\u002Fdocs) for deeper notes.\n\n## 🤝 Contributing\n\nIssues and pull requests are welcome. **Start with [CONTRIBUTING.md](.\u002FCONTRIBUTING.md)** —\nsetup, the process-boundary rules, and the house rules that come up in review.\n[CLAUDE.md](.\u002FCLAUDE.md) is the deep reference behind them (and is loaded automatically if\nyou work with an AI coding agent). Questions or bug reports are also happy at\n[nodeterm.dev\u002Fsupport](https:\u002F\u002Fnodeterm.dev\u002Fsupport) \u002F support@nodeterm.dev. nodeterm is licensed under the\n[Business Source License 1.1](https:\u002F\u002Fmariadb.com\u002Fbsl11\u002F) — you can use, modify,\nand redistribute it freely, including in production, except offering it as a\ncompeting product or service (see [License](#-license)).\n\nBy submitting a contribution (pull request, patch, or code snippet), you agree\nthat it is licensed under the same [BUSL-1.1](.\u002FLICENSE) terms as the rest of\nthe project, and that the project may continue to relicense future versions\n(including your contribution) as part of its normal licensing model.\n\n## 📜 License\n\n**[BUSL-1.1](.\u002FLICENSE)** ([Business Source License](https:\u002F\u002Fmariadb.com\u002Fbsl11\u002F)): you may\ncopy, modify, redistribute, and — under the Additional Use Grant — make **production\nuse** of nodeterm; the one thing you may not do is offer it (hosted, embedded, or as a\nstandalone product\u002Fservice) in a way that **competes** with nodeterm or with the\nLicensor's products built on it. Each release automatically becomes plain **MIT** four\nyears after it is published. See [`LICENSE`](.\u002FLICENSE) for the full terms and\n[`THIRD-PARTY-NOTICES.md`](.\u002FTHIRD-PARTY-NOTICES.md) for the bundled open-source\ncomponents. For a commercial license beyond the grant, contact eneskirca@gmail.com.\n\n> \"Claude\" and \"Claude Code\" are trademarks of Anthropic, and \"Trello\" is a trademark of\n> Atlassian; nodeterm is not affiliated with or endorsed by either.\n","nodeterm 是一款基于节点的终端管理工具，将 tmux 驱动的真实终端与 AI 编程代理会话（如 Claude Code）以可拖拽、可缩放的节点形式呈现在无限画布上。核心功能包括空间化终端布局、多会话并行管理、Trello 风格的代理任务看板，以及跨平台支持（macOS\u002FLinux 桌面端 + 浏览器 Server Edition）。采用 Electron 构建，强调上下文可见性与工作流持久性，特别适合需同时处理多个开发任务、AI 编程代理协作或存在注意力分散需求的开发者与技术研究员。",2,"trending"]