A native Android client for OpenClaw and Orchestrator β monitor and control your AI agent sessions from your phone.
- Real-time streaming β token-by-token typewriter response via WebSocket
- Ed25519 authentication β full device pairing handshake with OpenClaw Gateway 2.13+
- Agent selector β switch between Main / Engineer / QA agents on the fly
- Markdown rendering β bold, italic, inline code, code blocks, headings, lists
- Chat history β local Room database, sortable, per-session
- Voice input β Android Speech-to-Text integration
- Session management β start, pause, resume, and stop Orchestrator sessions from your phone
- Live log streaming β WebSocket log tail with phase/error/checkpoint filters; auto-reconnect with exponential backoff
- Task progress β per-session task counts (pending / running / done / failed)
- Checkpoint management β view, load, and delete session checkpoints
- Human-in-the-loop interventions β approve, deny, or provide guidance when the agent pauses for operator input
- Background intervention polling β WorkManager job notifies you when any session is paused awaiting operator input
- Permission approval β review and approve/reject tool permission requests
- Replan flow β when a session fails, view the AI-generated failure summary, add operator feedback, and send it back to Project Architect to seed a new planning session
- Project & task explorer β browse projects, task lists, file trees, and task detail
- Offline banner β detects network drops; falls back to REST polling silently
- Dark theme β consistent slate/navy UI across all screens
| Layer | Technology |
|---|---|
| Language | Kotlin |
| UI | XML Views + ViewBinding |
| Architecture | MVVM (ViewModel + LiveData + Repository) |
| Local storage | Room Database |
| Networking | OkHttp (WebSocket + REST) |
| Auth | Ed25519 via BouncyCastle |
| Background jobs | WorkManager |
| Build | Gradle KTS + KSP |
app/src/main/java/com/user/
βββ data/
β βββ OrchestratorModels.kt # All Orchestrator API response models
β βββ PermissionModels.kt
β βββ PrefsManager.kt # Server URL, API key, gateway token, prefs
β βββ ... # Room entities, DAOs, database
βββ repository/
β βββ OrchestratorRepository.kt
βββ service/
β βββ OrchestratorApiClient.kt # All Orchestrator REST calls
β βββ WebSocketManager.kt # Live log streaming with reconnect
β βββ InterventionPollService.kt # WorkManager background poller
β βββ PermissionPollService.kt
β βββ GatewayClient.kt
β βββ Ed25519Manager.kt
β βββ OpenClawService.kt
βββ ui/
β βββ activities/
β β βββ MainActivity.kt
β β βββ SessionsActivity.kt
β β βββ SettingsActivity.kt
β β βββ OnboardingActivity.kt
β βββ tasks/
β β βββ SessionDetailActivity.kt # Live logs, interventions, replan
β β βββ ProjectDetailActivity.kt
β β βββ TaskDetailActivity.kt
β β βββ TaskListActivity.kt
β β βββ CheckpointsBottomSheet.kt
β βββ permissions/
β β βββ PermissionsActivity.kt
β βββ components/
β β βββ OfflineBannerView.kt
β β βββ StatusBadgeView.kt
β βββ FailureSummary.kt, MarkdownRenderer.kt, OutputHighlighter.kt, ...
βββ viewmodel/
βββ SessionViewModel.kt
βββ TaskViewModel.kt
βββ ...
ClawMobile
β
ββββ Chat/voice ββββββββββββββββββββββ> OpenClaw Gateway (:18789)
β βββ OpenClaw agent runtime
β
ββββ Session control / monitoring ββ> Orchestrator API (:8080)
βββ Projects, tasks, sessions
βββ Live WebSocket log stream
βββ Human-in-the-loop interventions
βββ Permission approvals
βββ Replan flow
Both connections run through Tailscale or LAN. They are independent β the Gateway token is for chat; the Orchestrator URL + API key are for session control.
ClawMobile can read provider metadata from Gateway/Hermes through GET /providers/status after the Gateway connection is configured. Android stores only the Gateway/Hermes connection settings needed to authenticate to your server. OpenAI, Anthropic, OpenRouter, and other third-party provider API keys stay server-side behind Gateway/Hermes and are not stored in the Android app.
- Android Studio Hedgehog (2023.1.1) or newer
- JDK 17+
- Android SDK API 29+ (Android 10+)
- OpenClaw running locally or on a server
- Orchestrator running (for session management features)
Recommended β Tailscale
Orchestrator URL: http://<tailscale-ip>:8080
Gateway URL: http://<tailscale-ip>:18789
SSH tunnel (emulator or different network)
ssh -N -L 8080:localhost:8080 -L 18789:localhost:18789 \
-o ServerAliveInterval=30 USER@YOUR_SERVER_IPSame WiFi
Orchestrator URL: http://192.xxx.x.xx:8080
Gateway URL: http://192.xxx.x.xx:18789
Gateway token:
cat ~/.openclaw/openclaw.json
# Copy gateway.auth.tokenOrchestrator API key:
Settings β API Keys in the Orchestrator dashboard.
./gradlew assembleDebug
# APK β app/build/outputs/apk/debug/app-debug.apkOr Run β Run 'app' in Android Studio.
- App opens Settings if no token is set
- Enter Gateway URL + Token β Save (for chat)
- Enter Orchestrator URL + API Key β Save (for session control)
- First Gateway connection shows Device Pairing Required:
openclaw gateway call device.pair.list --json
openclaw gateway call device.pair.approve --params '{"requestId":"<id>"}' --json- Restart β
β Connected
| Issue | Fix |
|---|---|
β Handshakingβ¦ stuck |
Check tunnel; verify gateway token |
| Pairing required on every launch | Use real device (emulator clears data on restart) |
Software caused connection abort |
Add -o ServerAliveInterval=30 to SSH tunnel |
| Orchestrator sessions not loading | Verify Orchestrator URL and API key in Settings |
| Intervention notifications not firing | Check that POST_NOTIFICATIONS permission is granted |
| KSP build errors | Ensure KSP version prefix matches Kotlin version in libs.versions.toml |
Cannot resolve symbol |
File β Invalidate Caches / Restart |
| Project | Description |
|---|---|
| OpenClaw | AI Agent framework |
| orchestrator | Automates software projects with OpenClaw agents |
- All messages stored locally on device via Room
- No analytics, no cloud sync, no third-party SDKs
- Only outbound connections are to your own OpenClaw and Orchestrator servers
Consider giving it a star β it helps others discover the project and keeps us motivated!
MIT