Skip to Content
v0.8.0 · shippedNative iOS / Android / Flutter / Capacitor SDKs, A2A discovery, SOC 2 readiness, residency, BYO storage, BYOK. Read the changelog →
Migration guidesReact Native CLI ↔ Expo

React Native CLI ↔ Expo

Days Low risk

Both directions covered. Pick one based on what you need:

  • CLI → Expo if you want EAS Build, OTA updates, and the Expo SDK package family.
  • Expo → CLI (expo prebuild) if you need a native module Expo Go doesn’t allow, or you want to fully own the ios/ and android/ folders.

As of 2026, most projects don’t need to choose. You can run a bare React Native CLI app and selectively npx install-expo-modules@latest to pull in just the Expo SDK packages you want. That hybrid setup is what the Capacitor → RN guide recommends for cost-conscious teams.

Direction A: React Native CLI → Expo (managed-with-dev-client)

Why

  • Cloud builds via EAS Build ($19–$99/mo) — no Mac mini, no Fastlane, no GitHub Actions YAML.
  • OTA updates via EAS Update without store review.
  • Expo SDK packages co-maintained per release; they always work together against the same SDK.

Migration checklist

Migration checklist
6 required steps
  1. Step 01
    Audit native modules for Expo compatibility
  2. Step 02
    Install Expo packages alongside RN
  3. Step 03
    Create app.json / app.config.ts
  4. Step 04
    Build a dev client
  5. Step 05
    Mushi: no changes needed
  6. Step 06
    Move CI to EAS Build (optional)

Direction B: Expo → bare React Native CLI (expo prebuild)

Why

  • A native dependency you can’t wrap as an Expo config plugin.
  • Want to fully own native projects (e.g., specific Xcode build settings Expo doesn’t expose).
  • Want to switch off EAS Build and own your CI on GitHub Actions + Fastlane (see Cap → RN § 5 for the full recipe).

Migration checklist

Migration checklist
6 required steps
  1. Step 01
    Commit a clean state before prebuild
  2. Step 02
    Run expo prebuild
  3. Step 03
    Commit the generated native projects
  4. Step 04
    Optionally remove Expo CLI references
  5. Step 05
    Mushi: no changes needed
  6. Step 06
    Wire your own CI

Hybrid (the third option, often the right one)

You can run a fully bare React Native CLI app AND consume select Expo SDK packages without the Expo CLI:

npx install-expo-modules@latest npm install expo-haptics expo-secure-store expo-image-picker expo-sensors cd ios && bundle exec pod install

That’s it. You get the Expo packages co-maintained as a unit, your CI stays on Fastlane + GitHub Actions, and Mushi runs the same way it does everywhere. This is the recommended setup for glot.it.

Verification

After either direction, smoke-test:

  1. App boots, opens, shows the Mushi widget on tap or shake.
  2. A test report appears in the Mushi admin console within ~5s.
  3. Native modules (camera, secure storage, etc.) work on a real device.

References

Last updated on