Two Philosophies for Cross-Platform Mobile
React Native and Kotlin Multiplatform both solve the same problem: shipping iOS and Android apps without maintaining two completely separate codebases. But they solve it in fundamentally different ways, and the difference matters more than most comparison articles let on.
React Native, backed by Meta, takes the "share everything" approach. You write your UI, business logic, navigation, and state management in JavaScript or TypeScript. React Native renders genuine native platform components (UIKit on iOS, Android Views or Compose on Android) through the JavaScript Interface (JSI). Your code lives in one place, your UI renders natively, and a single team can own the entire mobile product. This is the model that powers Instagram, Shopify, Discord, and Coinbase.
Kotlin Multiplatform (KMP), backed by JetBrains and endorsed by Google as the recommended approach for sharing business logic on Android, takes a different stance. KMP shares only the logic layer: networking, data persistence, validation, state management, and business rules. The UI stays fully native on each platform. Your iOS team writes SwiftUI. Your Android team writes Jetpack Compose. The shared Kotlin module compiles to a native framework on iOS and runs on the JVM on Android. Netflix, McDonald's, Cash App, VMware, and Philips all run KMP in production.
This architectural split is not a minor detail. It shapes your hiring plan, your team structure, your performance ceiling, and how your app feels in a user's hand. Let's break down exactly where each framework excels and where it falls short so you can make the right call for your product.
Architecture Deep Dive: How They Actually Work
Understanding the architecture is not academic. It directly determines what kinds of bugs you will fight, what performance characteristics you will see, and how your team is organized day to day.
React Native's Architecture
React Native's New Architecture (shipped as default since RN 0.76+) replaced the old asynchronous bridge with three core components. First, JSI (JavaScript Interface) allows JavaScript to hold direct references to C++ host objects. This means native calls are synchronous and avoid the old JSON serialization bottleneck entirely. Second, Fabric is the new rendering system that creates the shadow tree in C++ rather than in Java/Objective-C, enabling concurrent rendering and better integration with platform gesture systems. Third, TurboModules replace the old Native Modules with lazy-loaded, type-safe interfaces that only initialize when first accessed.
The practical result: React Native in 2026 is dramatically faster than the React Native of 2022. The bridge is gone. Native calls are synchronous. The rendering pipeline is concurrent. For the vast majority of apps, the performance gap between React Native and fully native code has become negligible.
Your entire codebase lives in TypeScript. Components, screens, navigation, API calls, state management, offline storage, push notification handlers: all of it is JavaScript/TypeScript. When you need to drop into native code for a platform-specific feature (say, a custom camera pipeline or a Bluetooth integration), you write a TurboModule in Swift or Kotlin and expose it to your JS layer.
Kotlin Multiplatform's Architecture
KMP takes a layered approach. You write a shared Kotlin module that contains your domain models, business logic, networking layer (typically Ktor), data persistence (SQLDelight or Room), and state management. This shared module compiles to a native binary on iOS via Kotlin/Native (using LLVM) and runs as standard Kotlin on the JVM for Android.
The key insight is that KMP's shared code appears as a regular Swift framework on iOS. Your iOS developers import it like any other dependency. They do not need to learn Kotlin to consume the shared logic. They call Kotlin functions as if they were Swift functions, with type mappings handled automatically by the Kotlin/Native compiler. On Android, the shared module is just Kotlin, so integration is seamless.
The UI layer is completely independent on each platform. Your iOS team builds screens in SwiftUI. Your Android team builds screens in Jetpack Compose. They both consume the same shared business logic, but the visual layer is 100% platform-native. There is no abstraction layer, no bridge, and no rendering engine sitting between your UI code and the operating system.
This architecture means you typically need developers on both platforms, but they share significantly less duplicated logic. For a deeper look at how this compares when you add Flutter into the mix, see our three-way framework comparison.
Performance: Where the Differences Are Real
Performance debates in cross-platform mobile development generate more noise than signal. Synthetic benchmarks rarely map to user-visible behavior. That said, the architectural differences between React Native and KMP do produce measurable differences in specific, well-defined scenarios.
Startup Time
KMP apps have faster cold starts. The shared Kotlin code compiles to native machine code on iOS (via LLVM) and runs on the already-warm JVM on Android. There is no JavaScript engine to initialize, no bytecode to load, and no runtime to bootstrap. React Native must initialize the Hermes engine, load the JavaScript bundle, and execute the entry point before the first frame renders. The Hermes engine is fast (it compiles JS to bytecode at build time, not runtime), but it still adds 50 to 200ms of startup overhead compared to fully native code. For most apps, users will not perceive this difference. For apps that are launched frequently and briefly (utilities, quick-action widgets, notification handlers), it can matter.
Runtime Performance
For CPU-intensive operations like JSON parsing, cryptographic calculations, image processing, and complex data transformations, KMP code runs significantly faster. Kotlin/Native compiles to LLVM-optimized machine code that executes at near-C speeds. JavaScript on Hermes is a bytecode interpreter optimized for startup time and memory usage, not raw throughput. In benchmarks, Kotlin/Native outperforms Hermes by 3x to 10x on compute-heavy tasks.
For UI rendering, the comparison is more nuanced. KMP with native UI (SwiftUI, Jetpack Compose) delivers identical rendering performance to a fully native app because it is a fully native app at the UI layer. React Native's Fabric renderer creates native components, so scrolling, animations, and layout performance are very close to native. The gap shows up in complex gesture-driven interactions and heavy list rendering, where React Native occasionally drops frames that a fully native implementation would not.
Memory Usage
KMP apps generally use less memory. There is no JavaScript runtime consuming heap space, no JSI bridge layer, and no shadow tree maintained in C++. The shared Kotlin module compiles to a lean native binary. React Native apps carry Hermes (roughly 5 to 15MB), the Fabric renderer, and the JS bundle in memory. For modern devices with 6 to 12GB of RAM, this difference is irrelevant. For older Android devices or background processing scenarios where the OS aggressively kills memory-hungry apps, KMP has a structural advantage.
The Honest Take
If your app is a social feed, a marketplace, a fintech dashboard, or an e-commerce platform, React Native's performance is more than sufficient. The New Architecture with JSI closed the gap dramatically. If your app does heavy computation, processes large datasets on-device, or needs to run reliably in memory-constrained environments, KMP gives you a meaningful edge. For a broader look at when cross-platform performance is "good enough" versus when you need fully native, see our native vs cross-platform guide.
Developer Experience and Tooling
Performance matters, but developer velocity is what determines whether you ship on time. The day-to-day experience of building, debugging, and iterating on each framework is wildly different.
React Native with Expo
Expo has transformed React Native development. If you are starting a new React Native project in 2026 and not using Expo, you are making your life harder for no reason. Expo SDK 52+ gives you managed builds (no Xcode or Android Studio required for most workflows), over-the-air updates via EAS Update, zero-config TypeScript, a massive library of pre-built native modules (camera, file system, notifications, haptics, sensors), and a development client that supports hot reload with state preservation.
The developer loop is fast. You write TypeScript in VS Code, save, and see the change on your device or simulator within one to two seconds. Debugging happens in Chrome DevTools or Flipper. State management, navigation (React Navigation or Expo Router), and API calls use the same patterns your team already knows from React web development. If your team builds React web apps, they will be productive in React Native within two to three weeks.
The tradeoff is that when you need to go beyond Expo's managed workflow (custom native modules, specific native SDK integrations, or advanced build configurations), you "eject" to the bare workflow. This gives you full access to Xcode and Android Studio projects, but the simplicity of the managed workflow disappears. Expo has narrowed this gap significantly with Config Plugins and custom development clients, but complex native integrations still require native platform expertise.
Kotlin Multiplatform
KMP development happens primarily in Android Studio or IntelliJ IDEA. For the shared Kotlin module, the experience is excellent: full IDE support, code completion, refactoring tools, and debugging work as expected. Writing shared business logic in Kotlin is a productive experience, especially for teams already comfortable with the language.
The friction appears at the boundary between shared code and platform-specific code. On Android, the integration is seamless because everything is Kotlin. On iOS, the experience has improved but is not yet frictionless. The Kotlin/Native compiler generates Swift-compatible frameworks, and the interop is generally good. However, you will encounter rough edges: Swift generics do not map perfectly to Kotlin generics, suspend functions require adapters to work with Swift's async/await, and debugging shared code running on iOS still requires switching between IDEs.
The tooling story is improving rapidly. The KMP plugin for Android Studio handles project configuration and dependency management. SKIE (Swift Kotlin Interface Enhancer) by Touchlab generates more idiomatic Swift APIs from Kotlin code. KMMBridge simplifies the process of publishing shared modules as SPM or CocoaPods packages. But the ecosystem is younger than Expo's, and you will spend more time on build configuration and interop issues than you would on a pure React Native project.
Which Is Faster to Build With?
For a single team building a complete app, React Native with Expo is faster. One codebase, one language, one build system. For an organization with separate iOS and Android teams that want to eliminate duplicated business logic without rewriting their UI layers, KMP is the more natural fit. It meets native teams where they already are.
Ecosystem, Libraries, and UI Sharing
The size and maturity of each framework's ecosystem directly impacts how fast you can ship features. A missing library can easily cost two to four weeks of custom development.
React Native's Ecosystem
React Native has the largest third-party ecosystem of any cross-platform mobile framework. The npm registry gives you access to thousands of mobile-ready packages. Navigation (React Navigation, Expo Router), state management (Zustand, Jotai, Redux Toolkit), animations (Reanimated, Moti), UI component libraries (Tamagui, NativeWind, Gluestack), forms (React Hook Form), and API clients (TanStack Query, Axios) are all mature and actively maintained.
Most SaaS platforms ship React Native SDKs: Stripe, Sentry, Amplitude, Firebase, Auth0, OneSignal, LaunchDarkly. When an SDK does not exist, you can bridge to the native iOS or Android SDK using TurboModules. The ecosystem's breadth means you will almost never need to build a core feature from scratch.
React Native also offers something KMP traditionally does not: full UI code sharing. You write your screens once in JSX, and they render on both iOS and Android. If you use Expo with React Native Web, you can share significant portions of your UI code with a web app as well. For startups that need a mobile app and a web app, this is a compelling advantage.
KMP's Ecosystem
KMP's library ecosystem is smaller but strategically focused. The core libraries are solid: Ktor for networking, kotlinx.serialization for JSON, kotlinx.coroutines for async operations, SQLDelight for local databases, Koin or Kodein for dependency injection, and Napier for logging. These cover the most common needs for a shared business logic layer.
The gap shows in specialized areas. You will not find as many pre-built multiplatform libraries for analytics, crash reporting, or niche third-party service integrations. However, KMP's architecture makes this less painful than it sounds. Because the platform-specific layer is fully native, you can use any existing Swift or Kotlin library directly. A missing multiplatform library for iOS push notifications, for example, simply means you write the push notification code in Swift on iOS and Kotlin on Android, which is exactly what you would do in a fully native project.
Compose Multiplatform: KMP Gets UI Sharing
The biggest shift in the KMP ecosystem since 2024 is the maturation of Compose Multiplatform. Built on Jetpack Compose, Compose Multiplatform lets you write shared UI code in Kotlin that renders on iOS, Android, desktop, and web. This directly challenges React Native's core advantage of shared UI code.
Compose Multiplatform for iOS reached stable status in 2025, and adoption has been growing steadily. Companies like JetBrains, Instacart, and several fintech startups have shipped production apps with Compose Multiplatform. The rendering quality on iOS is good, with smooth animations and responsive layouts. However, the component ecosystem is still maturing. You will find fewer pre-built UI components compared to React Native's library ecosystem, and platform-specific behaviors (iOS navigation patterns, pull-to-refresh physics, haptic feedback) require manual implementation.
If you choose KMP with Compose Multiplatform, you get the best of both worlds in theory: shared business logic and shared UI, all in Kotlin, compiling to native. In practice, you are betting on a younger ecosystem with fewer battle-tested components. For teams that are already invested in Kotlin and Compose, this is a reasonable bet. For teams starting fresh, React Native's ecosystem maturity is a safer choice today.
Hiring, Team Structure, and Cost
Your framework choice determines who you need to hire, how your team is organized, and what your long-term staffing costs look like. For most companies, this matters more than any performance benchmark.
React Native: One Team, One Language
React Native draws from the enormous JavaScript/TypeScript developer pool. A strong React web developer can become productive in React Native within weeks, not months. You can hire from the largest developer community in the world and get mobile capability without requiring prior mobile experience. Senior React Native developers command $150K to $200K in the US market (2026 rates), and the supply is healthy.
The team structure is straightforward. A single cross-functional team of React Native developers owns both iOS and Android. You do not need separate platform teams. For startups and mid-stage companies, this simplicity reduces coordination overhead and speeds up decision-making. One person can own a feature from design through implementation to deployment on both platforms.
The risk is that React Native developers who have never worked with native mobile code may struggle when they hit the edges of the framework. Deep linking, background processing, Bluetooth integrations, and platform-specific accessibility features often require native expertise. Having at least one developer on the team with native iOS or Android experience is a smart hedge.
KMP: Leverage Your Existing Native Teams
KMP hiring targets a different talent pool. You need Kotlin developers (readily available from the Android community) and ideally Swift developers for the iOS UI layer. Senior Kotlin developers command $150K to $200K, and senior iOS developers command $155K to $210K. If you are building two platform-specific UIs, you need developers on both platforms, which increases headcount compared to a single React Native team.
However, if you already have native iOS and Android teams, KMP is the lowest-friction path to code sharing. Your Android developers already write Kotlin. Your iOS developers consume the shared module as a Swift framework. Nobody needs to learn a new language or framework from scratch. The shared module eliminates duplicated business logic, which means your teams spend less time writing the same networking, validation, and persistence code twice.
Companies like Netflix adopted KMP specifically because they had strong native teams and did not want to rewrite their apps in a different framework. Cash App chose KMP to share complex financial logic across platforms while keeping native UIs that matched each platform's design language perfectly.
Cost Comparison
For a new project with no existing mobile team, React Native is almost always cheaper. One team, one codebase, faster time to market. For an organization with existing native mobile teams, KMP reduces cost by eliminating duplicated logic without requiring a costly full rewrite. The "cheaper" option depends entirely on your starting point.
When to Choose React Native vs KMP
After working with both frameworks across dozens of projects, here is the honest guidance. Skip the hype and look at your situation.
Choose React Native When:
- Your team knows JavaScript/TypeScript. The fastest path to shipping is the one that uses your existing skills. A React web team can ship a React Native MVP in 6 to 8 weeks.
- You need to share code with a web app. React Native with Expo and React Native Web lets you share components, hooks, API clients, and business logic between your mobile app and your web app. No other framework matches this level of web-mobile code reuse.
- You are a startup optimizing for speed and cost. One team, one codebase, one deployment pipeline. React Native with Expo is the fastest way to get a quality app into the App Store and Google Play.
- Your app is UI-centric. Social feeds, e-commerce, content platforms, fintech dashboards, marketplaces. React Native handles these patterns extremely well with its mature component ecosystem.
- You want the largest talent pool. JavaScript developers outnumber Kotlin developers roughly 3-to-1 globally. Hiring is faster and often cheaper.
Choose Kotlin Multiplatform When:
- You have existing native iOS and Android teams. KMP lets you introduce code sharing incrementally without rewriting your apps. Start by sharing the networking layer, then expand to business logic, then state management. No big-bang migration required.
- Performance is a hard requirement. Financial trading apps, real-time audio/video processing, on-device ML inference, health monitoring with sensor data. If your app does heavy computation, KMP's native compilation gives you a real advantage.
- You need platform-perfect UI fidelity. Banking apps, healthcare apps, and enterprise tools that must look and behave exactly like native apps on each platform. KMP with SwiftUI and Jetpack Compose delivers native UX that is indistinguishable from a fully native app because it is one.
- Your backend is Kotlin/JVM. If your server runs Kotlin (Ktor, Spring Boot), KMP lets you share data models, validation rules, and business logic between your backend and your mobile clients. This is a powerful advantage that reduces bugs caused by mismatched models across client and server.
- You are building for the long term. KMP's architecture ages well. As SwiftUI and Jetpack Compose evolve, your UI layer automatically gets better. You are not locked into a framework's rendering pipeline or component library.
Real Migration Stories
Touchlab, the consultancy behind SKIE and KMMBridge, has documented multiple successful migrations from React Native to KMP for clients in fintech and healthcare where performance and native fidelity were top priorities. On the other side, several enterprise companies have migrated from fully native codebases to React Native (Shopify's Shop app and Microsoft's Office apps being the most prominent examples) to consolidate teams and accelerate feature delivery.
The pattern is consistent: companies move toward React Native when they want speed and team consolidation. They move toward KMP when they want native fidelity and have existing platform teams. Neither direction is universally "better." The right choice depends on your constraints.
For a detailed comparison of how these two frameworks stack up against Flutter, check our React Native vs Flutter guide as well.
Making Your Decision: A Practical Framework
Here is a decision framework you can apply to your specific situation right now.
Step 1: Audit your team. If you have JavaScript/TypeScript developers and no native mobile expertise, React Native is the clear choice. If you have Kotlin and Swift developers, KMP will feel natural. If you have a mixed team, consider which skill set is stronger and which you can hire for more easily in your market.
Step 2: Define your UI requirements. If your app needs to look and behave identically to native platform apps (matching iOS and Android conventions precisely), KMP with native UIs is the best path. If your app has a custom design language that does not need to match platform conventions, React Native's shared UI approach saves significant development time.
Step 3: Map your product roadmap. If you plan to build a web app alongside your mobile app, React Native gives you code sharing opportunities that KMP cannot match. If your roadmap includes performance-intensive features (real-time data processing, on-device inference, complex animations tied to sensor data), KMP gives you headroom that React Native may not.
Step 4: Consider your timeline. If you need to ship an MVP in 8 weeks, React Native with Expo is the fastest path. If you are building a product that needs to be maintainable and performant over a 5-year horizon, both frameworks are viable, but KMP's architecture tends to scale more gracefully because each platform's UI layer can evolve independently.
Step 5: Test before you commit. Build a small proof of concept in both frameworks. Implement your most complex screen and your most compute-heavy feature. Measure startup time, memory usage, and frame rates on real devices. The data from your own app is worth more than any comparison article, including this one.
Cross-platform mobile development in 2026 is not about picking the "best" framework. It is about picking the framework that fits your team, your product, and your constraints. React Native is the better default for most startups and teams coming from the web. KMP is the better choice for teams with native expertise building performance-critical products. Both are production-ready, both are backed by major companies, and both will be around for the long haul.
If you are still unsure which framework fits your project, we can help. We have shipped production apps with both React Native and KMP, and we will give you an honest recommendation based on your product, your team, and your budget. Book a free strategy call and let's figure it out together.
Need help building this?
Our team has launched 50+ products for startups and ambitious brands. Let's talk about your project.