Choosing a mobile stack

What is cross-platform mobile development

Cross-platform mobile development builds iOS and Android apps from one codebase using Capacitor, Flutter, Kotlin Multiplatform, .NET MAUI or React Native.

11 min read

Quick answer

Cross-platform mobile development is building one application that runs on both iOS and Android from a single codebase, instead of writing and maintaining two separate native apps. The main approaches are Capacitor and other web wrappers, Flutter, Kotlin Multiplatform, .NET MAUI and React Native. They differ in what they share and in how they draw the screen.

What does cross-platform mean for a mobile app?

Your Android app is two sprints behind the iOS app again, and the planning board has a whole column labeled "Android parity." That column is what cross-platform development tries to delete.

An iPhone app is written in Swift or Objective-C against Apple's UIKit and SwiftUI. An Android app is written in Kotlin or Java against Android's view system and Jetpack Compose. Nothing in those two toolchains is shared. A company that wants both apps the traditional way runs two projects.

Cross-platform development replaces the two projects with one. You write the application once, in one language, and a framework produces an iOS app and an Android app from that source. What "produces" means varies, and that variation is the whole subject. Some frameworks hand your UI to the platform's own components, others draw every pixel themselves, and a third group shares only the logic. Web wrappers run a website inside a native shell.

Appfigures found that apps built with React Native or Flutter alone made up 15% of new App Store and Google Play releases in 2024, up from 7% in 2020. Most apps are still fully native, but the cross-platform share more than doubled in four years.

What are the main cross-platform frameworks?

The frameworks below are listed alphabetically. Each entry says what you write, what is shared, what stays native and what the approach is best for.

Capacitor and Ionic

Capacitor describes itself as a "cross-platform native runtime" for web apps: you build the app with HTML, CSS and JavaScript, and Capacitor packages it into a native iOS and Android shell that renders it in a web view. Ionic is a UI component library often used with it. Native features are reached through a plugin API in Swift and Java. Capacitor is maintained by Ionic, now part of OutSystems.

Shared: everything, because the UI is a web page. Stays native: the shell and any plugins. Best for: teams with an existing web app, and internal tools where feel matters less than shipping.

Flutter

Flutter is Google's "open-source framework for building beautiful, natively compiled, multi-platform applications from a single codebase". You write Dart. In release builds Dart is compiled to machine code, and the UI is drawn by Flutter's own rendering engine, Impeller. Flutter does not use the platform's widgets; its docs say it "has its own implementations of each UI control, rather than deferring to those provided by the system". Native APIs are reached through platform channels.

Shared: logic and UI. Stays native: anything behind a platform channel. Best for: custom, animation-heavy design systems meant to look identical on both platforms.

Kotlin Multiplatform

Kotlin Multiplatform (KMP), from JetBrains, "allows you to create applications for various platforms and efficiently reuse code across them while retaining the benefits of native programming". The default model shares business logic (networking, data models, validation) in Kotlin while each platform keeps a fully native UI. Compose Multiplatform extends sharing to the UI and is listed by JetBrains as stable on Android, iOS and desktop.

Shared: logic by default, UI optionally. Stays native: the UI, unless you adopt Compose Multiplatform. Best for: Android teams that already write Kotlin and want to share the non-UI half of the app with iOS.

.NET MAUI

.NET Multi-platform App UI is Microsoft's "cross-platform framework for creating native mobile and desktop apps with C# and XAML", covering Android, iOS, macOS and Windows. Your C# code talks to MAUI controls, which map to native platform controls through handlers.

Shared: logic and UI definitions. Stays native: the rendered controls, via handlers. Best for: organizations standardized on .NET, especially those that also ship Windows desktop apps.

React Native

React Native lets you write the app in JavaScript or TypeScript using React, and renders it with the platform's own UI components. The React Native docs put it this way: "At runtime, React Native creates the corresponding Android and iOS views for those components. Because React Native components are backed by the same views as Android and iOS, React Native apps look, feel, and perform like any other apps." A <View> is a UIView on iOS and a ViewGroup on Android. The JavaScript runs on the Hermes engine inside a native binary that ships through the stores. React Native was created at Facebook and, since February 2026, is owned by the React Foundation under the Linux Foundation.

Shared: logic and UI, rendered with platform views. Stays native: the views themselves, plus any custom native module in Swift or Kotlin. Best for: teams with web and React experience who want platform-native controls without two codebases.

How do the cross-platform frameworks compare?

ApproachLanguageUI rendering modelWhat is sharedBacked byBest for
Capacitor / IonicHTML, CSS, JavaScriptWeb viewEverything, as a web appIonic (OutSystems)Existing web apps, internal tools
FlutterDartOwn rendering engine (Impeller); does not use platform widgetsLogic and UIGoogleCustom, animation-heavy design systems
Kotlin MultiplatformKotlinNative UI per platform, or shared UI via Compose MultiplatformLogic by default; UI optionalJetBrainsAndroid teams sharing logic with iOS
.NET MAUIC#, XAMLNative controls through handlersLogic and UI definitionsMicrosoft.NET shops, Windows plus mobile
React NativeJavaScript, TypeScriptPlatform-native views (UIView, android.view) driven from JavaScriptLogic and UIReact Foundation (Linux Foundation); created at MetaWeb and React teams, platform-native controls

