System control (launchd/systemd) lives on the Gateway host. See Gateway.
Android node app ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway
Android connects directly to the Gateway WebSocket (default ws://<host>:18789) and uses Gateway-owned pairing.
coderclaw) on the gateway machine (or via SSH).coderclaw gateway --port 18789 --verbose
Confirm in logs you see something like:
listening on ws://0.0.0.0:18789For tailnet-only setups (recommended for Vienna ⇄ London), bind the gateway to the tailnet IP:
gateway.bind: "tailnet" in ~/.coderclaw/coderclaw.json on the gateway host.From the gateway machine:
dns-sd -B _coderclaw-gw._tcp local.
More debugging notes: Bonjour.
Android NSD/mDNS discovery won’t cross networks. If your Android node and the gateway are on different networks but connected via Tailscale, use Wide-Area Bonjour / unicast DNS-SD instead:
coderclaw.internal.) on the gateway host and publish _coderclaw-gw._tcp records.Details and example CoreDNS config: Bonjour.
In the Android app:
After the first successful pairing, Android auto-reconnects on launch:
On the gateway machine:
coderclaw nodes pending
coderclaw nodes approve <requestId>
Pairing details: Gateway pairing.
Via nodes status:
coderclaw nodes status
Via Gateway:
coderclaw gateway call node.list --params "{}"
The Android node’s Chat sheet uses the gateway’s primary session key (main), so history and replies are shared with WebChat and other clients:
chat.historychat.sendchat.subscribe → event:"chat"If you want the node to show real HTML/CSS/JS that the agent can edit on disk, point the node at the Gateway canvas host.
Note: nodes load canvas from the Gateway HTTP server (same port as gateway.port, default 18789).
Create ~/.coderclaw/workspace/canvas/index.html on the gateway host.
Navigate the node to it (LAN):
coderclaw nodes invoke --node "<Android Node>" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18789/__coderclaw__/canvas/"}'
Tailnet (optional): if both devices are on Tailscale, use a MagicDNS name or tailnet IP instead of .local, e.g. http://<gateway-magicdns>:18789/__coderclaw__/canvas/.
This server injects a live-reload client into HTML and reloads on file changes.
The A2UI host lives at http://<gateway-host>:18789/__coderclaw__/a2ui/.
Canvas commands (foreground only):
canvas.eval, canvas.snapshot, canvas.navigate (use {"url":""} or {"url":"/"} to return to the default scaffold). canvas.snapshot returns { format, base64 } (default format="jpeg").canvas.a2ui.push, canvas.a2ui.reset (canvas.a2ui.pushJSONL legacy alias)Camera commands (foreground only; permission-gated):
camera.snap (jpg)camera.clip (mp4)See Camera node for parameters and CLI helpers.