Skip to main content

Pairing & Wi-Fi

Out of the box, a freshly provisioned Intern runs in Access Point mode with no internet credentials. Pairing the device means joining its AP, opening the captive portal, and submitting the setup form. intern-server then switches to Station mode and joins your real Wi-Fi.

Connect to the Intern AP

After Quick Start finishes, look for an open Wi-Fi network named:

Intern-XXXX

where XXXX is the last four characters of the Pi's serial number. The network has no password.

Once connected, your laptop or phone gets a DHCP lease from 192.168.100.50–150 and the device is reachable at http://192.168.100.1.

Captive portal

Most operating systems auto-launch the captive portal on connect. If yours doesn't, open http://192.168.100.1 in a browser. The web UI presents a wizard whose fields map directly onto the SetupRequest body (see lib/openclaw/domain/setup.go):

  1. Wi-Fissid, password (both required).
  2. Channelchannel (telegram / slack / discord) plus the channel-specific token + user-ID fields. See Channels for the full per-channel field list.
  3. LLM providerllm_base_url, llm_api_key, llm_model (all required). See LLM Provider.
  4. Device IDdevice_id, a friendly label for the device.

Submit. The wizard POSTs to /api/device/setup, the handler returns immediately, and the actual setup runs asynchronously on the device.

What /api/device/setup does

The endpoint is mounted at POST /api/device/setup (proxied by nginx from :80 to intern-server on :5000). Briefly, the async pipeline:

  1. Join Wi-Fi — runs /usr/local/bin/connect-wifi <ssid> <password> to drive wpa_supplicant and switch out of AP mode into STA.
  2. Persist config — writes the LLM credentials, channel tokens, and device ID into /root/config/config.json.
  3. Configure OpenClawSetupOpenclaw (in lib/openclaw/openclaw.go) merges the canonical channels.{telegram|slack|discord} block into /root/.openclaw/openclaw.json.
  4. Allocate Supermemory (when internet is reachable) — calls POST <llm_base_url>/supermemory/allocate and merges the returned apiKey + containerTag into plugins.entries.openclaw-supermemory.config. See Supermemory Overview.
  5. Restart OpenClawsystemctl restart openclaw so the gateway picks up the new channel + plugin config.
  6. LED reflects the result — the LED engine moves between booting, idle, error, etc. as the steps complete (state names listed below).

If step 1 fails (bad SSID/password, weak signal), intern-server returns the device to AP mode so you can re-pair. Failures in steps 4–5 are non-fatal: the status reporter retries them on every tick and the heartbeat reports supermemory_installed: false until allocation eventually succeeds.

Switching networks later

To move a paired device to a different Wi-Fi network, force it back into AP mode:

sudo device-ap-mode

The Intern-XXXX SSID returns. Re-run the wizard.

To go back to client mode without re-pairing (e.g. after edits to /etc/wpa_supplicant/wpa_supplicant.conf):

sudo device-sta-mode

To join a new network from the CLI without the wizard:

sudo connect-wifi "MyNetwork" "supersecret"

LED states

The LED ring is driven by intern-server and reports the device's high-level state. The state names (from lib/led/state.go in openclaw-lobster) are:

StateWhen
bootingBringing up systemd services
idleRing off — no recent interaction
connectionmodeHas internet, but network / LLM / channel still unconfigured
thinkingProcessing your message
workingRunning a long-form task
workingnointernetIn STA mode but unable to reach the internet
errorSetup or runtime failure — check /var/log/intern.log
factoryresetGPIO 23 reset button held ≥10 s

Specific colors are configured at the LED engine level and may change between firmware revisions — don't hard-code "green means ready" into your scripts; poll GET /api/led instead.

Verify connectivity

From your laptop, while still on the Intern-XXXX AP:

curl http://192.168.100.1/health/live # liveness probe
curl http://192.168.100.1/api/network/current # current Wi-Fi state
curl http://192.168.100.1/api/network/check-internet

A 200 OK from /health/live confirms intern-server is reachable. After the device joins your real Wi-Fi (STA mode), the same endpoints are reachable at the device's new IP — see SSH Access · Preflight for how to find that IP.