What we build with it

Kotlin Multiplatform takes the opposite bet from Flutter. Instead of sharing the whole app including its UI, you share only the parts that have no business being written twice — networking, models, validation, persistence, business rules — and each platform builds its own interface in SwiftUI or Jetpack Compose.

The shared code is Kotlin, compiled to a native framework on iOS and to normal Kotlin on Android. From the iOS side it is just a library.

Where it fits

Products with existing native apps and existing native teams. That is the case KMP is genuinely good at: you can move one module — the API client, the offline cache — into shared code without rewriting either app or asking anyone to give up their platform.

It also fits products where the UI must be so platform-native that a cross-platform renderer is a liability, but where the domain logic underneath is identical.

When we recommend it

When you already have two native codebases and want to stop maintaining the same logic twice, or when the interface genuinely has to be built natively on both platforms anyway.

Not for a product starting from zero with one team. There, KMP means writing the UI twice — the expensive half — and you have taken on a cross-platform toolchain without the saving that justifies it. Flutter is usually the better trade, and we will say so.

Be honest about the iOS side too: debugging shared Kotlin from Xcode is workable but not pleasant, and the tooling is meaningfully younger than Flutter's.