App para Android (Nodo)
Nota: La app de Android aún no se ha publicado oficialmente. El código fuente está disponible en el repositorio de OpenClaw en
apps/android. Puedes compilarla tú mismo usando Java 17 y el Android SDK (./gradlew :app:assembleDebug). Consulta apps/android/README.md para instrucciones de compilación.
Resumen de compatibilidad
- Rol: app nodo complementaria (Android no aloja el Gateway).
- Gateway requerido: sí (ejecútalo en macOS, Linux o Windows vía WSL2).
- Instalación: Primeros pasos + Emparejamiento.
- Gateway: Guía operativa + Configuración.
- Protocolos: Protocolo del Gateway (nodos + plano de control).
Control del sistema
El control del sistema (launchd/systemd) reside en el host del Gateway. Consulta Gateway.
Guía de conexión
App nodo Android ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway
Android se conecta directamente al WebSocket del Gateway (por defecto ws://<host>:18789) y utiliza el emparejamiento de dispositivos (role: node).
Requisitos previos
- Puedes ejecutar el Gateway en la máquina “maestra”.
- El dispositivo Android o emulador puede alcanzar el WebSocket del Gateway:
- Misma LAN con mDNS/NSD, o
- Misma tailnet de Tailscale usando Wide-Area Bonjour / DNS-SD unicast (ver más abajo), o
- Host/puerto manual del Gateway (alternativa)
- Puedes ejecutar el CLI (
openclaw) en la máquina del Gateway (o vía SSH).
1) Iniciar el Gateway
openclaw gateway --port 18789 --verbose
Confirma en los logs que ves algo como:
listening on ws://0.0.0.0:18789
Para configuraciones exclusivas de tailnet (recomendado para Vienna ⇄ London), vincula el Gateway a la IP de tailnet:
- Configura
gateway.bind: "tailnet"en~/.openclaw/openclaw.jsonen el host del Gateway. - Reinicia el Gateway o la app de la barra de menú de macOS.
2) Verificar el descubrimiento (opcional)
Desde la máquina del Gateway:
dns-sd -B _openclaw-gw._tcp local.
Más notas de depuración: Bonjour.
Descubrimiento por tailnet (Vienna ⇄ London) vía DNS-SD unicast
El descubrimiento NSD/mDNS de Android no cruza redes. Si tu nodo Android y el Gateway están en redes diferentes pero conectados vía Tailscale, usa Wide-Area Bonjour / DNS-SD unicast en su lugar:
- Configura una zona DNS-SD (ejemplo
openclaw.internal.) en el host del Gateway y publica registros_openclaw-gw._tcp. - Configura el split DNS de Tailscale para el dominio elegido apuntando a ese servidor DNS.
Detalles y ejemplo de configuración CoreDNS: Bonjour.
3) Conectar desde Android
En la app de Android:
- La app mantiene la conexión al Gateway activa mediante un servicio en primer plano (notificación persistente).
- Abre la pestaña Connect.
- Usa el modo Setup Code o Manual.
- Si el descubrimiento está bloqueado, usa host/puerto manual (y TLS/token/contraseña cuando sea necesario) en Advanced controls.
Tras el primer emparejamiento exitoso, Android se reconecta automáticamente al iniciar:
- Endpoint manual (si está habilitado), en caso contrario
- El último Gateway descubierto (mejor esfuerzo).
4) Aprobar el emparejamiento (CLI)
En la máquina del Gateway:
openclaw devices list
openclaw devices approve <requestId>
openclaw devices reject <requestId>
Detalles del emparejamiento: Emparejamiento.
5) Verificar que el nodo está conectado
-
Vía estado de nodos:
openclaw nodes status -
Vía Gateway:
openclaw gateway call node.list --params "{}"
6) Chat + historial
La pestaña Chat de Android soporta selección de sesión (por defecto main, más otras sesiones existentes):
- Historial:
chat.history - Enviar:
chat.send - Actualizaciones push (mejor esfuerzo):
chat.subscribe→event:"chat"
7) Canvas + cámara
Gateway Canvas Host (recomendado para contenido web)
Si quieres que el nodo muestre HTML/CSS/JS real que el agente puede editar en disco, apunta el nodo al host canvas del Gateway.
Nota: los nodos cargan el canvas desde el servidor HTTP del Gateway (mismo puerto que gateway.port, por defecto 18789).
-
Crea
~/.openclaw/workspace/canvas/index.htmlen el host del Gateway. -
Navega el nodo hacia él (LAN):
openclaw nodes invoke --node "<Android Node>" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18789/__openclaw__/canvas/"}'
Tailnet (opcional): si ambos dispositivos están en Tailscale, usa un nombre MagicDNS o IP de tailnet en lugar de .local, p. ej. http://<gateway-magicdns>:18789/__openclaw__/canvas/.
Este servidor inyecta un cliente de recarga en vivo en el HTML y recarga ante cambios en archivos.
El host A2UI se encuentra en http://<gateway-host>:18789/__openclaw__/a2ui/.
Comandos de canvas (solo en primer plano):
canvas.eval,canvas.snapshot,canvas.navigate(usa{"url":""}o{"url":"/"}para volver al scaffold predeterminado).canvas.snapshotdevuelve{ format, base64 }(por defectoformat="jpeg").- A2UI:
canvas.a2ui.push,canvas.a2ui.reset(canvas.a2ui.pushJSONLalias legacy)
Comandos de cámara (solo en primer plano; requieren permiso):
camera.snap(jpg)camera.clip(mp4)
Consulta Nodo de cámara para parámetros y helpers del CLI.
8) Voz + superficie de comandos extendida de Android
- Voz: Android usa un flujo simple de micrófono on/off en la pestaña Voice con captura de transcripción y reproducción TTS (ElevenLabs cuando está configurado, TTS del sistema como alternativa). La voz se detiene cuando la app sale del primer plano.
- Los toggles de wake/talk-mode están actualmente eliminados del UX/runtime de Android.
- Familias de comandos adicionales de Android (la disponibilidad depende del dispositivo y los permisos):
device.status,device.info,device.permissions,device.healthnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addmotion.activity,motion.pedometer