JetBrains finally made a cross-platform tool that doesn't completely suck. KMP hit stable in November 2023, and Google officially supports it for sharing business logic between Android and iOS. The Kotlin Foundation now oversees the language development, while JetBrains maintains the toolchain. Took them long enough.
How This Thing Actually Works
The magic happens with three folders that will confuse the hell out of iOS developers:
- commonMain: Your business logic goes here. Write once, pray it works everywhere.
- androidMain: Platform-specific Android code and the usual Android bullshit
- iosMain: iOS-specific implementations. Good luck debugging this on a Mac.
The expect/actual
mechanism is KMP's secret sauce. You declare what you expect in common code, then provide actual implementations per platform. It's like interfaces but more annoying to set up initially.
// In commonMain
expect fun getCurrentPlatform(): String
// In androidMain
actual fun getCurrentPlatform(): String = "Android"
// In iosMain
actual fun getCurrentPlatform(): String = "iOS"
Two Ways to Not Hate Your Life
Option 1: Share Logic, Keep Native UI
Share your business logic, keep platform UIs native. Your users get the native feel, you get to write your API calls once. Netflix does this for their studio apps—not the main Netflix app, just internal tools most people never see.
Option 2: Go Full Compose Multiplatform
Compose for iOS went stable in May 2025. Now you can share UI too, but your app will look slightly off on iOS because Compose still feels like Android UI. iOS users will notice.
Libraries That Don't Completely Suck
The ecosystem finally has useful stuff:
- Ktor: HTTP client that works everywhere. Better than Retrofit for multiplatform, though setup is more verbose. Full KMP setup guide here.
- SQLDelight: Type-safe SQL that actually compiles. Room for KMP is coming but SQLDelight works today. Check the multiplatform database guide.
- Koin: Dependency injection without annotation processors breaking your build. Better than Dagger for shared code.
- Napier: Logging that works on iOS. Surprisingly not painful. Alternative to Kotlin logging.
- Kotlinx.serialization: JSON parsing that doesn't randomly break between platforms. More reliable than Gson for KMP.
- Coroutines: Async programming that works across platforms, though iOS threading is tricky.
Real Companies Using This in Production
McDonald's handles 6.5 million payments monthly with KMP. Started with payments (smart—nobody wants payment logic to randomly break differently per platform), then expanded to the whole app. Check JetBrains case studies for more details.
Forbes shares 80% of their app logic between iOS and Android. Not bad for a media company that probably has more content than engineering resources. See their technical deep dive.
Netflix uses it for internal studio apps—the ones production crews use, not the consumer app you binge-watch on. Makes sense since those tools have complex workflows and a small user base. TouchLab has a detailed analysis of their implementation.
Other notable adopters include Cash App, 9GAG, VMware, and Philips Healthcare.
Performance: Actually Native
Unlike React Native's JavaScript bridge or Flutter's custom rendering, KMP compiles to actual native code. Android gets JVM bytecode, iOS gets native machine code. No interpretation layers, no weird performance quirks at runtime.
The catch? iOS builds will make you question your life choices. We're talking 15-20 minutes versus 5 minutes for pure native. LLVM compilation is brutal, and Xcode randomly breaks KMP builds after updates with cryptic linker errors. Budget 2-3 days just to get CI working reliably, and expect your iOS developers to hate you for a few weeks.
The Real Learning Curve
If you're coming from pure Android development, expect about 2-3 weeks to get comfortable with the multiplatform setup. The Gradle configuration is more complex, and you'll spend time figuring out which dependencies work across platforms.
iOS developers will have a steeper curve learning Kotlin and Gradle. Expect 4-6 weeks minimum, and they'll complain about missing Xcode's integrated debugging tools the entire time. Watch them rage when they get duplicate symbols for architecture x86_64
errors from CocoaPods integration issues, or when Gradle sync takes 10 minutes on bad days while Xcode builds fly by.