GhostCrab: A Native Mobile Admin Console for Your Self-Hosted AI
GhostCrab is a phone, tablet, and desktop client for OpenClaw Gateway — not a chat app, a configuration and administration client for people who run their own AI infrastructure.
GhostCrab is the native iOS, iPadOS, Mac Catalyst, and Android client for OpenClaw Gateway — the open-source orchestration platform for self-hosted AI agents and local LLMs (Ollama, LM Studio, and friends).
It is deliberately not a consumer AI chat app. It is the small-screen admin console for people who run their own gateway and want first-class mobile + desktop access to the box doing the inference.
What it does
| Capability | Detail |
|---|---|
| Auto-discovery | Finds OpenClaw gateways on the local Wi-Fi via mDNS — no IP hunting |
| Manual connect | Bearer token + URL for remote access from anywhere |
| Config editor | Form over openclaw.json with typed fields, validation, and a diff-before-save sheet |
| Dashboard | Live gateway health, active model, version, capability readout |
| Model manager | View all configured models, swap the active one |
| AI recommendations | Ask the gateway's built-in AI CLI for config suggestions |
| Secure storage | Bearer tokens encrypted with AES-256-GCM via Android Keystore; never logged |
| Security banners | Amber/crimson warnings for HTTP and no-auth connections — no silent risks |
Platforms
| Platform | Min OS | Stack | Distribution |
|---|---|---|---|
| Android | 8.0 (API 26) | Kotlin 2.0 + Jetpack Compose | Play Store |
| iOS / iPadOS | 18.0 | Swift 6 + SwiftUI | TestFlight → App Store |
| macOS (Catalyst) | 14.0 Sonoma | Shared with iOS via Mac Catalyst | TestFlight (Mac) |
Both apps share the same Domain/Repository/ contract surface — frozen v1.0 interfaces with screen-by-screen feature parity between platforms. Single source of truth for behavior, idiomatic per-platform for UI.
Architecture (Android shown — iOS mirrors)
UI (Compose) → ViewModel (StateFlow) → Domain (interfaces) → Data (Ktor / NSD / DataStore)
Strict layer separation. Nothing skips a layer.
| Layer | Key classes |
|---|---|
| UI | NavGraph, screen composables, GhostCrabTheme, shared components (GlassSurface, CodeBlock, SecurityBanner) |
| ViewModel | One VM per screen, StateFlow<UiState>, SharedFlow for one-shot events |
| Domain | Frozen interfaces in domain/repository/, immutable models, sealed GatewayException hierarchy |
| Data | OpenClawApiClient (Ktor + OkHttp), NsdDiscoveryServiceImpl, ConnectionProfileStore (DataStore + EncryptedSharedPreferences) |
| DI | Koin — AppModule, DataModule, DomainModule, UiModule |
Domain interfaces are the v1.0 API surface and are frozen — implementations change, signatures don't.
Privacy posture
- No analytics, no ads, no cloud backend
- Connection profiles stored locally via DataStore
- Bearer tokens stored in EncryptedSharedPreferences (AES-256-GCM, Android Keystore)
Authorizationheaders stripped from all HTTP logs — verify withadb logcat | grep -i bearer- Nothing is sent to the developer
It's a tool for people who run their own infrastructure precisely because they don't want third parties between them and their inference workload. The app has to live by the same rule.
Why mobile-first
People who run homelab AI don't sit at the gateway machine. They're moving — kitchen, couch, office, away from home — and want to spot-check that Ollama is alive, swap the active model before a meeting, or fix a config when something breaks. SSH on a phone works, but is slow and bad for typing JSON. GhostCrab is the right form factor for the actual use case.