Your First Node in 10 Minutes
From starting a Hub to chatting with your first agent in the Dashboard: 4 steps, each with one command and one check.
Before you start: install Node.js ≥ 22.13, Bun ≥ 1.2 and anet as described in Install, and make sure anet -v prints normally. Already installed and only upgrading? See the Upgrade Guide.
Fastest path (recommended): zero config with a Claude subscription
With Claude Code CLI installed (npm i -g @anthropic-ai/claude-code) and claude auth login done, pick the claude-code-cli runtime in step 3: no API key, no model picker. Without a Claude subscription, use claude-agent-sdk plus one model API key (MiniMax / DeepSeek / InternLM / Xiaomi); see step 3.
1. Start the Hub
Open terminal #1, keep it running:
anet hub startThe hub listens on http://127.0.0.1:9200 by default, the SQLite DB lives at ~/.commhub/commhub.db, and an admin account admin is created automatically with a randomly generated password that is printed only this once (an anet-xxxxxxxx… string, on both the latest and preview channels). Save it right away — step 2 needs it.
Change the password before going public
Your first login prompts you to replace the random password. Any --host 0.0.0.0 public deployment must anet passwd to a strong password immediately. To choose the initial password yourself, run anet hub start --password <pass> or set ANET_HUB_BOOTSTRAP_PASSWORD.
Stop / status
anet hub status / anet hub stop (no more lsof + kill).
2. Start the Dashboard and log in
Open terminal #2, keep it running:
anet hub dashboardOpen http://localhost:3000 in your browser and log in as admin with the password your own anet hub start printed.
Take the password from your own anet hub start output — do not copy it from this page
The first anet hub start prints the admin credentials once:
✅ Admin account created
username: admin
password: <the string printed there>
Store this password now; it will not be shown again.The checked latest (2.3.0-preview.190) prints a random password (that path is unchanged since .181): anet- followed by 22 hex characters. Published CLI 2.3.0-preview.216 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.182 (that runtime reports token usage for claude / codex / opencode as deltas, with cache kept in its own column); 2.3.0-preview.214 adds a dropped-key warning: profile serialisation is a whitelist, so keys outside it vanish silently (exactly how #3418 hid); saving a profile now warns about keys present on disk but missing from the write; 2.3.0-preview.213 fixes a whitelist drop: opencodeConfiguredModelAtLastOpen (a marker written by the node runtime) was missing from the profile serialisation whitelist, so every anet node start dropped it and the "clear the marker to trigger a reconcile" signal never reached agent-node; 2.3.0-preview.212 changes nothing but the pair constant relative to .211, pointing at agent-node 2.5.0-preview.179 (that runtime logs the three inputs of the reconcile decision before opening the co-presence runtime, to locate a "drift detected but not repaired" case); 2.3.0-preview.211 changes nothing but the pair constant relative to .210, pointing at agent-node 2.5.0-preview.178 (that runtime arms a reconcile when the live session model drifts away from the configured model, so the next start self-heals); 2.3.0-preview.211 changes nothing relative to .208 but the pair constant (→ agent-node 2.5.0-preview.177, which gives Feishu inbound a controllable queue: /q to list, /cancel to drop a not-yet-started turn, /prio to promote); 2.3.0-preview.208 changes two things relative to .207: the pair constant now points at agent-node 2.5.0-preview.176 (role gate, chat context and cross-machine credentials for the Feishu channel), and a stale comment in the bridge header that misnamed the default mode ("commhub is the default" while the code defaults to direct); 2.3.0-preview.207 changes one thing relative to .206: node-profile writes now touch only the fields the caller declares (merged onto what is on disk), instead of rewriting the whole profile from the process's in-memory snapshot — a long-lived bridge holding its startup profile used to overwrite a model that the Hub had changed and already applied (measured once in production); 2.3.0-preview.206 changes nothing relative to .205 but the pair constant (→ agent-node 2.5.0-preview.171) and a corrected build identifier: .205 recorded the event sha (644c95cd) instead of the packed tree (9bb1a399) — a label describing the wrong object, now kept apart as event_sha. .205 changed nothing but the pair constant relative to .204, pointing at agent-node 2.5.0-preview.170 (that runtime reports its build commit in report_status, so a node's identity becomes "which bytes" rather than only "which label" — once a Hub that projects it is deployed); .204 added one thing relative to .203: anet --version prints a build identity line, so two installs with the same version label are distinguishable (four shapes: clean tree / dirty tree / no build-info.json / present but invalid — the last two must not look alike); .203 changed nothing but the pair constant relative to .202, pointing at agent-node 2.5.0-preview.169 (that runtime turns the shared session's "alive" predicate from a sticky boolean into a 30 s time window, so one transient disconnect no longer downgrades hot model switching forever; and a failed hot switch now degrades to a restart instead of acking rejected with the model unchanged); .202 changed one behaviour relative to .201: it no longer prompts in non-interactive environments (client / pipe / CI). It used to print the prompt and then wait forever, so a client saw a hang with no reason; now a prompt with a default uses that default and says so on stderr, a prompt without one fails with the flag to pass, and anet init names --hub..201 changed nothing but the pair constant relative to .200, pointing at published agent-node 2.5.0-preview.166 (that runtime carries three changes: queueing gets its own cap so it no longer eats the reply budget; an already-replied task no longer accepts a late reply, which used to deliver a duplicate; and late-reply persistence uses the Windows-safe rename retry) (that runtime carries two changes: the prompt now says to keep get_task polls at least 60 s apart while waiting on a subtask — results are chained back upstream via parent_task_id anyway, and one node was measured polling 13 times a minute for eight hours; and a turn that finishes after the bridge timed out now posts its result back to the Hub as a late reply instead of being dropped — the Hub has accepted those since .213) (which carries the heartbeat and first-SSE-reconnect jitter: periodic status reports and the reconnect after a Hub restart are spread out instead of arriving on the same second — the Hub measured 308 requests in flight from that herd); both exact versions have been verified on npm. .156 adds one capability that is off by default: with ANET_TEAM_RULES=1, a node reads the network rules once on a full start and maintains a managed block at the top of its CLAUDE.md / AGENTS.md (everything outside the block untouched byte for byte; a half-written marker is refused; the same revision produces no diff; an unreachable Hub leaves the file alone and never blocks startup). It also carries three test-only fixes (explicit 60 s timeout for the native Windows tests, printing the probe result on failure, and measuring/retrying the fixture’s birth query). Without that environment variable the behaviour is identical to .155; this release injects only the Hub layer — daemon-scoped rules and cross-layer conflict arbitration are still not implemented. The default bootstrap / random-password path is unchanged. Publication of an exact version does not mean a channel tag will always point to it, or that existing nodes have upgraded. Run npm view @sleep2agi/agent-network dist-tags for the current channel versions. The fixed admin / anethub only exists on 2.2.x and earlier; it will not log you in to a freshly installed Hub.
The credentials are also written to ~/.anet/server/admin-utok.json, which holds only username / user_id / token / created_at — the password is not in there, so if you miss that one line of output you have to bootstrap again (or run anet hub admin reset-user on the Hub machine).
In terminal #3, log the CLI in too (so subsequent anet node ... commands carry the credentials):
anet login --hub http://127.0.0.1:9200 --username admin --password <password printed by anet hub start>anet whoami confirms your identity.
3. Create and start a node
anet node create my-botThe wizard asks: runtime → (only for claude-agent-sdk) vendor → model → API key.
Easiest path for newcomers — pick claude-code-cli manually
The wizard defaults to highlighting claude-agent-sdk; pressing Enter all the way lands you on the vendor + API-key path. If you've already done claude auth login, manually picking claude-code-cli is the zero-config fastest path.
anet node create lists all 7 runtimes (4 stable: claude-agent-sdk / claude-code-cli / codex-sdk / grok-build-acp; 3 preview: codex-app-server (shown as codex-cli in the menu) / grok-build-cli / opencode-cli); the full comparison is here: Runtime comparison.
OpenCode V2 is not an eighth runtime, and the wizard does not select it by default. It is still opencode-cli, it needs an explicit --opencode-generation v2 --opencode-unsafe-tools, and it only runs as co-presence. Maturity is still preview (npm latest does not have this create flag yet). Steps, Hub dialogue, and the model catalog that is not wired through yet: OpenCode V2.
Start the node:
Fresh install + claude-agent-sdk / codex-sdk? Install agent-node first
These runtimes depend on the agent-node package. The first node start triggers an npx auto-fetch that takes ~1 minute, but on builds ≤ 2.3.0-preview.37 (including the older 2.2.21) the startup check doesn't wait for it and exits with agent-node is not installed or cannot report a version (#450). The fix is PR #239, present in builds since 2.3.0-preview.38; both channels are past that floor now (check yours with anet -v; check where the channels point with npm view @sleep2agi/agent-network dist-tags). If you are on an older build: anet upgrade, or pre-install agent-node so the binary is already there:
npm install -g @sleep2agi/agent-nodeanet node start my-botWhen you see SSE connected, the node is online. Keep the terminal running.
Ctrl+C during vendor selection can leave a half-baked node
Clean a half-baked node with anet node delete <alias> (run once without --force to see the will-delete preview, then add --force to actually delete).
4. Dispatch a task from the Dashboard
Back in your browser at http://localhost:3000:
- Open Overview and click the online
my-botcard to open its embedded ChatPanel (there is no standalone Chat navigation page) - Type a message in the input ("what time is it?" / "write hello world"), hit Enter
- Your message appears immediately with an optimistic echo (
Youlabel) - After the agent calls the LLM, the reply appears with full markdown rendering (
↳ my-botlabel)
Refresh the page — chat history is preserved.
✅ Done.
Next steps
Advanced:
- Multi-agent coordination — peer agents auto-coordinate via
get_all_status/send_task/get_task - Batch node management with
anet project up/restart/down— start/stop every node under cwd in one command; zero-keyboard recovery after reboot - LAN-shared hub —
anet hub start --host 0.0.0.0lets other machines join
Demos (experimental, for a quick taste):
anet demo # list available demos
anet demo pr-review # PR review room — 3 reviewers (security/perf/style) + judgeDeeper:
- CLI command reference
- Agent Node config — config.json fields +
/aloopscheduler - Multi-model config — DeepSeek / Kimi / Claude / MiniMax / self-hosted
- Architecture overview
- Upgrade Guide — any older version → latest with a single
anet upgrade - Production deployment — there is no hosted Hub; read this before putting a Hub on a server or the internet