Skip to main content

Android App (Node)

Support snapshot

System control

System control (launchd/systemd) lives on the Gateway host. See Gateway.

Connection Runbook

Android node app ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway Android connects directly to the Gateway WebSocket (default ws://<host>:18789) and uses Gateway-owned pairing.

Prerequisites

  • You can run the Gateway on the “master” machine.
  • Android device/emulator can reach the gateway WebSocket:
    • Same LAN with mDNS/NSD, or
    • Same Tailscale tailnet using Wide-Area Bonjour / unicast DNS-SD (see below), or
    • Manual gateway host/port (fallback)
  • You can run the CLI (clawdia) on the gateway machine (or via SSH).

1) Start the Gateway

clawdia gateway --port 18789 --verbose
Confirm in logs you see something like:
  • listening on ws://0.0.0.0:18789
For tailnet-only setups (recommended for Vienna ⇄ London), bind the gateway to the tailnet IP:
  • Set gateway.bind: "tailnet" in ~/.nelsonmuntz-c/clawdia.json on the gateway host.
  • Restart the Gateway / macOS menubar app.

2) Verify discovery (optional)

From the gateway machine:
dns-sd -B _clawdia-gw._tcp local.
More debugging notes: Bonjour.

Tailnet (Vienna ⇄ London) discovery via unicast DNS-SD

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:
  1. Set up a DNS-SD zone (example clawdia.internal.) on the gateway host and publish _clawdia-gw._tcp records.
  2. Configure Tailscale split DNS for clawdia.internal pointing at that DNS server.
Details and example CoreDNS config: Bonjour.

3) Connect from Android

In the Android app:
  • The app keeps its gateway connection alive via a foreground service (persistent notification).
  • Open Settings.
  • Under Discovered Gateways, select your gateway and hit Connect.
  • If mDNS is blocked, use Advanced → Manual Gateway (host + port) and Connect (Manual).
After the first successful pairing, Android auto-reconnects on launch:
  • Manual endpoint (if enabled), otherwise
  • The last discovered gateway (best-effort).

4) Approve pairing (CLI)

On the gateway machine:
clawdia nodes pending
clawdia nodes approve <requestId>
Pairing details: Gateway pairing.

5) Verify the node is connected

  • Via nodes status:
    clawdia nodes status
    
  • Via Gateway:
    clawdia gateway call node.list --params "{}"
    

6) Chat + history

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:
  • History: chat.history
  • Send: chat.send
  • Push updates (best-effort): chat.subscribeevent:"chat"

7) Canvas + camera

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 use the standalone canvas host on canvasHost.port (default 18793).
  1. Create ~/clawd/canvas/index.html on the gateway host.
  2. Navigate the node to it (LAN):
clawdia nodes invoke --node "<Android Node>" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18793/__clawdia__/canvas/"}'
Tailnet (optional): if both devices are on Tailscale, use a MagicDNS name or tailnet IP instead of .local, e.g. http://<gateway-magicdns>:18793/__clawdia__/canvas/. This server injects a live-reload client into HTML and reloads on file changes. The A2UI host lives at http://<gateway-host>:18793/__clawdia__/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").
  • A2UI: 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.