Skip to content

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:

bash
anet hub start

The 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:

bash
anet hub dashboard

Open 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.221) prints a random password (that path is unchanged since .181): anet- followed by 22 hex characters. Published CLI 2.3.0-preview.237 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.205 (that runtime can resume an OpenCode session whose location moved into a subfolder of the workspace, such as a git worktree); Published CLI 2.3.0-preview.238 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.206 (that runtime also wakes the work lane for control messages, so "stop the current turn" actually runs); Published** CLI 2.3.0-preview.236 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.204 (that runtime makes a fork-to-new-folder clone always use the daemon's own Hub URL); Published CLI 2.3.0-preview.235 points the pair constant at agent-node 2.5.0-preview.203 (that runtime gives a daemon-started OpenCode co-presence node 90 s instead of 35 s to become ready) and waits 90 s instead of 30 s for the co-presence bridge in anet node start; Published CLI 2.3.0-preview.234 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.202 (that runtime reports each model's thinking levels with the catalog, and a daemon can read an adopted node's catalog); Published CLI 2.3.0-preview.233 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.201 (that runtime fixes forking an OpenCode shared-serve node into a new folder: the clone keeps the shared serve and the proven same-Hub address); Published CLI 2.3.0-preview.232 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.200 (that runtime forks into a new folder: the new node lives beside the source as <source folder>-N, carries only AGENTS.md / CLAUDE.md, adopted nodes can be sources, and OpenCode starts a fresh session there); Published CLI 2.3.0-preview.231 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.199 (that runtime lets a daemon prove "same Hub" at adoption with the node's own credential instead of comparing URL text, so an https daemon can adopt a node that reaches the same Hub at another address; an aborted source delivery keeps its real reason); Published CLI 2.3.0-preview.230 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.198 (that runtime fixes the queue path itself: .197 referenced queue state it never declared, so a busy switch would have thrown ReferenceError; .198 declares it, wires turnStartedAt to the real turn boundaries, and guards the optional writer); Published CLI 2.3.0-preview.229 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.197 (that runtime queues a thinking-level switch when it cannot get an idle window and applies it when the turn ends); Published CLI 2.3.0-preview.228 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.196 (that runtime makes a thinking-level switch wait for the current turn to end instead of being refused); Published CLI 2.3.0-preview.227 adds anet pair (prints the one exact install command for the pair) and lets a node report the CLI version that launched it (launched_by_cli_version); Published CLI 2.3.0-preview.226 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.194 (that runtime reports the session's effective model model_effective even when the current model has no thinking-level variants, so clients can confirm a model switch); Published CLI 2.3.0-preview.226 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.194 (that runtime prefers the idle-gated writer on stock builds, so the test-build controller can no longer answer unsupported); Published CLI 2.3.0-preview.224 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.192 (that runtime lets a stock build report variant capability: the readback uses the scoped request instead of the test-build identity pin, while writes keep the idle gate); Published CLI 2.3.0-preview.223 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.191 (thinking-level switching is now available on stock builds: it refuses while one of our turns is in flight and always reads back; OpenCode exposes no session busy flag, so it is best-effort, not atomic); Published CLI 2.3.0-preview.222 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.190 (that runtime raises the session-control request timeout to 20 s with its own fork lane, and daemon-spawned child nodes inherit NODE_USE_ENV_PROXY); Published CLI 2.3.0-preview.221 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.187 (that runtime raises the OpenCode V2 history read timeout from 10 s to 60 s with backoff, so a busy serve no longer leaves nodes stuck "working"; the fork reader accepts hand-started nodes that only carry node_name); Published CLI 2.3.0-preview.220 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.186 (that runtime lets a daemon adopt hand-started OpenCode V2 co-presence nodes — registration only, no process touched — so they can be forked); Published CLI 2.3.0-preview.219 points the pair constant at agent-node 2.5.0-preview.185 (that runtime interrupts its own wedged OpenCode V2 turn after the late-reply window, and a fork-preview daemon on a plain-HTTP Hub no longer exits), and lets claude-code-cli nodes store independent node secrets from the app; Published CLI 2.3.0-preview.218 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.184 (that runtime finishes the OpenCode V2 agent hot switch and advertises opencode_agent_config_capable; a switch counts as applied only when the readback matches, never on 204 alone); Published CLI 2.3.0-preview.217 changes nothing but the pair constant, pointing at agent-node 2.5.0-preview.183 (that runtime reports the OpenCode V2 agent list and the current session agent to the Hub as opencode_agents / opencode_agent_current / opencode_agents_seen_at; an empty array is legitimate, and anything unreadable stays empty instead of guessing a default agent); 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):

bash
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 ​

bash
anet node create my-bot

The 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:

bash
npm install -g @sleep2agi/agent-node
bash
anet node start my-bot

When 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:

  1. Open Overview and click the online my-bot card to open its embedded ChatPanel (there is no standalone Chat navigation page)
  2. Type a message in the input ("what time is it?" / "write hello world"), hit Enter
  3. Your message appears immediately with an optimistic echo (You label)
  4. After the agent calls the LLM, the reply appears with full markdown rendering (↳ my-bot label)

Refresh the page — chat history is preserved.

✅ Done.


Next steps ​

Advanced:

Demos (experimental, for a quick taste):

bash
anet demo                  # list available demos
anet demo pr-review        # PR review room — 3 reviewers (security/perf/style) + judge

Deeper:

Powered by Sleep2AGI

Download the app