A cross-platform management frontend for the PicoClaw service — built with Kotlin & Compose Multiplatform.
Runs natively on Android · iOS · Desktop (macOS/Windows/Linux) · Web (Wasm/JS) from a single Kotlin codebase.
PicoClaw CMP is the Kotlin/Compose Multiplatform rewrite of the Flutter-based PicoClaw UI. It manages the PicoClaw service — a local network reverse proxy / tunnelling daemon — with a single, native UI across every platform.
| Tab | What it does |
|---|---|
| Dashboard | Service status, start/stop, public-mode toggle, live URL + scannable QR code |
| WebView | Embedded view of the PicoClaw local web UI |
| Logs | Real-time log viewer with filter, auto-scroll, and export |
| Config | Host/port/path, binary management (browse/validate/download), 6 themes, 12 languages, autostart |
- MVI architecture — unidirectional state flow, fully immutable state, 100 % testable core
- Runtime binary downloader — fetches the PicoClaw core from GitHub releases and installs it (Desktop + Android), no manual setup
- In-house QR encoder — pure-Kotlin QR code generation (ISO/IEC 18004), zero third-party libraries
- 6 themes — Carbon, Slate, Obsidian, Ebony, Nord, Sakura
- 12 languages — en, zh, es, fr, de, ru, pt, ja, ko, id, ar, hi
- Public mode — exposes the service on your LAN with an auto-detected, scannable IP
- Adaptive layout — bottom navigation on phones, side rail on tablets/desktop
| Feature | Android | Desktop (JVM) | iOS | Web |
|---|---|---|---|---|
| Service start/stop | ✅ foreground service | ✅ process spawn | — stub | — stub |
| Binary download | ✅ | ✅ | — | — |
| WebView | ✅ native | ✅ system browser | ✅ WKWebView |
— stub |
| Settings persistence | ✅ DataStore | ✅ DataStore | ✅ DataStore | in-memory |
| QR code | ✅ | ✅ | ✅ | ✅ |
| Concern | Choice |
|---|---|
| UI | Compose Multiplatform 1.11 |
| Language | Kotlin 2.3.21 (K2) |
| DI | Koin 4.1 |
| State | MVI + StateFlow + AndroidX Lifecycle ViewModel |
| Persistence | AndroidX DataStore (official KMP) |
| Serialization | kotlinx.serialization |
| Networking | java.net.HttpURLConnection (no third-party HTTP lib) |
- JDK 17+
- Android SDK (for the Android target)
- Xcode (for the iOS target, macOS only)
git clone https://github.com/MozeeB/picoclaw-cmp.git
cd picoclaw-cmpCreate a
local.propertieswith your Android SDK path (this file is not committed):sdk.dir=/path/to/your/Android/sdk
# Android
./gradlew :androidApp:installDebug
# Desktop (JVM)
./gradlew :desktopApp:run
# Web (WasmJS — recommended)
./gradlew :webApp:wasmJsBrowserDevelopmentRun
# Web (JS)
./gradlew :webApp:jsBrowserDevelopmentRun
# iOS — open ./iosApp in Xcode and run./gradlew :shared:allTests # all platforms
./gradlew :shared:jvmTest # JVM only (fastest)
./gradlew :shared:testAndroidHostTest # Android unit testsView (@Composable)
│ dispatches ServiceIntent
▼
ServiceViewModel ──► StateFlow<ServiceState> (immutable)
│ processes intent → new state │ observed by View
▼ ▼
CoreServiceAdapter (expect/actual) View recomposes
- Model —
ServiceState(immutabledata class) - Intent —
ServiceIntent(sealed interface) - ViewModel —
ServiceViewModel.onIntent()emits a new state for every change - Adapters — platform
expect/actualfor service control, settings, file pick, binary download
See CLAUDE.md for the full architecture, conventions, and contributor playbook.
shared/src/commonMain/kotlin/com/mozeeb/picoclaw/cmp/
├── mvi/ ServiceState · ServiceIntent · ServiceViewModel
├── core/ CoreServiceAdapter · BinaryDownloader · SettingsRepository · AppSettings
├── di/ Koin modules (AppModule + per-platform PlatformModule)
└── ui/ App · AppTheme · pages/ · widgets/ (incl. in-house QrCodeCanvas)
Contributions are welcome! Please read CONTRIBUTING.md and our Code of Conduct before opening a PR.
Licensed under the MIT License.
PicoClaw CMP is an independent open-source frontend. PicoClaw and the core binary are projects of Sipeed; this repository only provides a UI.