Sources: Capacitor docs, Flutter architectural overview, Kotlin Multiplatform, .NET MAUI, React Native docs, React Foundation.

What are the trade-offs of cross-platform development?

Performance. Every cross-platform approach adds a layer between your code and the platform. A web view is the slowest path for scrolling and gestures. Flutter and React Native both run large consumer apps; Shopify reported sub-500 ms P75 screen loads and over 99.9% crash-free sessions on React Native in January 2025. Native has the lowest floor: when Shopify rewrote its Shop app in Swift and Kotlin in 2026, iOS startup dropped from 3,200 ms to 2,466 ms and Android from 4,433 ms to 2,233 ms. Whether a gap of that size matters is a product question.

Platform access. New iOS and Android APIs arrive in Swift and Kotlin first. Every cross-platform framework needs someone to write a binding before shared code can call the new API. React Native, Flutter and KMP each have a path for this (a native module, a platform channel, an expect/actual declaration). The lag ranges from days to months.

Team. The language your team already writes is the biggest lever. The 2025 Stack Overflow survey found 66% of developers used JavaScript in the past year, 27.8% C#, 10.8% Kotlin, 5.9% Dart and 5.4% Swift. Cross-platform lets you staff a mobile app from the pool you already have. A web team maps to React Native or Capacitor, a .NET team to MAUI, an Android team to KMP. Flutter usually means hiring or training for Dart.

Cost. One codebase means one team, one backlog and one release, so each feature is built once plus a platform-specific allowance. incident.io reported that custom native work was about 2% of total effort on its React Native app. Your ratio will differ, but native is closer to two of everything.

When is native development the better choice?

Platform-first design. If the iOS and Android apps are meant to look and behave differently on purpose, following each platform's conventions to the letter, a shared UI works against you. KMP with native UI is the exception here, because it shares nothing visible.

Heavy 3D, AR and camera pipelines. Games, AR experiences and apps built around real-time video processing live close to Metal, ARKit and CameraX. A framework layer adds latency and a binding problem for every new API.

When the parity cost disappears. Shopify's stated reason for moving back to native in September 2026 was that coding agents had cut the cost of keeping the two platforms at parity. If you can afford to build twice, the economic argument for sharing weakens. Shopify did it with six senior engineers and a purpose-built agent workflow.

One platform, few screens. If you only ship iOS and the app is small, Swift is the simplest path.

Which companies use cross-platform frameworks?

These companies name their framework in public. Frameworks are listed alphabetically.

Flutter. The Flutter showcase lists Google products (Google Pay, Google Earth, Google Ads, Google Classroom) and companies including BMW, Toyota, eBay Motors, Nubank, Headspace, Alibaba Group and the New York Times.

Kotlin Multiplatform. JetBrains' KMP page names Duolingo, Netflix, McDonald's, Booking.com, Forbes, Philips and Quizlet among others.

React Native. The React Native showcase lists Meta (Facebook, Facebook Ads Manager, Meta Horizon, Messenger Desktop), Microsoft (Office, Outlook, Teams, Xbox Game Pass), Amazon (Shopping, Alexa, Photos, Kindle) and Wix. Coinbase moved its iOS and Android apps to React Native in January 2021. Bluesky's app is open source and written in React Native. Shopify used React Native across its apps for five years and announced in September 2026 that it is moving to native.

What should you ask before you pick a framework?

QuestionShort answer
What does "cross-platform" share?Depends on the approach: everything (web wrapper), logic and UI (Flutter, React Native, MAUI), or logic only by default (KMP)
Does the UI use real platform components?React Native and MAUI: yes. KMP with native UI: yes. Flutter: no, it draws its own. Web wrapper: no, it is a web page
Is the output a native binary?Yes for all five; they differ in what runs inside it
Can I call a new iOS or Android API on day one?Only through a native binding you or a library author writes
Biggest factor in choosing?The language your team already writes

Where Expo fits

Expo is an open-source framework for React Native apps and the way Meta recommends everyone build with React Native: the React Native team's June 2024 post names Expo as "the only recommended community framework". Expo adds file-based routing with Expo Router, a library of native modules, web support from the same codebase, and Continuous Native Generation, which generates the iOS and Android projects from app.json so that, in a cloud workflow, developers never install Xcode. The framework is free and MIT-licensed. Expo Application Services (EAS) is an optional paid layer for cloud builds, store submission and JavaScript updates, with a Free plan covering 15 Android and 15 iOS builds a month.

Limitations

Expo is React Native only; it does not apply to Flutter, KMP or MAUI projects. Expo Go, the sandbox app, is not for production; production apps use a development build and a store build.

Next step

If your team writes JavaScript, read What is React Native next. If it writes Kotlin, start with JetBrains' Kotlin Multiplatform guide. If it writes Dart, the Flutter documentation is the place to go.

Verified on 12 September 2026.

Keep reading

Frequently Asked Questions