Standalone (Self-hosted)
Standalone mode runs ADHDev entirely on one machine. It bundles the local dashboard, the local HTTP/WebSocket API, and the session-host runtime into a single process — no account, no cloud connection, no P2P, no TURN.
It is the AGPL-3.0 open-source surface of ADHDev, published as @adhdev/daemon-standalone.
When to use it
Standalone is the right choice when everything you want to control is on the machine in front of you — or on a machine you can reach directly over your own LAN.
It is not a self-hosted replacement for the cloud dashboard. Standalone deliberately does not include:
- Push notifications — no approval, completion, or disconnect notifications to your phone
- Remote access over the internet — there is no signaling server, so there is no connection from outside your network
- Multi-machine fleets — one standalone server manages its own machine only
Those are cloud features. If you want them, see Getting Started for the cloud daemon.
Start it
npm install -g adhdev
adhdev standaloneadhdev standalone is a thin wrapper: it resolves and launches the @adhdev/daemon-standalone package, matching the npm channel your CLI came from. You can also run the OSS package directly:
npm install -g @adhdev/daemon-standalone
adhdev-standaloneOr without installing anything globally:
npx @adhdev/daemon-standaloneThen open http://localhost:3847.
What should happen: the dashboard loads and shows your local machine. There is no login screen — standalone has no accounts.
TIP
The publicly install-tested paths are macOS and Windows. Linux may work for standalone, but it has not been validated enough to present as a supported path.
Ports and binding
The standalone server serves the dashboard and the HTTP/WebSocket API from one port, 3847 by default, bound to 127.0.0.1 (loopback only).
adhdev standalone --port 4000LAN access
To reach the dashboard from another device on your network, bind an address other than loopback:
adhdev standalone --host 0.0.0.0 --token <some-secret>--host takes an explicit address — an IPv4 address, an IPv6 address, or localhost. There is no boolean form: a bare --host with no value, or an unrecognized value, is a visible startup failure rather than a silent bind you did not ask for.
WARNING
--host 0.0.0.0 (or the IPv6 any-address ::) binds every interface. Standalone has no authentication by default, so anyone who can reach the port gets full control of your agents. Always pair a public bind with --token. The server prints a warning at startup when you bind publicly without auth.
--token requires that token before the dashboard will connect. This is the only auth mechanism standalone has.
Flags
| Flag | Purpose |
|---|---|
--port, -p <port> | Port for the HTTP/WS server (default 3847) |
--host, -H <address> | Explicit bind address — IPv4, IPv6, or localhost (default 127.0.0.1) |
--token <token> | Require this token to use the dashboard |
--dev | Enable DevConsole for writing and testing provider scripts |
--public <path> | Custom path to the dashboard distribution |
--no-open | Do not open the browser on startup |
--help, -h | Show usage |
What works in standalone
Once the dashboard is up, the local agent surface behaves the same as in cloud mode:
- Detecting and launching CLI agents and ACP agents
- Reading chat, sending messages, and answering approval prompts from the dashboard
- Session listing, switching, and the terminal view
- The MCP server in local mode, which talks to
http://localhost:3847
Standalone vs cloud
| Standalone | Cloud | |
|---|---|---|
| Account required | No | Yes |
| Transport | Direct HTTP/WS on your machine | P2P WebRTC, with TURN for blocked NATs |
| Reachable from the internet | No | Yes |
| Machines per dashboard | One | Plan-dependent |
| Push notifications | No | Yes |
| Auth | Optional --token | OAuth, API keys, machine secrets |
| License | AGPL-3.0 | Proprietary |
Deeper configuration
The OSS repository carries the reference documentation for standalone internals — password auth, saved host defaults, local config file locations, the local API surface, and the session-host runtime:
