What Actually Is Kotlin Multiplatform?

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:

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.

KMP vs The Other Cross-Platform Disasters

What Actually Matters

KMP

Flutter

React Native

Language

Kotlin (good)

Dart (wtf is Dart?)

JavaScript (kill me)

UI

Native or Compose

Skia rendering everywhere

Native-ish via bridge

Performance

Actually native

Fast but feels off on iOS

Hope the bridge doesn't break

Learning Curve

Easy if you know Android

Learning Dart in 2025... why?

Easy if you hate yourself

Debugging

Works in familiar IDEs

Flutter Inspector is decent

Good luck with metro bundler

Build Times

Slow, especially iOS

Acceptable

Fast until you need CocoaPods

When It Breaks

Stack traces make sense

Error messages are cryptic

JavaScript. Just JavaScript.

Companies Actually Using KMP (Not Marketing BS)

Here's what actually happens when real companies try KMP in production, complete with the mistakes they don't mention in their tech blogs.

Netflix:

Internal Tools Only (Not What You Think)

Netflix uses KMP for their studio apps, not the streaming app you watch Netflix on.

These are internal tools for TV/film production crews—think crew scheduling, equipment management, script annotations. You can find technical implementation details and their [open-source contributions](https://github.com/Netflix

OSS).

Why internal tools first? Smart move. Lower user expectations, smaller blast radius when things break, and users who can't switch to a competitor when your app crashes.

They share about 50% of their code, which sounds disappointing until you realize that's still thousands of lines of business logic they don't have to maintain twice. The other 50% is platform-specific UI and integrations with iOS/Android APIs.

What they learned: Start with tools where perfect UI isn't critical.

Production crews care more about functionality than whether buttons look exactly like native iOS controls.

McDonald's: Payment Processing (High Stakes)

McDonald's went full KMP for their mobile app, handling 6.5 million monthly payments.

That's actually ballsy—payment processing is not where you want cross-platform bugs. Read their technical blog series and check the JetBrains case study.

They started with payment logic (smart—nobody wants different payment behavior per platform), then expanded to ordering, localization, and eventually rebuilt the whole app.

The real win? They merged their separate Android/i

OS teams into one mobile team. Less coordination overhead, shared knowledge, faster feature development.

The catch: Build times increased significantly. iOS builds that used to take 5 minutes now take 15-20 minutes.

They had to optimize their CI/CD pipeline and buy more powerful build machines.

Forbes: Media App Challenges

Forbes shares 80% of their app logic between platforms.

For a media company, that's actually impressive—article parsing, ad integration, analytics, user preferences, offline reading.

Their biggest surprise? Platform-specific article rendering was harder than expected. i

OS users expect different typography, spacing, and reading experiences than Android users. They ended up keeping more UI code separate than initially planned.

Learning: Just because you can share UI doesn't mean you should.

Reading experiences are deeply tied to platform conventions.

What These Success Stories Don't Tell You

Team Structure Reality

  • Netflix: Already had strong Android expertise and could hire iOS developers who were willing to learn Kotlin
  • McDonald's: Large enough engineering org to handle increased build complexity
  • Forbes: Mostly business logic sharing, native UI preserved

None of these are 3-person startups.

They all have the engineering resources to handle KMP's complexity.

The Build Time Problem Nobody Talks About

i

OS compilation with KMP is significantly slower than pure native. We're talking 2-3x longer build times in many cases. That's fine if you deploy twice a week, but painful if you're doing rapid iteration.

Real numbers from a mid-size team:

  • Pure iOS build: 3-4 minutes
  • KMP iOS build: 8-12 minutes
  • Android build:

Still fast (2-3 minutes)

Debugging Shared Code Is Still Pain

When shared business logic crashes on i

OS, debugging involves: 1.

Reproducing the issue in the iOS simulator 2. Finding the corresponding Kotlin code 3. Understanding the generated Objective-C headers that look like shared_module_kn_suspend_impl 4. Debugging through platform boundaries where stack traces just say "native code"

You'll spend hours on errors like NSInvalidArgumentException: unrecognized selector sent to instance when your expect/actual implementations don't match, or LLVM ERROR: out of memory during iOS compilation on machines with less than 16GB RAM.

The Kotlin/Native memory manager documentation becomes your bible.

Migration Patterns That Actually Work

Start Small (Netflix Approach)

Pick one feature that's mostly business logic—user preferences, data parsing, API calls.

Get comfortable with the tooling before expanding.

