𦦠ADHDev β Agent Dashboard Hub. Monitor & control AI coding agents from a single dashboard. Self-hosted, open-source.
See the codeThe control plane for your coding agents: every agent on every machine in one view, one shared task queue, and only work that passes your tests reaches main.
AI coding agents have become long-running background workers. ADHDev is the control plane for them: launch, watch, approve, and steer agent sessions from a web or mobile dashboard β Claude Code, Codex, Kimi, Cursor CLI, Antigravity CLI side by side, across every machine you own β and hand off convergence to an unattended pipeline that merges finished work into main.
Parallel agents without the collisions. Every task runs in its own git worktree; the Refinery gates, verifies, and rebases finished work onto main, merging only if main hasn't moved β no merge-day hangover.
Website: adhf.dev Β· Docs: docs.adhf.dev
Try it in one command: npx @adhdev/daemon-standalone, then open http://localhost:3847.
The loop: describe a task in chat β the coordinator files it, tags it, queues it β an idle machine claims it into a fresh worktree β your repo's own gates decide β rebased onto main and merged only if main hasn't moved, worktree gone. Your phone only buzzed if something needed approving.
ADHDev is built that way. In the private monorepo where ADHDev is developed β this engine is published from it as a submodule β roughly one in six main commits is an Auto-merge via Refinery commit: work that an agent finished, the repo's own gates approved, and Refinery landed without a human running git merge. That history lives in the upstream monorepo, so this public mirror's own log won't show those merge commits.
(A single-machine mesh runs fully local; spreading it across machines needs the cloud edition.) Enqueue tasks with dependencies and let a coordinator dispatch them to whichever node has spare capacity β your laptop, a desktop, a build box. This is genuine multi-machine orchestration over a P2P mesh, not SSH into one host. Each task runs in its own worktree so agents never step on each other. The mesh and Refinery engine ships in this repo; cross-machine dispatch runs on the cloud edition.
A mesh is bound to one git repository and owns the moving parts you'd otherwise coordinate by hand:
| Task queue | Pull-based. pending β assigned β completed/failed, with depends_on ordering and retries. Idle nodes claim work themselves β no push scheduler to get out of sync. |
| Missions | A goal that groups many tasks, so a restarted coordinator picks up where the last one left off instead of re-queuing everything. |
| Worktree nodes | An isolated branch checkout per parallel task, bootstrapped automatically (install, native rebuilds, gitignored build outputs) before any work is dispatched to it. |
| Append-only ledger | Every dispatch, completion, failure, stall, and checkpoint as an append-only record in the mesh's local SQLite store β the audit trail that makes "what actually happened" answerable after the fact. |
| Operating notes | Lessons recorded at runtime (a provider quirk, a recovery procedure) are injected into every future coordinator prompt, so knowledge outlives the session that learned it. |
| Live-state prompt | The coordinator's system prompt isn't static text β at launch it's a render of live mesh state (node health, active mission, recent failures, accumulated notes), and at runtime events are injected into its session instead of it polling. |
| Difficulty + quota routing | Tag a task easy / medium / difficult and the node slot for that grade (provider, model, thinking level, parallel cap) takes it, so routine work runs on cheap models and only hard tasks reach for expensive ones. Each machine also reads the remaining 5-hour and weekly window of every CLI subscription: a plan that is nearly out is skipped (the task waits or falls through to the node's next provider), and among the rest, quota that would expire unused at the next reset is spent first. You can see the routing forecast per difficulty in the dashboard before anything runs. |
| Task chaining | Chain tasks with depends_on: a dependent waits until its predecessors complete, then receives their completion summaries as an "Upstream results" appendix. A failed or cancelled predecessor holds (or, by mesh policy, cancels) the downstream chain and notifies the coordinator. mesh_enqueue_batch enqueues several already-confirmed tasks in one atomic call. |
Every machine reads how much of each CLI subscription's 5-hour and weekly window is left. When a task is claimed, a plan that is nearly out is skipped (the task waits or falls through to that machine's next CLI), and among the rest, quota that would expire unused at the next reset is spent first. The Machines page shows the whole fleet on one grid, and the mesh's Tasks tab forecasts which slot takes the next task at each difficulty before anything runs.
mainParallelism only pays off if the work actually merges. The Refinery converges finished tasks with per-repo validation gates, patch-equivalence checks, submodule-aware rebase-and-merge (only if main hasn't moved), and automatic worktree cleanup β unattended. Agents finish; the Refinery lands them. The mesh board above surfaces the pipeline live: tasks moving through the queue, refine jobs while convergence is in flight, and every dispatch, completion, and stall in the activity feed.
Parallel worktrees and unattended merges get fragile the moment git submodules enter the picture. ADHDev handles that case head-on β this very project is a submodule monorepo (a root repo plus the AGPL engine and provider catalog as submodules), and we dogfood the mesh and Refinery on it every day. The Refinery treats submodules as first-class during convergence:
main, it verifies the referenced submodule commits are reachable from the submodule's origin/main; if not, the task is held as blocked until those commits are published.You talk to one place. The coordinator orchestrates every worker and machine asynchronously β it waits on events, you don't. No session babysitting. Instead of sitting in front of each agent window watching for it to finish, you hand work to a single coordinator that drives all the workers in parallel and reacts only when a completion, approval, or status event actually arrives β no polling, no blocking waits. One conversation for you; a non-blocking event loop underneath.
Your agents run locally; you watch and drive them from any browser. The dashboard is a real control surface β inspect active sessions, read chat and terminal state, approve or interrupt work, reopen the right history, and send the next instruction from a browser or your phone. No terminal babysitting. Approval pushes carry the start of the command itself, because approving rm -rf build/ and approving git push --force deserve different reaction times: the push arrives β tap it β approve in one tap (push-to-phone ships with the cloud edition).
|
|
For a read-only investigation that matters β a bug RCA, a design review, an audit β ask the coordinator for a second opinion: it sends the same question to 2β3 workers on different providers, waits for their reports, and lays out where they agree, where they disagree, and which claims only one of them made. High agreement is not the same as being right β the same model with the same context repeats the same mistake β so the disagreements are the part worth reading.
Chat, commands, screenshots, and remote input travel over an encrypted WebRTC data channel directly between your dashboard and your daemon. The server handles sign-in, signaling and lightweight metadata, plus one deliberate exception: on the cloud edition it receives the approval prompt (the command and button labels) to build the push notification, and the push shows up to 80 characters of it. Chat, terminal output and your code don't sit on someone else's box. It's a trust property of the design, not an upsell.
main.ADHDev doesn't replace your agents or spawn its own β it attaches to the ones already installed on your machine and gives them a control surface.
browser / phone
β chat, commands, screenshots, remote input
βΌ
βββββββββββββββββ PTY ββββββββββββββββββββββββ
β daemon ββββββββββββββββββββββΆβ Claude Code, Codex, β
β (your machine)βββββββββββββββββββββββ Cursor CLI, β¦ β
β β CDP ββββββββββββββββββββββββ€
β Β· providers ββββββββββββββββββββββΆβ Cursor, VS Code, β
β Β· sessions β β Antigravity, β¦ β
β Β· mesh/queue β ββββββββββββββββββββββββ
β Β· Refinery β
βββββββββββββββββ
β
βββ git worktrees ββ one isolated checkout per parallel task
cli (PTY), ide (Chrome DevTools Protocol), extension (CDP webview).adhdev-sessiond owns the PTYs, so your CLI sessions survive a daemon restart or upgrade.localhost:3847. In the cloud edition the same data rides a WebRTC data channel browserβdaemon, with the server only doing signaling.mesh_enqueue_task β SQLite queue (pending)
β an idle node claims it (assigned)
β worker agent runs in its own git worktree
β completed / failed β append-only ledger
β Refinery: repo's own gates β patch equivalence β rebase β merge (main unchanged) β cleanup
Four properties that shape everything else:
report_completion call, not a screen-scrape. You wait on events; you don't ask for status in a loop.Deeper: Repo Mesh developer guide Β· session-host
Requirements: Node.js 20 or newer (22 LTS recommended; on Windows use 22.x β see the note below), git, and at least one coding agent already installed and authenticated β ADHDev drives the CLIs you already use.
Recommended β the adhdev CLI:
npm install -g adhdev
adhdev standalone
Open http://localhost:3847.
Self-host directly with the standalone package:
npm install -g @adhdev/daemon-standalone
adhdev-standalone
Everything runs on your machine as a local daemon with an embedded dashboard β no cloud account required for the standalone path. Both packages install an adhdev command, so install one or the other, not both.
Cloud edition (several machines, push notifications):
curl -fsSL https://adhf.dev/install | sh # macOS / Linux
irm https://adhf.dev/install.ps1 | iex # Windows (PowerShell)
adhdev setup # sign in, then open https://adhf.dev
Useful flags:
adhdev standalone --host 0.0.0.0 # allow other devices on the same LAN
adhdev standalone --port 8080 # custom port
adhdev standalone --token mysecret # token auth for scripts / operator access
adhdev standalone --no-open # don't auto-open the browser
adhdev standalone --dev # enable the DevServer API (:19280) to debug and test providers
adhdev-standalone --public <dir> # (standalone package) serve a custom web dashboard build
Standalone stays localhost-only by default. If you bind to 0.0.0.0 for LAN access, the dashboard warns when neither token auth nor a dashboard password is configured.
Windows note: Windows + Node.js 24+ is currently blocked for normal startup/install paths. Use Node.js 22.x, or the PowerShell installer:
irm https://adhf.dev/install.ps1 | iex(docs).
Canonical self-hosted docs:
adhdev standalone, then open http://localhost:3847. The dashboard detects which agents are installed on this machine./mesh, create a mesh bound to your repo, and clone a worktree node. Queue a task to it and watch the ledger: dispatch β completion β Refinery β rebase and merge into main. This all works self-hosted; only crossing to a second machine needs the cloud edition.Stuck? The self-hosted setup guide covers ports, LAN exposure, and provider detection problems.
ADHDev talks to coding agents through three provider categories β ide (CDP), extension (CDP webview), and cli (PTY).
CLI agents (PTY-driven, launched and controlled from the dashboard):
| Agent | Provider |
|---|---|
| Claude Code | cli/claude-cli |
| Codex CLI | cli/codex-cli |
| Cursor Agent | cli/cursor-cli |
| Google Antigravity CLI | cli/antigravity-cli |
| Grok CLI | cli/grok-cli |
| Kimi Code | cli/kimi |
| Opencode | cli/opencode |
IDEs (via Chrome DevTools Protocol): Cursor, Google Antigravity, VS Code, VSCodium, Kiro, Windsurf, Trae, PearAI.
IDE extensions (CDP webview): Claude Code (VS Code), Codex, Cline, Roo Code.
Built-in β verified. ADHDev ships a broad inventory; presence in the catalog means the integration exists, not that every one has been validated end-to-end. Support levels vary. See the live policy:
ADHDev does not manage API keys for your agents β each tool handles its own auth. ADHDev detects install status and surfaces errors.
Providers are data, not code you have to fork. A provider is a versioned manifest (provider.v1.json) plus scripts describing how to detect the tool, launch it, parse its output into chat turns, and recognise its approval prompts. Drop one in ~/.adhdev/providers/ and the dashboard picks it up β your override wins over the built-in of the same name, so you can fix a broken parser locally without waiting for a release.
If you get an agent working that isn't in the catalog, that's the most useful contribution you can make β open it against vilmire/adhdev-providers. Core pull requests here require signing the CLA (the bot prompts you).
This is the open-source, self-hosted edition (AGPL-3.0). Hosted cloud operations are not part of this repository. Self-hosted is built around three local layers:
daemon-standalone exposes a local HTTP/WebSocket server and serves the web UI.daemon-core manages IDE, CLI, and extension integrations.session-host-daemon (adhdev-sessiond) owns long-lived PTY runtimes so CLI sessions survive daemon restarts.| Path | Purpose |
|---|---|
packages/daemon-core | Shared engine: providers, CDP, command routing, session/runtime state |
packages/daemon-standalone | Local HTTP/WS server and bundled standalone UI |
packages/web-core | Shared React pages, components, hooks, and transport abstractions |
packages/web-standalone | Standalone dashboard app |
packages/session-host-core | Session-host protocol, client, registry, ring buffer, labels |
packages/session-host-daemon | Long-lived PTY runtime owner process |
packages/terminal-mux-* | Local terminal mux stack |
packages/terminal-render-web | Browser-side terminal rendering support |
packages/ghostty-vt-node | Ghostty VT bindings used by runtime/mux layers |
GET /api/v1/status β sessions[] array is the source of truthPOST /api/v1/commandGET /api/v1/runtime/:sessionId/snapshotGET /api/v1/runtime/:sessionId/eventsGET /api/v1/mux/:workspace/statePOST /api/v1/mux/:workspace/controlws://localhost:3847/wsReference: Self-hosted API docs
git clone https://github.com/vilmire/adhdev.git
cd adhdev
npm install
npm run build
npm run dev
Useful workspace scripts:
npm run dev:daemon
npm run dev:web
The engine is open source. What the cloud adds is a reach layer: accounts, more than one machine, internet-wide remote access, and push.
| OSS (self-hosted) | Cloud (adhf.dev) | |
|---|---|---|
| Dashboard | localhost:3847 | adhf.dev, any browser or phone |
| Account required | β no auth | OAuth (GitHub / Google) |
| Machines | 1 | 1 / 2 / 5 by plan |
| Reach | localhost, or your LAN with --host | anywhere (P2P WebRTC + TURN for locked-down networks) |
| Every provider (CLI / IDE / extension) | β | β |
| Repo Mesh, Refinery, worktree nodes | β single-machine mesh runs fully local | β |
| Mesh across machines | β (no cross-machine relay) | β |
| Push notifications (approval / completion / error) | β | β |
| Hosted REST API + API keys | β (local API only) | β |
| Price | free, no quotas | Free / Pro / Ultra |
If you only drive one machine and stay on your own network, self-hosted gives you everything except push notifications and the cross-machine mesh β no quotas. The cloud exists for the moment you add a second machine or want to reach your agents from outside the house.
AGPL-3.0-or-later. See LICENSE.
𦦠ADHDev β Agent Dashboard Hub. Monitor & control AI coding agents from a single dashboard. Self-hosted, open-source.
See the codeThe control plane for your coding agents: every agent on every machine in one view, one shared task queue, and only work that passes your tests reaches main.
AI coding agents have become long-running background workers. ADHDev is the control plane for them: launch, watch, approve, and steer agent sessions from a web or mobile dashboard β Claude Code, Codex, Kimi, Cursor CLI, Antigravity CLI side by side, across every machine you own β and hand off convergence to an unattended pipeline that merges finished work into main.
Parallel agents without the collisions. Every task runs in its own git worktree; the Refinery gates, verifies, and rebases finished work onto main, merging only if main hasn't moved β no merge-day hangover.
Website: adhf.dev Β· Docs: docs.adhf.dev
Try it in one command: npx @adhdev/daemon-standalone, then open http://localhost:3847.
The loop: describe a task in chat β the coordinator files it, tags it, queues it β an idle machine claims it into a fresh worktree β your repo's own gates decide β rebased onto main and merged only if main hasn't moved, worktree gone. Your phone only buzzed if something needed approving.
ADHDev is built that way. In the private monorepo where ADHDev is developed β this engine is published from it as a submodule β roughly one in six main commits is an Auto-merge via Refinery commit: work that an agent finished, the repo's own gates approved, and Refinery landed without a human running git merge. That history lives in the upstream monorepo, so this public mirror's own log won't show those merge commits.
(A single-machine mesh runs fully local; spreading it across machines needs the cloud edition.) Enqueue tasks with dependencies and let a coordinator dispatch them to whichever node has spare capacity β your laptop, a desktop, a build box. This is genuine multi-machine orchestration over a P2P mesh, not SSH into one host. Each task runs in its own worktree so agents never step on each other. The mesh and Refinery engine ships in this repo; cross-machine dispatch runs on the cloud edition.
A mesh is bound to one git repository and owns the moving parts you'd otherwise coordinate by hand:
| Task queue | Pull-based. pending β assigned β completed/failed, with depends_on ordering and retries. Idle nodes claim work themselves β no push scheduler to get out of sync. |
| Missions | A goal that groups many tasks, so a restarted coordinator picks up where the last one left off instead of re-queuing everything. |
| Worktree nodes | An isolated branch checkout per parallel task, bootstrapped automatically (install, native rebuilds, gitignored build outputs) before any work is dispatched to it. |
| Append-only ledger | Every dispatch, completion, failure, stall, and checkpoint as an append-only record in the mesh's local SQLite store β the audit trail that makes "what actually happened" answerable after the fact. |
| Operating notes | Lessons recorded at runtime (a provider quirk, a recovery procedure) are injected into every future coordinator prompt, so knowledge outlives the session that learned it. |
| Live-state prompt | The coordinator's system prompt isn't static text β at launch it's a render of live mesh state (node health, active mission, recent failures, accumulated notes), and at runtime events are injected into its session instead of it polling. |
| Difficulty + quota routing | Tag a task easy / medium / difficult and the node slot for that grade (provider, model, thinking level, parallel cap) takes it, so routine work runs on cheap models and only hard tasks reach for expensive ones. Each machine also reads the remaining 5-hour and weekly window of every CLI subscription: a plan that is nearly out is skipped (the task waits or falls through to the node's next provider), and among the rest, quota that would expire unused at the next reset is spent first. You can see the routing forecast per difficulty in the dashboard before anything runs. |
| Task chaining | Chain tasks with depends_on: a dependent waits until its predecessors complete, then receives their completion summaries as an "Upstream results" appendix. A failed or cancelled predecessor holds (or, by mesh policy, cancels) the downstream chain and notifies the coordinator. mesh_enqueue_batch enqueues several already-confirmed tasks in one atomic call. |
Every machine reads how much of each CLI subscription's 5-hour and weekly window is left. When a task is claimed, a plan that is nearly out is skipped (the task waits or falls through to that machine's next CLI), and among the rest, quota that would expire unused at the next reset is spent first. The Machines page shows the whole fleet on one grid, and the mesh's Tasks tab forecasts which slot takes the next task at each difficulty before anything runs.
mainParallelism only pays off if the work actually merges. The Refinery converges finished tasks with per-repo validation gates, patch-equivalence checks, submodule-aware rebase-and-merge (only if main hasn't moved), and automatic worktree cleanup β unattended. Agents finish; the Refinery lands them. The mesh board above surfaces the pipeline live: tasks moving through the queue, refine jobs while convergence is in flight, and every dispatch, completion, and stall in the activity feed.
Parallel worktrees and unattended merges get fragile the moment git submodules enter the picture. ADHDev handles that case head-on β this very project is a submodule monorepo (a root repo plus the AGPL engine and provider catalog as submodules), and we dogfood the mesh and Refinery on it every day. The Refinery treats submodules as first-class during convergence:
main, it verifies the referenced submodule commits are reachable from the submodule's origin/main; if not, the task is held as blocked until those commits are published.You talk to one place. The coordinator orchestrates every worker and machine asynchronously β it waits on events, you don't. No session babysitting. Instead of sitting in front of each agent window watching for it to finish, you hand work to a single coordinator that drives all the workers in parallel and reacts only when a completion, approval, or status event actually arrives β no polling, no blocking waits. One conversation for you; a non-blocking event loop underneath.
Your agents run locally; you watch and drive them from any browser. The dashboard is a real control surface β inspect active sessions, read chat and terminal state, approve or interrupt work, reopen the right history, and send the next instruction from a browser or your phone. No terminal babysitting. Approval pushes carry the start of the command itself, because approving rm -rf build/ and approving git push --force deserve different reaction times: the push arrives β tap it β approve in one tap (push-to-phone ships with the cloud edition).
|
|
For a read-only investigation that matters β a bug RCA, a design review, an audit β ask the coordinator for a second opinion: it sends the same question to 2β3 workers on different providers, waits for their reports, and lays out where they agree, where they disagree, and which claims only one of them made. High agreement is not the same as being right β the same model with the same context repeats the same mistake β so the disagreements are the part worth reading.
Chat, commands, screenshots, and remote input travel over an encrypted WebRTC data channel directly between your dashboard and your daemon. The server handles sign-in, signaling and lightweight metadata, plus one deliberate exception: on the cloud edition it receives the approval prompt (the command and button labels) to build the push notification, and the push shows up to 80 characters of it. Chat, terminal output and your code don't sit on someone else's box. It's a trust property of the design, not an upsell.
main.ADHDev doesn't replace your agents or spawn its own β it attaches to the ones already installed on your machine and gives them a control surface.
browser / phone
β chat, commands, screenshots, remote input
βΌ
βββββββββββββββββ PTY ββββββββββββββββββββββββ
β daemon ββββββββββββββββββββββΆβ Claude Code, Codex, β
β (your machine)βββββββββββββββββββββββ Cursor CLI, β¦ β
β β CDP ββββββββββββββββββββββββ€
β Β· providers ββββββββββββββββββββββΆβ Cursor, VS Code, β
β Β· sessions β β Antigravity, β¦ β
β Β· mesh/queue β ββββββββββββββββββββββββ
β Β· Refinery β
βββββββββββββββββ
β
βββ git worktrees ββ one isolated checkout per parallel task
cli (PTY), ide (Chrome DevTools Protocol), extension (CDP webview).adhdev-sessiond owns the PTYs, so your CLI sessions survive a daemon restart or upgrade.localhost:3847. In the cloud edition the same data rides a WebRTC data channel browserβdaemon, with the server only doing signaling.mesh_enqueue_task β SQLite queue (pending)
β an idle node claims it (assigned)
β worker agent runs in its own git worktree
β completed / failed β append-only ledger
β Refinery: repo's own gates β patch equivalence β rebase β merge (main unchanged) β cleanup
Four properties that shape everything else:
report_completion call, not a screen-scrape. You wait on events; you don't ask for status in a loop.Deeper: Repo Mesh developer guide Β· session-host
Requirements: Node.js 20 or newer (22 LTS recommended; on Windows use 22.x β see the note below), git, and at least one coding agent already installed and authenticated β ADHDev drives the CLIs you already use.
Recommended β the adhdev CLI:
npm install -g adhdev
adhdev standalone
Open http://localhost:3847.
Self-host directly with the standalone package:
npm install -g @adhdev/daemon-standalone
adhdev-standalone
Everything runs on your machine as a local daemon with an embedded dashboard β no cloud account required for the standalone path. Both packages install an adhdev command, so install one or the other, not both.
Cloud edition (several machines, push notifications):
curl -fsSL https://adhf.dev/install | sh # macOS / Linux
irm https://adhf.dev/install.ps1 | iex # Windows (PowerShell)
adhdev setup # sign in, then open https://adhf.dev
Useful flags:
adhdev standalone --host 0.0.0.0 # allow other devices on the same LAN
adhdev standalone --port 8080 # custom port
adhdev standalone --token mysecret # token auth for scripts / operator access
adhdev standalone --no-open # don't auto-open the browser
adhdev standalone --dev # enable the DevServer API (:19280) to debug and test providers
adhdev-standalone --public <dir> # (standalone package) serve a custom web dashboard build
Standalone stays localhost-only by default. If you bind to 0.0.0.0 for LAN access, the dashboard warns when neither token auth nor a dashboard password is configured.
Windows note: Windows + Node.js 24+ is currently blocked for normal startup/install paths. Use Node.js 22.x, or the PowerShell installer:
irm https://adhf.dev/install.ps1 | iex(docs).
Canonical self-hosted docs:
adhdev standalone, then open http://localhost:3847. The dashboard detects which agents are installed on this machine./mesh, create a mesh bound to your repo, and clone a worktree node. Queue a task to it and watch the ledger: dispatch β completion β Refinery β rebase and merge into main. This all works self-hosted; only crossing to a second machine needs the cloud edition.Stuck? The self-hosted setup guide covers ports, LAN exposure, and provider detection problems.
ADHDev talks to coding agents through three provider categories β ide (CDP), extension (CDP webview), and cli (PTY).
CLI agents (PTY-driven, launched and controlled from the dashboard):
| Agent | Provider |
|---|---|
| Claude Code | cli/claude-cli |
| Codex CLI | cli/codex-cli |
| Cursor Agent | cli/cursor-cli |
| Google Antigravity CLI | cli/antigravity-cli |
| Grok CLI | cli/grok-cli |
| Kimi Code | cli/kimi |
| Opencode | cli/opencode |
IDEs (via Chrome DevTools Protocol): Cursor, Google Antigravity, VS Code, VSCodium, Kiro, Windsurf, Trae, PearAI.
IDE extensions (CDP webview): Claude Code (VS Code), Codex, Cline, Roo Code.
Built-in β verified. ADHDev ships a broad inventory; presence in the catalog means the integration exists, not that every one has been validated end-to-end. Support levels vary. See the live policy:
ADHDev does not manage API keys for your agents β each tool handles its own auth. ADHDev detects install status and surfaces errors.
Providers are data, not code you have to fork. A provider is a versioned manifest (provider.v1.json) plus scripts describing how to detect the tool, launch it, parse its output into chat turns, and recognise its approval prompts. Drop one in ~/.adhdev/providers/ and the dashboard picks it up β your override wins over the built-in of the same name, so you can fix a broken parser locally without waiting for a release.
If you get an agent working that isn't in the catalog, that's the most useful contribution you can make β open it against vilmire/adhdev-providers. Core pull requests here require signing the CLA (the bot prompts you).
This is the open-source, self-hosted edition (AGPL-3.0). Hosted cloud operations are not part of this repository. Self-hosted is built around three local layers:
daemon-standalone exposes a local HTTP/WebSocket server and serves the web UI.daemon-core manages IDE, CLI, and extension integrations.session-host-daemon (adhdev-sessiond) owns long-lived PTY runtimes so CLI sessions survive daemon restarts.| Path | Purpose |
|---|---|
packages/daemon-core | Shared engine: providers, CDP, command routing, session/runtime state |
packages/daemon-standalone | Local HTTP/WS server and bundled standalone UI |
packages/web-core | Shared React pages, components, hooks, and transport abstractions |
packages/web-standalone | Standalone dashboard app |
packages/session-host-core | Session-host protocol, client, registry, ring buffer, labels |
packages/session-host-daemon | Long-lived PTY runtime owner process |
packages/terminal-mux-* | Local terminal mux stack |
packages/terminal-render-web | Browser-side terminal rendering support |
packages/ghostty-vt-node | Ghostty VT bindings used by runtime/mux layers |
GET /api/v1/status β sessions[] array is the source of truthPOST /api/v1/commandGET /api/v1/runtime/:sessionId/snapshotGET /api/v1/runtime/:sessionId/eventsGET /api/v1/mux/:workspace/statePOST /api/v1/mux/:workspace/controlws://localhost:3847/wsReference: Self-hosted API docs
git clone https://github.com/vilmire/adhdev.git
cd adhdev
npm install
npm run build
npm run dev
Useful workspace scripts:
npm run dev:daemon
npm run dev:web
The engine is open source. What the cloud adds is a reach layer: accounts, more than one machine, internet-wide remote access, and push.
| OSS (self-hosted) | Cloud (adhf.dev) | |
|---|---|---|
| Dashboard | localhost:3847 | adhf.dev, any browser or phone |
| Account required | β no auth | OAuth (GitHub / Google) |
| Machines | 1 | 1 / 2 / 5 by plan |
| Reach | localhost, or your LAN with --host | anywhere (P2P WebRTC + TURN for locked-down networks) |
| Every provider (CLI / IDE / extension) | β | β |
| Repo Mesh, Refinery, worktree nodes | β single-machine mesh runs fully local | β |
| Mesh across machines | β (no cross-machine relay) | β |
| Push notifications (approval / completion / error) | β | β |
| Hosted REST API + API keys | β (local API only) | β |
| Price | free, no quotas | Free / Pro / Ultra |
If you only drive one machine and stay on your own network, self-hosted gives you everything except push notifications and the cross-machine mesh β no quotas. The cloud exists for the moment you add a second machine or want to reach your agents from outside the house.
AGPL-3.0-or-later. See LICENSE.