{"adoption": {"forks": 131, "observed_at": "2026-08-28T04:04:22.175388+00:00", "stars": 1327}, "canonical_url": "https://ross.abutalabs.com/products/nodeterm", "card": {"archived": false, "artifact_type": "application", "description": "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.", "domain": ["developer-tools"], "enriched": true, "function": ["terminal-ui", "agent-framework", "developer-tools", "gui"], "health_score": 100, "homepage": "https://nodeterm.dev", "language": "TypeScript", "license": "NOASSERTION", "license_family": "other", "maturity": "active", "member_repos": ["eneskirca/nodeterm"], "name": "eneskirca/nodeterm", "platform": ["browser"], "pushed_at": "2026-08-25T22:47:32+00:00", "repo": "eneskirca/nodeterm", "stars": 1327, "tags": ["tmux", "terminal-multiplexer", "infinite-canvas", "claude-code", "codex", "gemini", "parallel-agents", "kanban", "workspace-manager", "adhd-friendly", "ai-agents", "command-line", "automation", "macos", "linux", "electron", "ios"], "topics": ["adhd", "ai-agents", "canvas", "claude-code", "codex", "developer-tools", "electron", "linux", "macos", "terminal", "terminal-emulator", "tmux", "agent-orchestration", "coding-agents", "gemini", "multiplexer", "opencode", "parallel-agents", "terminal-multiplexer", "workspace-manager"], "urls": [], "use_cases": ["manage multiple terminal sessions visually on a canvas", "run several AI coding agents in parallel and monitor their status", "keep terminal sessions alive across app restarts and reboots", "orchestrate Claude Code, Codex, and Gemini sessions spatially", "organize agent work with a Trello-style kanban board per project", "access live terminal sessions remotely from a browser or iOS", "wire agents together so one can read another's context"], "what_it_is": "nodeterm is an Electron-based terminal manager that presents tmux-backed terminals and AI coding agent sessions (Claude Code, Codex, Gemini, opencode) as draggable nodes on an infinite pan/zoom canvas. It supports a macOS/Linux desktop app, a self-hosted browser Server Edition, and an iOS companion, with persistent sessions that survive restarts.", "when_to_avoid": ["you need a lightweight CLI-only terminal multiplexer without a GUI", "you require a fully permissive open-source license (it uses BUSL-1.1)", "you only work on Windows (not yet supported)", "you prefer traditional tab-based terminal emulators"], "when_to_choose": ["you run many terminals or AI agents at once and lose track in stacked tabs", "you want tmux-backed sessions that persist across restarts", "you think spatially and want a canvas-based workspace for agents", "you need remote access to live agent sessions from browser or phone"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/nodeterm", "repo": "eneskirca/nodeterm", "role": "main", "score": 80}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:22.175388+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:46:16.839289+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "739c9ec2e37d2ef931f4c25b22130bf184453a5ecad2674745a94ff9474786d3", "fetched_at": "2026-08-28T04:04:22.175388+00:00", "kind": "readme", "missing": false, "url": "https://github.com/eneskirca/nodeterm"}, {"content_hash": "738a8da70e688928ca7729eb37b03d57bdaeb2e3adbf3e429bd00b91b761e12b", "fetched_at": "2026-08-29T12:05:25.049605+00:00", "kind": "homepage", "missing": false, "url": "https://nodeterm.dev"}, {"content_hash": "59a3a89a337484395d7373c2bd40ca2afea9c86674badf09fedbb52574b6411b", "fetched_at": "2026-08-29T12:05:25.053068+00:00", "kind": "site_page", "missing": false, "url": "https://nodeterm.dev/docs"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:22.175388+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:46:16.839289+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "739c9ec2e37d2ef931f4c25b22130bf184453a5ecad2674745a94ff9474786d3", "fetched_at": "2026-08-28T04:04:22.175388+00:00", "kind": "readme", "missing": false, "url": "https://github.com/eneskirca/nodeterm"}, {"content_hash": "738a8da70e688928ca7729eb37b03d57bdaeb2e3adbf3e429bd00b91b761e12b", "fetched_at": "2026-08-29T12:05:25.049605+00:00", "kind": "homepage", "missing": false, "url": "https://nodeterm.dev"}, {"content_hash": "59a3a89a337484395d7373c2bd40ca2afea9c86674badf09fedbb52574b6411b", "fetched_at": "2026-08-29T12:05:25.053068+00:00", "kind": "site_page", "missing": false, "url": "https://nodeterm.dev/docs"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:46:16.839289+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "739c9ec2e37d2ef931f4c25b22130bf184453a5ecad2674745a94ff9474786d3", "fetched_at": "2026-08-28T04:04:22.175388+00:00", "kind": "readme", "missing": false, "url": "https://github.com/eneskirca/nodeterm"}, {"content_hash": "738a8da70e688928ca7729eb37b03d57bdaeb2e3adbf3e429bd00b91b761e12b", "fetched_at": "2026-08-29T12:05:25.049605+00:00", "kind": "homepage", "missing": false, "url": "https://nodeterm.dev"}, {"content_hash": "59a3a89a337484395d7373c2bd40ca2afea9c86674badf09fedbb52574b6411b", "fetched_at": "2026-08-29T12:05:25.053068+00:00", "kind": "site_page", "missing": false, "url": "https://nodeterm.dev/docs"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:04:22.175388+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:22.175388+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:22.175388+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:46:16.839289+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "739c9ec2e37d2ef931f4c25b22130bf184453a5ecad2674745a94ff9474786d3", "fetched_at": "2026-08-28T04:04:22.175388+00:00", "kind": "readme", "missing": false, "url": "https://github.com/eneskirca/nodeterm"}, {"content_hash": "738a8da70e688928ca7729eb37b03d57bdaeb2e3adbf3e429bd00b91b761e12b", "fetched_at": "2026-08-29T12:05:25.049605+00:00", "kind": "homepage", "missing": false, "url": "https://nodeterm.dev"}, {"content_hash": "59a3a89a337484395d7373c2bd40ca2afea9c86674badf09fedbb52574b6411b", "fetched_at": "2026-08-29T12:05:25.053068+00:00", "kind": "site_page", "missing": false, "url": "https://nodeterm.dev/docs"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:22.175388+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:22.175388+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:46:16.839289+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "739c9ec2e37d2ef931f4c25b22130bf184453a5ecad2674745a94ff9474786d3", "fetched_at": "2026-08-28T04:04:22.175388+00:00", "kind": "readme", "missing": false, "url": "https://github.com/eneskirca/nodeterm"}, {"content_hash": "738a8da70e688928ca7729eb37b03d57bdaeb2e3adbf3e429bd00b91b761e12b", "fetched_at": "2026-08-29T12:05:25.049605+00:00", "kind": "homepage", "missing": false, "url": "https://nodeterm.dev"}, {"content_hash": "59a3a89a337484395d7373c2bd40ca2afea9c86674badf09fedbb52574b6411b", "fetched_at": "2026-08-29T12:05:25.053068+00:00", "kind": "site_page", "missing": false, "url": "https://nodeterm.dev/docs"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:22.175388+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:22.175388+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:22.175388+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:46:16.839289+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "739c9ec2e37d2ef931f4c25b22130bf184453a5ecad2674745a94ff9474786d3", "fetched_at": "2026-08-28T04:04:22.175388+00:00", "kind": "readme", "missing": false, "url": "https://github.com/eneskirca/nodeterm"}, {"content_hash": "738a8da70e688928ca7729eb37b03d57bdaeb2e3adbf3e429bd00b91b761e12b", "fetched_at": "2026-08-29T12:05:25.049605+00:00", "kind": "homepage", "missing": false, "url": "https://nodeterm.dev"}, {"content_hash": "59a3a89a337484395d7373c2bd40ca2afea9c86674badf09fedbb52574b6411b", "fetched_at": "2026-08-29T12:05:25.053068+00:00", "kind": "site_page", "missing": false, "url": "https://nodeterm.dev/docs"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:22.175388+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:22.175388+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:46:16.839289+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "739c9ec2e37d2ef931f4c25b22130bf184453a5ecad2674745a94ff9474786d3", "fetched_at": "2026-08-28T04:04:22.175388+00:00", "kind": "readme", "missing": false, "url": "https://github.com/eneskirca/nodeterm"}, {"content_hash": "738a8da70e688928ca7729eb37b03d57bdaeb2e3adbf3e429bd00b91b761e12b", "fetched_at": "2026-08-29T12:05:25.049605+00:00", "kind": "homepage", "missing": false, "url": "https://nodeterm.dev"}, {"content_hash": "59a3a89a337484395d7373c2bd40ca2afea9c86674badf09fedbb52574b6411b", "fetched_at": "2026-08-29T12:05:25.053068+00:00", "kind": "site_page", "missing": false, "url": "https://nodeterm.dev/docs"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:46:16.839289+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "739c9ec2e37d2ef931f4c25b22130bf184453a5ecad2674745a94ff9474786d3", "fetched_at": "2026-08-28T04:04:22.175388+00:00", "kind": "readme", "missing": false, "url": "https://github.com/eneskirca/nodeterm"}, {"content_hash": "738a8da70e688928ca7729eb37b03d57bdaeb2e3adbf3e429bd00b91b761e12b", "fetched_at": "2026-08-29T12:05:25.049605+00:00", "kind": "homepage", "missing": false, "url": "https://nodeterm.dev"}, {"content_hash": "59a3a89a337484395d7373c2bd40ca2afea9c86674badf09fedbb52574b6411b", "fetched_at": "2026-08-29T12:05:25.053068+00:00", "kind": "site_page", "missing": false, "url": "https://nodeterm.dev/docs"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:46:16.839289+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "739c9ec2e37d2ef931f4c25b22130bf184453a5ecad2674745a94ff9474786d3", "fetched_at": "2026-08-28T04:04:22.175388+00:00", "kind": "readme", "missing": false, "url": "https://github.com/eneskirca/nodeterm"}, {"content_hash": "738a8da70e688928ca7729eb37b03d57bdaeb2e3adbf3e429bd00b91b761e12b", "fetched_at": "2026-08-29T12:05:25.049605+00:00", "kind": "homepage", "missing": false, "url": "https://nodeterm.dev"}, {"content_hash": "59a3a89a337484395d7373c2bd40ca2afea9c86674badf09fedbb52574b6411b", "fetched_at": "2026-08-29T12:05:25.053068+00:00", "kind": "site_page", "missing": false, "url": "https://nodeterm.dev/docs"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:46:16.839289+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "739c9ec2e37d2ef931f4c25b22130bf184453a5ecad2674745a94ff9474786d3", "fetched_at": "2026-08-28T04:04:22.175388+00:00", "kind": "readme", "missing": false, "url": "https://github.com/eneskirca/nodeterm"}, {"content_hash": "738a8da70e688928ca7729eb37b03d57bdaeb2e3adbf3e429bd00b91b761e12b", "fetched_at": "2026-08-29T12:05:25.049605+00:00", "kind": "homepage", "missing": false, "url": "https://nodeterm.dev"}, {"content_hash": "59a3a89a337484395d7373c2bd40ca2afea9c86674badf09fedbb52574b6411b", "fetched_at": "2026-08-29T12:05:25.053068+00:00", "kind": "site_page", "missing": false, "url": "https://nodeterm.dev/docs"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 5, "rhythm": 98}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["young", "no_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 79, "days_push": 8, "days_rel": 16, "gap_med": 0, "n_releases_24m": 46}, "score": 80, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}