Check out my personal blogsVisit maxrave.dev
SimpMusicSimpMusic Docs
For Developers

Architecture

How SimpMusic is built — Kotlin Multiplatform, Clean Architecture, MVVM, and the FOSS/Full split.

SimpMusic is a Kotlin Multiplatform (KMP) app built with Compose Multiplatform, sharing UI and logic across Android and Desktop (JVM).

iOS targets are declared in many modules, but the iOS app is not shipped yet.

Clean Architecture

The codebase is organized into three layers, enforced by the direction of module dependencies:

  • Domain — platform-agnostic models and contracts (entities, manager interfaces). Depends only on the common module; no framework code.
  • Data — repository implementations, the Room database, DataStore, parsers and Koin DI modules. Depends on domain + common and aggregates the service modules.
  • Presentation (composeApp) — Compose Multiplatform screens with MVVM ViewModels. Depends on domain/common and on data.

The two app modules — androidApp and desktopApp — are thin shells over composeApp.

MVVM

ViewModels live in composeApp/.../viewModel and are provided through Koin (koin-compose-viewmodel); Compose screens observe them via lifecycle-aware state.

Kotlin Multiplatform source sets

  • commonMain holds the bulk of the shared logic and UI.
  • expect/actual bridges platform differences — the clearest example is MusicDatabase (common declaration + .android.kt / .jvm.kt / .ios.kt actuals).
  • Platform engines differ by target: OkHttp (Android/JVM) vs Darwin (iOS) for the Ktor client; Media3/ExoPlayer on Android vs VLC on Desktop for playback.

Tech stack at a glance

ConcernChoice
Language / buildKotlin 2.4, KSP, AGP 9
UICompose Multiplatform 1.11 + Material 3
Dependency injectionKoin
NetworkingKtor (OkHttp / Darwin engines)
DatabaseRoom (KMP) + DataStore
ImagesCoil
PlaybackMedia3/ExoPlayer (Android), VLC/VLCJ (Desktop)
Lyrics / AILRCLIB & others; Gemini / OpenAI
Crash reportingSentry (Full build only)

FOSS vs Full

The FOSS/Full distinction is not an Android product flavor — it's driven by the Gradle property isFullBuild. It gates two module pairs, each a real implementation plus a no-op twin exposing the same API:

CapabilityFull buildFOSS build
Crash reporting:crashlytics (Sentry):crashlytics-empty
Google Cast:cast (Cast SDK):cast-empty

Both stubs exist for F-Droid compliance — the FOSS build links no proprietary SDK, which means casting is unavailable in FOSS builds.

Learn more

Community

Get involved in our community. Everyone is welcome!

SimpMusic is sponsored by:

Get free $200 credit over 60 days on DigitalOcean: GET NOW

Crowdin and Sentry both have a free enterprise plan for Open-source projects. Follow the URLs:

Check out the Vercel open-source program

SimpMusic app is FOSS and under GPL-3.0 license.

© 2023-2026 SimpMusic - @maxrave-dev

We are not affiliated with or endorsed by Google, YouTube, Spotify, or any other third-party brands or applications.