June 8, 2026

React Native vs Flutter in 2026: A Brutally Honest Comparison

June 8, 2026
CTO at Plus8Soft
Pavel Popov
CTO
flutter vs react native

React Native vs Flutter: Quick Overview

The cross-platform mobile debate has narrowed to two serious contenders. React Native, built by Meta, lets JavaScript developers build native mobile apps. Flutter, built by Google, uses Dart and its own rendering engine to draw every pixel from scratch.

Both frameworks matured significantly in 2026. React Native shipped its New Architecture (Fabric, JSI, TurboModules) as the default. Flutter’s Impeller rendering engine eliminated shader compilation jank entirelyUpdate: Impeller dramatically reduced shader compilation jank — not eliminated entirely. Edge cases remain (see Impeller section below). The Flutter team themselves note: “the vast majority of open issues around shader compilation causing jank have been fixed — we know there is more work to do.” The gap between them is smaller than ever, which makes the decision harder, not easier.

Here’s an honest breakdown:

What Is React Native?

React Native is an open-source framework created by Meta in 2015. It uses JavaScript (or TypeScript) and React’s component model to build mobile applications that render using actual native UI components — the same buttons, text inputs, and scroll views that a Swift or Kotlin app would use.

The framework works by running JavaScript logic on a separate thread and communicating with native components through a bridge. In 2024, React Native’s New Architecture replaced the old asynchronous bridge with JSI (JavaScript Interface), enabling synchronous, direct communication between JavaScript and native code. The Fabric renderer replaced the old UI manager, and TurboModules replaced the old native module system.

Companies using React Native: Meta (Facebook, Instagram, Messenger), Microsoft (Office, Outlook, Teams, Xbox Game Pass), Amazon (Shopping, Alexa, Photos), Shopify, Coinbase, Discord, Pinterest, Walmart, Tesla, Bloomberg, Klarna, and PlayStation App.

What Is Flutter?

Flutter is Google’s open-source UI toolkit, first released in 2017. It uses Dart as its programming language and takes a fundamentally different approach from React Native: instead of rendering native platform components, Flutter draws every pixel on screen using its own rendering engine.

This means Flutter apps look identical on iOS and Android, by design. The framework ships with a comprehensive widget library that mimics (or replaces) platform-native components. In 2024–2025, Flutter transitioned from the Skia graphics engine to Impeller, which pre-compiles shaders at build time instead of runtime, eliminating the “first-run jank” that plagued earlier Flutter apps.

Companies using Flutter: Google (Pay, Earth, Ads, Classroom, YouTube Create), BMW (My BMW, MINI apps), Toyota (infotainment), Nubank, eBay Motors, Alibaba (Xianyu), ByteDance (800+ Flutter engineers), LG Electronics (smart TV apps), Betterment, Universal Studios, Square, GEICO, and Sonos.

Side-by-Side Comparison Table

Criteria
Creator
Language
Rendering
First release
GitHub stars
Developer adoption (survey)
Platforms
App size (minimal)
Hot reload
Backed by
New apps in store (AppFigures, 2025)
Q4 2025 revenue
React Native
Flutter
Meta
Google
JavaScript / TypeScript
Dart
Native platform components
Custom engine (Impeller)
2015
2017
122K+
170K+
~35% of cross-platform apps
~46% of cross-platform apps
iOS, Android, Web, Windows, macOS, tvOS
iOS, Android, Web, Windows, macOS, Linux
5–8 MB (Android)
8–12 MB (Android)
Yes (Fast Refresh)
Yes
Meta, Microsoft, Shopify
Google, ByteDance, BMW
6.75% of new apps
11.07% of new apps
$287M
$283M

Three different ways to measure “popularity” — each tells a different story:

  • Developer adoption (Statista, 2023): % of developers who used the framework in the past year — multi-select survey, does not sum to 100%.
  • New apps in store (AppFigures, 2025): % of newly published App Store + Google Play apps that use each framework. Source: AppFigures
  • Q4 2025 revenue: Total app store revenue generated by apps built on each framework. Source: ripenapps.com / AppFigures

Performance: Which Framework Is Faster?

Performance was once Flutter's clear advantage. In 2026, the gap has narrowed, but it hasn't disappeared.
How React Native Handles Rendering

