Index
References¶
- ./references/new-architecture.md -- SDK +53: New Architecture migration guide
- ./references/react-19.md -- SDK +54: React 19 changes (useContext → use, Context.Provider → Context, forwardRef removal)
- ./references/react-compiler.md -- SDK +54: React Compiler setup and migration guide
- ./references/native-tabs.md -- SDK +55: Native tabs changes (Icon/Label/Badge now accessed via NativeTabs.Trigger.*)
- ./references/expo-av-to-audio.md -- Migrate audio playback and recording from expo-av to expo-audio
- ./references/expo-av-to-video.md -- Migrate video playback from expo-av to expo-video
- ./references/sdk-55-breaking-changes.md -- SDK 55: Breaking changes, removals, and renames
- ./references/edge-to-edge.md -- SDK +54: Edge-to-edge mandatory on Android 16+, navigation bar deprecations
Beta/Preview Releases¶
Beta versions use .preview suffix (e.g., 55.0.0-preview.2), published under @next tag.
Check if latest is beta: https://exp.host/--/api/v2/versions (look for -preview in expoVersion)
Step-by-Step Upgrade Process¶
- Upgrade Expo and dependencies
-
Run diagnostics:
npx expo-doctor -
Clear caches and reinstall
- If using pnpm catalogs, update the
react-nativecatalog versions inpnpm-workspace.yaml
Breaking Changes Checklist¶
- Check for removed APIs in release notes
- Update import paths for moved modules
- Review native module changes requiring prebuild
- Test all camera, audio, and video features
- Verify navigation still works correctly
- Check
eas updatecalls for required--environmentflag (SDK +55) - Review edge-to-edge implications on Android (SDK +54)
- SDK 56+:
expo-calendarroot export is the new OO API — legacy free functions (createEventAsync,requestCalendarPermissionsAsync, …) throw at runtime. Migrate to class methods (createCalendar,calendar.createEvent,event.openInCalendar, …);expo-calendar/legacyonly as a short-lived bridge (migration guide)
New Package Versioning (SDK +55)¶
As of SDK 55, all Expo SDK packages use the same major version as the SDK. For example, expo-camera compatible with SDK 55 is ^55.0.0. This makes version compatibility obvious at a glance.
Prebuild for Native Changes¶
First check if ios/ and android/ directories exist in the project. If neither directory exists, the project uses Continuous Native Generation (CNG) and native projects are regenerated at build time — skip this section and "Clear caches for bare workflow" entirely.
If upgrading requires native changes:
This regenerates the ios and android directories. Ensure the project is not a bare workflow app before running this command.
Clear caches for bare workflow¶
These steps only apply when ios/ and/or android/ directories exist in the project:
- Clear the cocoapods cache for iOS:
cd ios && pod install --repo-update - Clear derived data for Xcode:
npx expo run:ios --no-build-cache - Clear the Gradle cache for Android:
cd android && ./gradlew clean
Housekeeping¶
- Review release notes for the target SDK version at https://expo.dev/changelog
- If using Expo SDK 54 or later, ensure react-native-worklets is installed — this is required for react-native-reanimated to work.
- Enable React Compiler in SDK 54+ by adding
"experiments": { "reactCompiler": true }to app.json — it's stable and recommended - Delete sdkVersion from
app.jsonto let Expo manage it automatically - Remove implicit packages from
package.json:@babel/core,babel-preset-expo,expo-constants. - If the babel.config.js only contains 'babel-preset-expo', delete the file
- If the metro.config.js only contains expo defaults, delete the file
- In SDK 55+, remove the
newArchEnabledfield from app.json entirely (Legacy Architecture no longer exists) - In SDK 54+, the
statusBarfield was removed from app.json — useexpo-status-barpackage instead - In SDK 55+, remove
notificationfield from app.json — useexpo-notificationsconfig plugin (throws error in prebuild) - In SDK 55+, remove
edgeToEdgeEnabledfrom app.json — edge-to-edge is mandatory on Android 16+ - In SDK 55+,
androidNavigationBarapp.json config is deprecated — useexpo-navigation-barconfig plugin - In SDK 55+,
androidStatusBar.backgroundColorandandroidStatusBar.translucentare deprecated — useexpo-status-barconfig plugin - In SDK 55+, remove
experiments.reactCanaryflag from app.json (React 19 is the baseline) - Minimum iOS version stays 15.1 for SDK 55, but SDK 56 will bump to 16.4
Deprecated Packages¶
| Old Package | Replacement | Removed In |
|---|---|---|
expo-av |
expo-audio and expo-video |
SDK 55 |
expo-permissions |
Individual package permission APIs | — |
@expo/vector-icons |
expo-symbols (for SF Symbols) |
— |
AsyncStorage |
expo-sqlite/localStorage/install |
— |
expo-app-loading |
expo-splash-screen |
— |
expo-linear-gradient |
experimental_backgroundImage + CSS gradients (not officially deprecated, alternative only) |
— |
expo-video-thumbnails |
generateThumbnailsAsync from expo-video |
SDK 56 |
expo-background-fetch |
expo-background-task |
— |
expo-file-system (old) |
expo-file-system (new API, old at /legacy) |
SDK 55 |
When migrating deprecated packages, update all code usage before removing the old package. For expo-av, consult the migration references to convert Audio.Sound to useAudioPlayer, Audio.Recording to useAudioRecorder, and Video components to VideoView with useVideoPlayer.
expo.install.exclude¶
Check if package.json has excluded packages:
Exclusions are often workarounds that may no longer be needed after upgrading. Review each one.
Removing patches¶
Check if there are any outdated patches in the patches/ directory. Remove them if they are no longer needed.
Postcss¶
autoprefixerisn't needed in SDK +53. Remove it from dependencies and checkpostcss.config.jsorpostcss.config.mjsto remove it from the plugins list.- Use
postcss.config.mjsin SDK +53.
Metro¶
Remove redundant metro config options:
- resolver.unstable_enablePackageExports is enabled by default in SDK +53.
experimentalImportSupportis enabled by default in SDK +54.EXPO_USE_FAST_RESOLVER=1is removed in SDK +54. In SDK +55 the fast resolver is the only implementation.- cjs and mjs extensions are supported by default in SDK +50.
- Expo webpack is deprecated, migrate to Expo Router and Metro web.
expo.experiments.autolinkingModuleResolutionis enabled by default in monorepos in SDK +55. If having dependency issues during upgrade, try enabling it explicitly.
Hermes engine v1¶
Since SDK 55, users can opt-in to use Hermes engine v1 for improved runtime performance. This requires setting useHermesV1: true in the expo-build-properties config plugin, and may require a specific version of the hermes-compiler npm package. Hermes v1 will become a default in some future SDK release.
New Architecture¶
The new architecture is enabled by default, the app.json field "newArchEnabled": true is no longer needed as it's the default. Expo Go only supports the new architecture as of SDK +53.
In SDK 55, Legacy Architecture is fully dropped. The newArchEnabled config option is removed entirely — no opt-out is possible.
Edge-to-Edge (Android)¶
- SDK 53: Edge-to-edge enabled by default for new Android projects.
- SDK 54: Edge-to-edge always enabled (Android 16 / API 36).
react-native-edge-to-edgeno longer bundled inexpo. If using its config plugin, make it a direct dependency. - SDK 55:
edgeToEdgeEnabledremoved from app.json.expo-navigation-barmost methods deprecated and no-op.expo-status-barbackgroundColor/translucent deprecated.
Use expo-navigation-bar and expo-status-bar config plugins instead of app.json fields.
Tool Version Requirements¶
| SDK | React Native | React | Xcode | Min Node.js |
|---|---|---|---|---|
| 53 | 0.79 | 19.0 | 16.0 | 20 |
| 54 | 0.81 | 19.1 | 16.1+ | 20.19.4 |
| 55 | 0.83 | 19.2 | 26 | 20.19.4 |