![]() |
An OSS Kotlin Multiplatform app for discovering, connecting, and controlling the MYND open-source hardware over Bluetooth LE using a modern Compose Multiplatform UI. |
- Scan for and connect to supported MYND devices
- Feature-driven controls, including:
- Auto‑off timer
- Battery and charging status
- Battery‑friendly charging
- Bluetooth and MCU firmware versions
- Device color
- ECO mode
- EQ gain
- LED brightness
- Master volume and mute
- Multipoint
- PartyLink broadcast
- Sound icons
- Source selection
Feature‑driven, testable KMP architecture with a clear separation of concerns.
graph TD
UI[Compose UI] --> VM[ViewModels]
VM --> Provider[DeviceFeatureProvider]
Provider --> Features[Features]
Features --> Connector[DeviceConnector]
Connector --> BF[BlueFalcon]
Connector --> KB[Kable]
Key points:
- UI in
composeApp/src/commonMainuses Compose Multiplatform with Voyager tabs/navigation. - DI via Koin wires the
DeviceConnectorimplementation and feature modules. DeviceConnectorabstracts BLE and exposes state/operations used by features.- Two BLE backends are available; BlueFalcon is default and optimized for Android+iOS here.
- The protocol layer implements MYND’s Actions protocol (command/response over a dedicated service/characteristics).
- You can find a full spec for this protocol and connection in
specs/mynd.txt.
- Default: BlueFalcon (
BlueFalconDeviceConnector) - Alternative: Kable (
KableDeviceConnector) - Switch at:
composeApp/src/commonMain/kotlin/de/teufel/openmynd/modules/core/di/DeviceConnectorModule.kt- Set
selectedBackendtoConnectorBackend.KABLE(default isConnectorBackend.BLUE_FALCON).
- Note: Seems with Kable we cannot raise MTU (e.g. to 512), which means we fail to communicate with MYND.
- Android: Requests Bluetooth runtime permissions in app (scan/connect; location may be needed on older OS versions). Accept them on first launch via the permissions screen.
- iOS: Ensure Bluetooth usage descriptions are present in your app’s
Info.plistwhen shipping to users.
| Android (Dark) | iOS (Light) |
|---|---|
![]() |
|
![]() |
|
![]() |
- JDK 17+
- Android Studio (Giraffe/Koala+ recommended) with Kotlin Multiplatform support
- Xcode (for iOS simulator/device)
- Android SDK installed and
local.propertiespointing to it - Optional: run
KDoctorfor environment checks
- Assemble debug APK:
./gradlew :composeApp:assembleDebug- Output:
composeApp/build/outputs/apk/debug/composeApp-debug.apk
- Run from Android Studio using the
composeAppconfiguration - Gradle Android config:
compileSdk = 35,targetSdk = 34,minSdk = 24- App id:
de.teufel.openmynd.androidApp
- Open
iosApp/iosApp.xcodeprojand run theiosAppscheme (device or simulator) - Or run from Android Studio’s iOS run configuration (KMP plugin)
- Simulator tests:
./gradlew :composeApp:iosSimulatorArm64Test
- Compose Multiplatform UI (Material 3, resources)
- Koin dependency injection, Kotlinx Coroutines/Serialization
- Voyager navigation/tabs, Napier logging, Kermit
- BLE: BlueFalcon (default) and Kable (alternative)
composeApp/— shared KMP module (Android + iOS).../modules/core— BLE, device models, features, protocol.../modules/screens— screens and feature UIs.../modules/navigation— tabs and root navigation.../modules/ui— common UI components, theme
iosApp/— iOS host app (Xcode project)
- For now, This repo is not actively maintained. Please fork it and feel free to make your own version. It is just provided as a reference.
MIT — see LICENSE.



