← Back to Blog

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)
  • Authorization headers stripped from all HTTP logs — verify with adb 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.