What's the difference between React Native CLI and Expo (managed + bare)?
You can build a React Native app two ways: React Native CLI (vanilla) or Expo. The 2026 answer is: Expo for most teams, CLI only when you have specific reasons.
React Native CLI (bare):
Created via
npx @react-native-community/cli init.Full
ios/andandroid/folders from day one — edit Xcode/Gradle freely.Any native module works; you manage CocoaPods / Gradle yourself.
You handle your own builds, signing, store submission (or layer Fastlane / EAS Build).
Expo Managed Workflow:
Created via
npx create-expo-app.No
ios/orandroid/in your repo — Expo manages them.Comes with a rich Expo SDK (camera, notifications, file system, secure store, etc.).
Test on physical device through Expo Go; production builds via EAS Build.
OTA updates via EAS Update.
Expo Bare Workflow / CNG (`expo prebuild`):
Run
npx expo prebuildto generateios/andandroid/fromapp.json/app.config.js.Best of both: native code access + Expo SDK + EAS infrastructure.
The 2026 default for production Expo apps that need any custom native code.
In 2026 the right answer leans towards Expo even for production. State the decision rule cleanly: 'Expo unless you have a concrete reason not to.' Concrete reasons = a native dependency Expo doesn't support, app-size constraints, or a brownfield codebase. Bonus: mention CNG (Continuous Native Generation) — expo prebuild regenerates ios//android/ from app.json, which dissolves the old 'managed vs bare' distinction.