React Native’s New Architecture fundamentally changed how the framework communicates with native code. The old asynchronous bridge — the source of most performance complaints — is gone. JSI enables synchronous, direct calls between JavaScript and native modules. Fabric provides concurrent rendering, and TurboModules load native modules lazily, reducing startup overhead.

The Hermes engine, now in its V1 release, pre-compiles JavaScript to bytecode at build time. This reduced startup times by 40–50% compared to the older JavaScriptCore approach.

How Flutter’s Impeller Engine Works

Flutter bypasses platform UI components entirely. Its rendering pipeline goes straight from Dart code to GPU-rendered pixels via the Impeller engine. Because Impeller pre-compiles shaders during the build phase rather than at runtime, it reduces the stuttering frames that plagued earlier Flutter versions on their first run.

This architectural decision gives Flutter an inherent advantage in animation-heavy applications — there’s no bridge, no serialization, and no asynchronous handoff between logic and rendering.

Rollout timeline (per official documentation):

  • Flutter 3.10 (May 2023): Impeller became the default renderer on iOS (Metal API). Source
  • Flutter 3.27 (late 2024): Impeller became the default on Android API 29+ with Vulkan support. Devices below API 29 (or without Vulkan) fall back to the legacy OpenGL renderer. Official Flutter documentation

Remaining limitation: Low-end Android devices without Vulkan (below API 29) still fall back to the legacy OpenGL renderer. Impeller can be explicitly disabled for debugging via --no-enable-impeller, or permanently in AndroidManifest.xml — useful when targeting a wide range of low-end Android hardware. For the overwhelming majority of production apps on modern devices, Impeller works without caveats.

Real-World Benchmark Results

Flutter starts faster, maintains higher frame rates under load, and uses slightly less memory during operation. React Native produces smaller initial binaries because it leverages platform-provided UI components instead of bundling its own rendering engine.

Measurement conditions (TTFF — Time to First Frame): Release builds on real devices. iOS 60Hz (iPhone), Android 120Hz (Pixel). TTFF = time from app launch to first rendered frame. Source: SynergyBoat 2025 benchmark (controlled, repeatable methodology)

Metric
TTFF (Time to First Frame)
Cold start time
Frame rate (standard UI)
Frame rate (heavy animations)
Memory usage (typical app)
Initial binary size (Android)
React Native (New Arch)
Flutter (Impeller)
iOS: 32.96ms / Android: 15.31ms
iOS: 16.67ms / Android: 10.33ms
300–600ms
Under 200ms
55–60 FPS
58–60 FPS
45–55 FPS
55–60 FPS (120 FPS on 120Hz displays only†)
~145 MB
~120 MB
5–8 MB
8–12 MB

