Android App
Android node app: connection guide + Canvas/Chat/Camera.
Support Overview
- Role: Companion node app (Android does not host Gateway).
- Gateway required: Yes (run on macOS, Linux, or Windows (WSL2)).
- Install reference: ''Getting Started'' + ''Pairing''.
- Gateway reference: ''Runbook'' + ''Configuration''.
- Protocol: ''Gateway protocol'' (node ↔ control plane).
System Control
System-level control (launchd/systemd) happens on the Gateway host. See ''Gateway''.
Guía de Conexión (Runbook)
App de nodo Android ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway
Android conecta directamente al WebSocket del Gateway (predeterminado ws://<host>:18789) y usa el mecanismo de emparejamiento gestionado por el Gateway.
#
Prerrequisitos
- Puedes ejecutar Gateway en tu máquina "primaria".
- El dispositivo/emulador Android puede acceder al WebSocket del gateway:
- Misma LAN, descubierto vía mDNS/NSD, O
- Mismo tailnet de Tailscale, vía Wide-Area Bonjour / unicast DNS-SD (ver abajo), O
- Entrada manual de host/puerto del gateway (fallback)
- Puedes ejecutar CLI (openclaw) en la máquina del gateway (o vía SSH).
#
1) Iniciar Gateway
openclaw gateway --port 18789 --verbose
Confirma que los logs muestren algo como:
- listening on ws://0.0.0.0:18789
Para despliegues solo tailnet (ej., Vienna ⇄ London, recomendado), vincula el gateway a la IP de tailnet:
- Establece gateway.bind: "tailnet" en ~/.openclaw/openclaw.json en el host del gateway.
- Reinicia Gateway / app de barra de menú macOS.
#
2) Verify Discovery (Optional)
On gateway machine:
dns-sd -B _openclaw-gw._tcp local.
Para más información de depuración, ver ''Bonjour''.
##
Tailnet (Vienna ⇄ London) Discovery via Unicast DNS-SD
Android's NSD/mDNS discovery cannot cross networks. If Android node and gateway are not on the same network but connected via Tailscale, use Wide-Area Bonjour / unicast DNS-SD:
1. Set up a DNS-SD zone on gateway host (e.g., openclaw.internal.) and publish _openclaw-gw._tcp records.
2. Configure split DNS in Tailscale for that domain, pointing to your DNS server.
See ''Bonjour'' for details and CoreDNS examples.
#
3) Connect from Android
In the Android app:
- App maintains connection to gateway via foreground service (persistent notification).
- Open Settings.
- Select your gateway in Discovered Gateways, then tap Connect.
- If mDNS is blocked, use Advanced → Manual Gateway (host + port) and tap Connect (Manual).
After successful initial pairing, Android will auto-retry on startup:
- If manual endpoint is enabled, it prioritizes manual endpoint; otherwise
- Tries to reconnect to the last discovered gateway (best effort).
#
4) Approve Pairing (CLI)
On gateway machine:
openclaw nodes pending openclaw nodes approve <requestId>
Pairing details: ''/gateway/pairing''.
#
5) Verify Node is Connected
- Node status:
- Via Gateway:
PlatformsAndroidPage step 10: P3
6) Chat & History Sync
Android node's Chat page uses gateway's primary session key (main), so chat history and replies are shared with clients like WebChat:
- History: chat.history
- Send: chat.send
- Push updates (best effort): chat.subscribe → event:"chat"
#
7) Canvas + Camera
##
Gateway Canvas Host (Recommended for Displaying Web Content)
Si quieres que el nodo muestre HTML/CSS/JS real (editado por el Agente en disco), conecta el nodo a un host canvas del Gateway.
Nota: El nodo usa un host canvas separado en el puerto canvasHost.port (predeterminado 18793).
1. Create ~/.openclaw/workspace/canvas/index.html on gateway host.
2. Have node navigate to it (LAN):
Tailnet (optional): If both devices are on Tailscale, use MagicDNS or tailnet IP instead of .local, e.g., http://<gateway-magicdns>:18793/__openclaw__/canvas/.
Este servicio inyecta un cliente de live-reload en el HTML y auto-refresca en cambios de archivo. El host A2UI está en http://<gateway-host>:18793/__openclaw__/a2ui/.
Canvas commands (foreground only):
- canvas.eval, canvas.snapshot, canvas.navigate (use '{"url":""}' or '{"url":"/"}' to return to default scaffold). canvas.snapshot returns '{ format, base64 }' (default format="jpeg").
- A2UI: canvas.a2ui.push, canvas.a2ui.reset (old alias canvas.a2ui.pushJSONL still available)
Camera commands (foreground only; permission-controlled):
- camera.snap (jpg)
- camera.clip (mp4)
See ''Camera node'' for parameters and CLI helpers.