A KMP module has one commonMain source set, compiled for every target, plus one source set per target (androidMain, iosMain, jvmMain, jsMain, wasmJsMain) for code that needs that platform's APIs. Common code sees only the Kotlin standard library and multiplatform libraries: no java.io.File, no android.content.Context, no String.format(). The line between the two decides what you can share:
| Layer | Shared in commonMain with | Stays per platform |
|---|---|---|
| Models, rules, validation | Plain Kotlin | Nothing |
| Networking, JSON | Ktor 274,728 client (Ktor Client), kotlinx.serialization 5,947 | The HTTP engine (OkHttp 47,077 , Darwin, fetch) |
| Local database | Room 3 234 (Room 3.0), SQLDelight 6,887 | The driver and file location |
| Preferences, images | DataStore 234 , Coil 3 11,909 (Images with Coil and Glide) | Nothing |
| Dependency injection | Koin (Koin) | Hilt is Android-only |
| UI | Compose Multiplatform 25,990 , if you choose | SwiftUI or Jetpack Compose 234 otherwise |
| Camera, location, notifications | Thin interfaces only | CameraX 234 , Core Location, and so on |
JetBrains rates the core technology Stable for Android, iOS, desktop JVM, server and Kotlin/JS, and Beta for web through Kotlin/Wasm; Compose Multiplatform is Stable on Android, iOS and desktop and Beta on the web. No bridge or interpreter runs at run time. On Android, shared code is ordinary Kotlin in the APK; on iOS it is a native framework that Swift calls through an Objective-C header (a direct Swift export is in Alpha). Many teams share only the data layer and keep native UIs; others share UI too.