†120 FPS: display-dependent, not framework-dependent. Both frameworks support 120Hz on compatible devices (iPhone Pro series with iOS 15+, Pixel 6 Pro+, most 2022+ Android flagships). React Native requires CADisableMinimumFrameDurationOnPhone = true in Info.plist — included by default since RN 0.82; projects on older versions must add it manually (RN #32703). Flutter 3.0+ enables ProMotion automatically — no configuration required (Flutter #98196). Once enabled, both frameworks reach the same ceiling set by the hardware.

Performance Verdict

Flutter wins on raw performance, especially for animation-intensive apps, games, and custom UI experiences. The Impeller engine delivers consistent 60+ FPS with virtually zero dropped frames.

React Native is fast enough for 90% of apps. If you’re building a content-driven app, an e-commerce platform, or a business tool, the New Architecture delivers performance that users won’t distinguish from native. The advantage shifts to React Native when your app needs deep integration with platform-specific UI patterns.

UI Components and Rendering Approach

This is where the two frameworks diverge most fundamentally, and where the choice matters most for your product's look and feel.
React Native: Native Components

React Native renders actual platform UI components. A <Button> on iOS looks like an iOS button. A <Switch> on Android follows Material Design. This means your app automatically inherits platform updates — when Apple redesigns its toggle switches, your React Native app gets the new look without a code change.

The trade-off is inconsistency. Your app will look different on iOS and Android because it uses each platform’s design language. For some products, this is exactly right. For others, it’s a branding problem.

Flutter’s Custom Widgets

Flutter draws everything from scratch. Every button, every text field, every scroll container is a Flutter widget rendered by the Impeller engine. This gives developers pixel-perfect control over every visual element across platforms.

Flutter ships with two widget libraries: Material (Google’s design language) and Cupertino (iOS-style components). But many teams in 2026 build entirely custom design systems — and this is where Flutter shines. If your brand identity demands a unique, consistent look across platforms, Flutter’s rendering approach is purpose-built for that.

Animation Capabilities

Flutter has a clear edge in animation. Because it controls the entire rendering pipeline, complex animations — page transitions, micro-interactions, physics-based effects — run at a consistently high frame rate without the overhead of crossing between JavaScript and native threads.

React Native animations have improved significantly with Reanimated 3 and the New Architecture’s synchronous layout, but highly complex, multi-element animations still occasionally produce frame drops that Flutter handles effortlessly.

Programming Languages: Dart vs JavaScript

Learning Curve for Beginners

JavaScript is the world’s most popular programming language. If your team already knows React for web development, React Native is a natural extension — same mental model, same state management patterns, same ecosystem tools.

Dart is less well-known but easy to learn. Its syntax resembles a hybrid of JavaScript, Java, and Kotlin. Most developers with experience in any C-family language can become productive in Dart within a week. The learning curve isn’t Dart itself — it’s Flutter’s widget tree paradigm, which requires a shift in how you think about UI composition.

Ecosystem and Third-Party Libraries

React Native benefits from the entire npm ecosystem — over 2 million packages. Not all are mobile-compatible, but the sheer volume means you’ll rarely encounter a problem without a community solution.

Flutter’s package ecosystem (pub.dev) is smaller but growing rapidly and more focused. Packages are purpose-built for Flutter, which means fewer compatibility issues but occasionally less choice for niche requirements.

TypeScript Support in React Native

TypeScript has become the de facto standard for React Native projects in 2026. The type safety, autocompletion, and refactoring support it provides are significant advantages for teams building production applications. Combined with React’s mature ecosystem of state management tools (Zustand, Jotai, Redux Toolkit), the development experience is polished and well-documented.

Dart has built-in null safety and strong typing, which provides similar benefits to TypeScript without requiring a separate type layer. Both approaches result in safer, more maintainable codebases.

Flutter’s pub.dev ecosystem is equally mature: Riverpod (pub.dev), Bloc/Cubit (bloclibrary.dev), GetX (pub.dev).

Developer Experience and Tooling

Hot Reload and Development Speed

Both frameworks offer hot reload — the ability to see code changes reflected instantly in the running app without losing state. In practice, Flutter’s hot reload is slightly more reliable and faster, particularly for UI changes. React Native’s Fast Refresh occasionally requires a full reload for certain state or navigation changes.

IDE Support and Debugging

React Native developers typically work in VS Code with React DevTools, Flipper (though its role is diminishing), and Chrome DevTools. The debugging experience is solid but can be fragmented — different tools for JavaScript logic, native modules, and network inspection.

Flutter’s development tooling is more cohesive. Dart DevTools provides a single unified interface for widget inspection, performance profiling, memory analysis, and network debugging. The IntelliJ/Android Studio plugin and VS Code extension both offer mature Flutter support.

CI/CD and Testing Tools

Both frameworks integrate well with standard CI/CD pipelines (GitHub Actions, Bitrise, Codemagic, Fastlane). Flutter’s built-in testing framework covers unit, widget, and integration tests with a consistent API. React Native testing relies on a combination of Jest (unit), React Native Testing Library (component), and Detox or Maestro (E2E) — more tools to configure, but also more flexibility.

React Native + Expo: The Framework Within a Framework

Comparing React Native in 2026 without mentioning Expo is like comparing React without Next.js. Meta’s official documentation explicitly states: “We recommend using a framework like Expo” for all new projects. reactnative.dev/docs/environment-setup

What Expo changes:

  • Expo Router v3 (January 2024): File-based routing — routes are defined by the file structure in the app/ folder. Deep links and universal links work out of the box. docs.expo.dev/router/introduction
  • EAS OTA updates: JavaScript bundles are delivered to devices without App Store review. This is architecturally impossible for Flutter (Dart compiles to native code). Shorebird is Flutter’s equivalent, but it is third-party and costs $16–30k/year. shorebird.dev
  • Expo Go: Run a project on a physical device via QR code, without Xcode or Android Studio. Flutter has no equivalent.

Trade-off: Expo adds an abstraction layer. Libraries without current Expo SDK support require config plugins or ejecting to bare workflow. For teams that need deep native customization from day one, bare React Native remains an option.

Navigation and Routing

Navigation is one of the first architectural decisions in any project and has historically been a pain point for both frameworks.

React Native: For years there was fragmentation between react-navigation and react-native-navigation (Wix). Expo Router v3 (January 2024) resolved this with file-based routing: folder structure = route structure. Deep linking, universal links, and web routing work out of the box without manually configuring Linking or platform-specific entitlements. docs.expo.dev/router

Flutter: go_router is officially recommended by the Flutter team (docs.flutter.dev/ui/navigation). Declarative URL-based routing, typed routes, redirect guards. The package is declared feature-complete; the Flutter team focuses on stability. Alternative: auto_route with annotation-based code generation.

Verdict: Flutter has a slight edge in out-of-the-box navigation consistency. Expo Router has largely eliminated Flutter’s historical advantage — but only when using Expo. Bare React Native without Expo still requires manual deep linking setup.

PopulaPopularity and Communityrity and Community

Flutter leads on GitHub with 170K+ stars versus React Native’s 122K+. Flutter also has 46% market share among cross-platform frameworks compared to React Native’s 35%.

However, npm download volume for React Native packages remains higher, reflecting the massive JavaScript developer base. Stack Overflow activity is comparable for both.

Job Market and Salary Comparison

This is where the data gets interesting:
Metric
Average US salary
Senior range (US)
Job postings (US)
Talent pool
React Native
Flutter
~$129,000/year
~$98,500/year
$180,000–$250,000
$135,000–$180,000
~6x more listings
Fewer, but growing faster
Larger (JavaScript base)
Smaller, growing rapidly

React Native developers earn more on average in the US, driven by the framework’s deep entrenchment in enterprise and Big Tech companies (Meta, Microsoft, Amazon). The larger JavaScript talent pool also means more mid-level and senior candidates are available.

Flutter’s salary figures are lower on average but rising as enterprise adoption accelerates. The smaller talent pool means experienced Flutter developers are in high demand, companies that need Flutter expertise often compete harder for senior engineers.

Who Uses React Native or Flutter?

React Native: Meta (Facebook, Instagram), Microsoft (Office, Teams), Amazon (Shopping, Alexa), Shopify, Discord, Pinterest, Walmart, Tesla, Bloomberg, Coinbase, Klarna, PlayStation App.

Flutter: Google (Pay, Earth, Ads), BMW (My BMW), Toyota, Nubank, ByteDance (800+ Flutter engineers), eBay Motors, Alibaba, LG Electronics, Universal Studios, Square, GEICO, Sonos.

The pattern: JavaScript-heavy tech companies and e-commerce brands lean React Native. Companies with custom UI requirements, automotive, and fintech lean toward Flutter.

Platform Reach Beyond Mobile

Flutter for Web, Desktop, and Embedded

Flutter’s “one codebase, every platform” ambition is the most expansive of any cross-platform framework. Flutter supports iOS, Android, web, Windows, macOS, Linux, and is making inroads into embedded systems (Toyota’s infotainment, LG’s smart TVs).

The web story has improved significantly — Flutter’s Wasm compilation target delivers near-native web performance. Desktop support (Windows, macOS, Linux) is stable and production-ready.

React Native for Web and Windows

React Native’s platform reach is growing but more fragmented. React Native for Web (via react-native-web) allows code sharing with web apps. React Native for Windows and macOS (maintained by Microsoft) is production-ready and powers apps like Xbox Game Pass and parts of Office.

However, React Native’s multi-platform story involves more third-party libraries and platform-specific configuration compared to Flutter’s integrated approach.

Which Framework Scales Further?

Flutter reaches more platforms from a single codebase with less configuration. If your roadmap includes web, desktop, embedded, or automotive, Flutter’s unified rendering engine is a significant advantage.

React Native scales well across mobile and web, especially if you already have a React web application and want to share code and components between mobile and web.

Native API Integration and Third-Party Plugins

Accessing Device Hardware

React Native accesses device hardware (camera, GPS, Bluetooth, sensors) through native modules. With the New Architecture, TurboModules provide synchronous access to native APIs — a major improvement over the old asynchronous bridge.

Flutter uses platform channels for native communication. While functional and well-documented, the bridge adds a layer of serialization. For most use cases, the overhead is negligible. For real-time hardware access (AR, real-time audio processing), React Native’s direct native module approach can offer lower latency.

Plugin Ecosystem Maturity

React Native’s plugin ecosystem is larger and older, but quality varies. Some popular packages have inconsistent maintenance. The shift to TurboModules and Nitro modules is improving reliability and performance.

Flutter’s pub.dev ecosystem is smaller but more curated. Google maintains official plugins for common needs (camera, maps, in-app purchases), and the community package quality is generally consistent. Breaking changes between Flutter versions are well-managed through the Flutter fix migration tool.

Handling Breaking Changes and Updates

Flutter follows a predictable quarterly release cycle with clear migration guides. Breaking changes are announced in advance and typically come with automated migration tools.

React Native’s update path has historically been more painful, with major version upgrades sometimes requiring manual intervention across native dependencies. The New Architecture standardization has improved this significantly, but upgrading a complex React Native project still requires more effort than a comparable Flutter upgrade.

Total Cost of Ownership and Team Considerations

Hiring: Which Talent Pool Is Larger?

React Native’s talent pool is substantially larger because it draws from the global JavaScript developer base. Any experienced React web developer can become productive in React Native within weeks.

Flutter requires Dart knowledge, which narrows the initial candidate pool. However, Dart’s low learning curve means that experienced developers from Java, Kotlin, C#, or Swift backgrounds can transition quickly.

Long-Term Maintenance Costs

Flutter’s comprehensive built-in tooling and testing framework reduce reliance on third-party packages, which lowers long-term maintenance overhead. The predictable release cycle and migration tooling further reduce upgrade costs.

React Native’s reliance on a broader ecosystem of third-party packages means more dependencies to track, more potential compatibility issues during upgrades, and more time spent evaluating and replacing deprecated libraries.

React Native or Flutter for Startups vs Enterprises

Startups benefit from Flutter’s faster development speed, consistent UI out of the box, and lower long-term maintenance burden. If you’re building a new app from scratch with a small team and want pixel-perfect design consistency, Flutter gets you to market faster.

Enterprises with existing JavaScript teams and web applications often find React Native more practical. The ability to share developers between web and mobile projects, the larger hiring pool, and the deep native integration capabilities make React Native a lower-risk choice for large organizations.

This isn’t a hard rule. BMW (enterprise) chose Flutter. Shopify (enterprise) chose React Native. The deciding factor is usually the existing team’s skill set, not the company’s size.

Which Should You Choose in 2026?

So… Do we have a proper winner?
React logo
Choose React Native If:

• Your team already knows JavaScript or TypeScript
• You have an existing React web app and want code sharing between web and mobile
• You need deep integration with platform-specific UI components and native APIs
• You’re building a content-driven app (news, e-commerce, social media) where native look and feel matters
• Hiring availability is a priority — the JavaScript talent pool is significantly larger
• You’re targeting Microsoft platforms (Windows, Xbox) alongside mobile

Flutter Logo
Choose Flutter If:

• You’re starting from scratch and want the fastest path to a polished, cross-platform product
• Your app requires custom, brand-specific UI that looks identical on every platform
• You need high-performance animations, transitions, or graphics-intensive features
• Your roadmap includes web, desktop, or embedded platforms beyond mobile
• You want a more cohesive development, testing, and debugging experience
• You’re willing to invest in Dart skills for a smaller but more focused ecosystem

What About Kotlin Multiplatform as an Alternative?

Kotlin Multiplatform (KMP) deserves mention as a serious third option. Unlike React Native and Flutter, KMP focuses on sharing business logic across platforms while using fully native UI on each platform – SwiftUI on iOS, Jetpack Compose on Android.

KMP is now stable and production-ready, used by McDonald’s, Netflix, Cash App, and Philips. Google officially supports it for Android-iOS logic sharing. Compose Multiplatform (JetBrains) extends this to shared UI, though it’s less mature than Flutter’s approach.

kotlin multiplatform logo
Choose KMP if:

• You have a strong Android/Kotlin team
• You want maximum native UI fidelity on each platform
• You prefer sharing business logic (networking, data, domain models) while keeping UI fully native
• You’re modernizing an existing native app incrementally

KMP shares 40–60% of code (business logic), while React Native and Flutter share 85–95% (including UI). The trade-off is more native-feeling apps versus more code sharing.

Frequently Asked Questions

Does Amazon use Flutter or React Native?

Amazon uses React Native for several major mobile applications, including Amazon Shopping, Amazon Alexa, Amazon Photos, and Kindle. Amazon Web Services (AWS) Amplify supports both Flutter and React Native as backend solutions, but Amazon’s consumer-facing mobile apps are built with React Native.

Is React Native or Flutter better for beginners in 2026?

For beginners who already know JavaScript, React Native is the easier entry point, familiar language, familiar paradigm, massive community resources. For complete beginners or those coming from Java/Kotlin backgrounds, Flutter with Dart offers a more cohesive learning experience with better-integrated tooling and documentation. Dart’s learning curve is gentle, and Flutter’s widget-based approach is well-documented.

Which pays more: React Native or Flutter developer?

In the US market, React Native developers earn more on average, approximately $129,000/year compared to $98,500/year for Flutter developers. Senior React Native roles at major tech companies can reach $180,000–$250,000+. However, experienced Flutter developers are in shorter supply, which is driving salaries upward as enterprise adoption grows.

Is Flutter faster than React Native?

TTFF (SynergyBoat 2025 benchmark): Flutter iOS 16.67ms / Android 10.33ms; React Native iOS 32.96ms / Android 15.31ms. Flutter is ~2× faster to first frame.

120 FPS: Both frameworks support 120 FPS on 120Hz devices. This is determined by the display, not the framework. Flutter delivers more consistent high FPS; React Native requires explicit configuration and has open bugs with ProMotion on the New Architecture. (Issue #7984)

For standard business apps and content-driven UI the difference is imperceptible to users. The gap only matters for animation-heavy, graphics-intensive, or real-time applications — this statement from the original article remains accurate.

Can Flutter replace React Native?
No, and it doesn’t need to. Both frameworks solve cross-platform mobile development but make different trade-offs. Flutter prioritizes pixel-perfect consistency and multi-platform reach. React Native prioritizes native platform fidelity and JavaScript ecosystem access. The frameworks serve different teams, products, and business contexts. In 2026, both are growing, both are production-ready, and neither is going away.
 
Which framework has better long-term support, Flutter or React Native?

Both have strong backing. Flutter is maintained by Google with a dedicated team, predictable quarterly releases, and growing enterprise adoption. React Native is maintained by Meta with significant contributions from Microsoft and Shopify. Both frameworks have survived the “is it dead?” discourse cycle multiple times and emerged stronger. The risk isn’t framework abandonment; it’s ecosystem fragmentation, which React Native is more susceptible to due to its reliance on third-party packages.

Is React Native dead in 2026?

No. React Native powers major applications at Meta, Microsoft, Amazon, and Shopify. The New Architecture (JSI, Fabric, TurboModules) shipped as the default, resolving the performance limitations that fueled the “is it dead?” narrative. Job postings for React Native remain approximately 6x higher than Flutter in the US market. React Native isn’t dead, it just stopped being the only option.

Should I learn Flutter or React Native first?

Learn the one that connects to your existing skills. If you know JavaScript/TypeScript → React Native. If you know Java, Kotlin, or C# → Flutter’s Dart will feel natural. If you’re starting completely from scratch and just want to build mobile apps → Flutter has a more cohesive learning experience. If you want maximum career flexibility across web and mobile → React Native plus React for web covers more ground.

Can you use React Native and Flutter together in one project?

Technically, yes, both frameworks can be embedded as modules within a native iOS or Android app. Some large companies use Flutter for specific screens or features within an otherwise native or React Native app. However, combining both in a single project is rarely practical. It doubles your dependency management, increases binary size, and requires expertise in both frameworks. Pick one and commit.

How does Flutter compare to React Native vs Kotlin Multiplatform?

Each framework occupies a different position on the code-sharing spectrum. Flutter shares the most code (85–95%, including UI) with pixel-perfect consistency. React Native shares similarly (85–95%) but renders native platform components. Kotlin Multiplatform shares less code (40–60%, business logic only by default) but delivers the most native experience because each platform uses its own UI framework. Choose Flutter for maximum consistency, React Native for native feel with JavaScript, KMP for native-first with shared logic.