Cordova → React Native
Weeks High riskA two-hop migration: stabilise on Capacitor first, then port screen-by-screen to React Native. This is the safest path if your Cordova app is non-trivial, because it lets you ship features the whole time instead of feature-freezing for a full rewrite.
If your app is small (a handful of screens, no deep native plugin dependencies) you can skip the Capacitor stop and port directly to RN. See Path B below.
This guide composes two existing guides. Read them in order: Cordova → Capacitor first, then Capacitor → React Native. Mushi Mushi stays on the same project the whole way through.
Why migrate
You’re on Cordova and want to end up on React Native because:
- Performance. WebView-based shells can struggle with long scrolling lists, chat views and animations. React Native renders native views.
- Native API access. Newer iOS / Android APIs (App Intents, WidgetKit, Health, etc.) are often reachable through Expo modules or community libraries.
- Hiring. React Native engineers are usually easier to find than Cordova ones.
You should NOT migrate if:
- You ship daily and cannot afford a feature freeze on the mobile surface.
- Your differentiator is web-first SEO (RN Web is OK, but Next.js is better).
- Your app is mostly a thin wrapper around a great mobile web experience.
Two paths
Path A: Cordova → Capacitor → React Native (recommended)
Lower-risk because you stay shippable at every step.
- Week 1-2. Migrate Cordova → Capacitor following that guide. Ship to production. This alone is a meaningful win (better debugging, modern WebView, modern plugin ecosystem).
- Week 3-8. Migrate Capacitor → React Native following that guide. Dual-ship for a couple of weeks before sunsetting the Capacitor build.
This is what we recommend for any app with > ~10 screens or > 5 native plugins.
Path B: Direct Cordova → React Native
Faster end-to-end, riskier mid-migration. Use only when:
- Your app has a small surface area (≤ 10 screens, ≤ 5 native plugins).
- You’re comfortable feature-freezing the mobile surface for the full migration window.
- Your React/JS code is already well-isolated from Cordova plugin calls (you can swap call sites to RN equivalents directly).
Mushi Mushi during the migration
Identical to § 7 of the Capacitor → React Native plan :
same project, same apiKey, dual-ship Cordova/Capacitor and RN at the
same time, sunset the legacy build only after the RN one has been stable for
a week in beta.
You’ll touch the Mushi Mushi SDK exactly once per hop:
- Hop 1 (Cordova → Capacitor): replace
@mushi-mushi/webin the WebView (if you used it) with@mushi-mushi/capacitorand callMushi.configure({ projectId, apiKey }). - Hop 2 (Capacitor → React Native): swap that for
@mushi-mushi/react-nativeand mount<MushiProvider projectId apiKey>at the app root.
No Mushi Mushi project yet? Create a free account (no card) and a project before hop 1, so both builds report to it from the start. The Capacitor quickstart shows where the project ID and API key come from.
Migration checklist (Path A)
- Step 01Audit Cordova plugins (per the Cap→RN plugin map)
- Step 02Hop 1: complete Cordova → Capacitor
- Step 03Verify Mushi Mushi reports flow on the Capacitor build
- Step 04Hop 2: bootstrap the RN project (current RN, New Architecture)
- Step 05Port screens one at a time
- Step 06Mount @mushi-mushi/react-native + smoke-test
- Step 07Dual-ship Capacitor + RN for ≥ 2 weeks
- Step 08Sunset the Cordova/Capacitor build
Migration checklist (Path B, direct)
- Step 01Plugin audit (lower tolerance: every Cordova plugin needs an RN answer)
- Step 02Bootstrap a current React Native release with the New Architecture
- Step 03Port your design system to RN primitives or a kit (NativeWind / Tamagui)
- Step 04Port screens and feature-freeze the Cordova build
- Step 05Mount @mushi-mushi/react-native (same projectId / apiKey)
- Step 06Closed beta on TestFlight / Play Internal
- Step 07Cutover and sunset Cordova
Verification
- The Mushi Mushi Reports page shows reports from
@mushi-mushi/react-nativesent from a real device. - Cold start on a mid-range Android device is no slower than the Cordova baseline (measure both; results vary by app).
- The crash rate in beta is no worse than the Cordova build’s.
Rollback
The strength of Path A is that rollback is trivial at any step: if the RN build hits a wall in week 5, you simply keep shipping the Capacitor build and pause RN work. The Cordova build is also still in your git history if hop 1 itself goes sideways (rare but possible).
References
- Cordova → Capacitor (hop 1)
- Capacitor → React Native (hop 2, full plan)
@mushi-mushi/react-nativeSDK reference