Payment-First (Mc

Donald's Approach) If you handle transactions, start there. Payment logic should be identical across platforms anyway, and it's complex enough to show real KMP benefits.

Green Field Projects

If you're building something new, KMP makes more sense than retrofitting existing apps. No legacy code, no "this worked fine in pure native" complaints.

Team Requirements Nobody Mentions

Minimum team size for KMP: 4-5 developers.

You need someone comfortable with Kotlin, someone who understands i

OS development, and someone willing to become the "KMP expert" who fixes build issues.

Don't try KMP if:

  • Your team is 1-2 people
  • Nobody has significant Android/Kotlin experience
  • You can't afford 20-30% longer build times
  • Your app is mostly UI with minimal business logic

Perfect KMP candidate:

  • Android-first company expanding to iOS
  • Complex business logic shared across platforms
  • Team willing to invest 2-3 months in tooling setup
  • Build pipeline that can handle longer compilation times

The companies succeeding with KMP aren't magical. They're just the right size with the right technical expertise and realistic expectations about the tradeoffs.

Kotlin Multiplatform: Questions Developers Actually Ask

Q

Is KMP actually stable or still experimental bullshit?

A

KMP hit stable in November 2023. Google officially supports it for business logic sharing. It's not experimental anymore, but that doesn't mean it's easy. Check the roadmap for what's coming next.

Q

How long does it take to add KMP to an existing app?

A

2-3 months minimum if you're starting from scratch with KMP knowledge. Add another month if your team is learning Kotlin. The build setup alone will take 1-2 weeks to get right.

Q

Do I need a Mac for iOS development with KMP?

A

Yes, obviously. KMP doesn't magically eliminate Apple's requirements. You still need Xcode, iOS simulators, and macOS for iOS builds. Sorry.

Q

Can I use existing Android libraries in shared code?

A

Only if they're multiplatform-compatible. Most Android libraries use Android-specific APIs and won't work in commonMain. Check this list for KMP-compatible libraries. Also see JetBrains' curated list and the official awesome-kotlin-multiplatform collection.

Q

Why are iOS builds so damn slow with KMP?

A

KMP compiles Kotlin to native code through LLVM, which is inherently slower than Swift compilation. Plus you're compiling for multiple targets. Budget 2-3x longer build times on iOS.

Q

How do I debug shared code when it crashes on iOS?

A

Hope you like Objective-C headers, because that's what you'll be reading. The stack traces point to generated Objective-C code, not your original Kotlin. Use SKIE to make this less painful. Also check TouchLab's debugging guide and the official debugging docs.

Q

What happens when shared code needs platform-specific functionality?

A

Use expect/actual declarations:

// commonMain
expect fun showToast(message: String)

// androidMain  
actual fun showToast(message: String) {
    Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}

// iosMain
actual fun showToast(message: String) {
    // iOS toast implementation
}

It gets verbose quickly with complex APIs.

Q

Can I use KMP for UI or just business logic?

A

Both. Compose Multiplatform went stable for iOS in May 2025. But shared UI will look slightly Android-ish on iOS. Native UI usually provides better user experience.

Q

How many developers do I need to make KMP worthwhile?

A

Minimum 4-5 developers. You need Android expertise, iOS knowledge, and someone willing to become the "KMP build expert" who fixes Gradle issues at 2am.

Q

Should startups use KMP?

A

Probably not. If you're a 2-person team, the overhead isn't worth it. Build native iOS and Android, or go full Flutter if you need cross-platform quickly.

Q

How do I convince my team to adopt KMP?

A

Start with a small proof-of-concept. Pick one feature (user preferences, API client) and implement it in KMP. Show the time savings on the second platform. Don't oversell—be honest about build time increases.

Q

What's the learning curve from pure Android development?

A

2-3 weeks to get comfortable with multiplatform concepts. The Gradle setup is more complex, and you'll need to understand platform-specific vs shared code boundaries.

Q

Which networking library should I use?

A

Ktor is the obvious choice, but it's more verbose than Retrofit. Apollo Kotlin works well for GraphQL. Avoid trying to make Retrofit multiplatform—it won't end well. Check the official networking guide and this comprehensive comparison.

Q

What about database access?

A

SQLDelight works today and generates type-safe code. Room multiplatform support is coming but not ready for production yet. See the database tutorial and Cash App's SQLDelight implementation.

Q

How do I handle dependency injection?

A

Koin is the path of least resistance. Dagger/Hilt don't work in shared code because they rely on Android-specific annotation processing.

Q

Is the development experience actually good?

A

Android Studio support is decent. iOS development still feels like an afterthought—you'll be switching between Android Studio and Xcode frequently. The hot reload story isn't as smooth as Flutter.

Q

My KMP project won't build on CI/CD. What's wrong?

A

Welcome to KMP. Your build.gradle files are probably misconfigured, you're missing iOS SDK dependencies, or your CI doesn't have the right versions of everything. Budget 2-3 days for CI setup.

Q

Shared code works on Android but crashes on iOS. Why?

A

Probably null safety issues or threading problems. iOS handles null values and background threads differently than Android. Use expect/actual for platform-specific implementations.

Q

Should I migrate my existing app to KMP?

A

Only if you have significant business logic duplication and the team size to handle the complexity. Don't migrate just because KMP exists. Most apps aren't good KMP candidates.

Q

When should I NOT use KMP?

A
  • Team smaller than 4 developers
  • App is mostly UI with minimal business logic
  • No Android/Kotlin expertise on the team
  • Can't afford 2-3x iOS build time increases
  • Need to ship features quickly without setup overhead

KMP isn't magic. It's a tool with specific use cases and real tradeoffs.

Actually Useful KMP Resources (Not Marketing Fluff)

Related Tools & Recommendations

compare
Similar content

Flutter vs React Native vs Kotlin Multiplatform: Choose Your Framework

The Real Question: Which Framework Actually Ships Apps Without Breaking?

Flutter
/compare/flutter-react-native-kotlin-multiplatform/cross-platform-framework-comparison
100%
alternatives
Recommended

Maven is Slow, Gradle Crashes, Mill Confuses Everyone

integrates with Apache Maven

Apache Maven
/alternatives/maven-gradle-modern-java-build-tools/comprehensive-alternatives
36%
tool
Similar content

Flutter Overview: Google's Cross-Platform Development Reality

Write once, debug everywhere. Build for mobile, web, and desktop from a single Dart codebase.

Flutter
/tool/flutter/overview
36%
tool
Similar content

DevToys: Cross-Platform Developer Utility Suite Overview

Cross-platform developer utility suite with 30+ essential tools for daily programming tasks

DevToys
/tool/devtoys/overview
32%
tool
Similar content

Parallels Desktop - Run Windows Apps on Your Mac Without Rebooting

Discover Parallels Desktop: run Windows applications seamlessly on your Mac without rebooting. Learn how it works, its benefits, and solve the 'one Windows app'

Parallels Desktop
/tool/parallels-desktop/overview
30%
tool
Recommended

Fix Flutter Performance Issues That Actually Matter in Production

Stop guessing why your app is slow. Debug frame drops, memory leaks, and rebuild hell with tools that work.

Flutter
/tool/flutter/performance-optimization
26%
integration
Recommended

How to Build Flutter Apps with Firebase Without Losing Your Sanity

Real-world production deployment that actually works (and won't bankrupt you)

Firebase
/integration/firebase-flutter/production-deployment-architecture
26%
tool
Recommended

Stripe Terminal React Native SDK - Turn Your App Into a Payment Terminal That Doesn't Suck

competes with Stripe Terminal React Native SDK

Stripe Terminal React Native SDK
/tool/stripe-terminal-react-native-sdk/overview
24%
integration
Recommended

Build a Payment System That Actually Works (Most of the Time)

Stripe + React Native + Firebase: A Guide to Not Losing Your Mind

Stripe
/integration/stripe-react-native-firebase/complete-authentication-payment-flow
24%
tool
Recommended

React Native - Cross-Platform Mobile Development Framework

competes with react-native

react-native
/tool/react-native/overview
24%
tool
Recommended

Android Studio - Google's Official Android IDE

Current version: Narwhal Feature Drop 2025.1.2 Patch 1 (August 2025) - The only IDE you need for Android development, despite the RAM addiction and occasional s

Android Studio
/tool/android-studio/overview
24%
tool
Recommended

JetBrains IntelliJ IDEA - The IDE for Developers Who Actually Ship Code

The professional Java/Kotlin IDE that doesn't crash every time you breathe on it wrong, unlike Eclipse

IntelliJ IDEA
/tool/intellij-idea/overview
24%
news
Recommended

Google Guy Says AI is Better Than You at Most Things Now

Jeff Dean makes bold claims about AI superiority, conveniently ignoring that his job depends on people believing this

OpenAI ChatGPT/GPT Models
/news/2025-09-01/google-ai-human-capabilities
24%
tool
Recommended

Google Kubernetes Engine (GKE) - Google's Managed Kubernetes (That Actually Works Most of the Time)

Google runs your Kubernetes clusters so you don't wake up to etcd corruption at 3am. Costs way more than DIY but beats losing your weekend to cluster disasters.

Google Kubernetes Engine (GKE)
/tool/google-kubernetes-engine/overview
24%
news
Recommended

Google Survives Antitrust Case With Chrome Intact, Has to Share Search Secrets

Microsoft finally gets to see Google's homework after 20 years of getting their ass kicked in search

google
/news/2025-09-03/google-antitrust-survival
24%
tool
Recommended

Xcode - The Only Way to Ship iOS Apps

integrates with Xcode

Xcode
/tool/xcode/overview
22%
tool
Recommended

Speed Up Xcode Builds and App Performance - Optimization Guide

integrates with Xcode

Xcode
/tool/xcode/performance-optimization
22%
tool
Recommended

Fix Common Xcode Build Failures and Crashes

integrates with Xcode

Xcode
/tool/xcode/troubleshooting-guide
22%
compare
Recommended

TurboTax vs FreeTaxUSA vs H&R Block vs TaxAct - Who Actually Costs Less?

I wasted way too many hours figuring out which tax software won't destroy your bank account

TurboTax
/compare/turbotax/taxact/hr-block/freetaxusa/cost-comparison-analysis
22%
tool
Recommended

H&R Block - Enterprise Tax Platform Running on Azure

They spent three years moving 30 years of tax data to the cloud and somehow didn't break tax season

H&R Block Tax Software
/tool/h-r-block/enterprise-technology
22%

Recommendations combine user behavior, content similarity, research intelligence, and SEO optimization