What does it mean that each Expo SDK targets one React Native version, and how does that constrain which React Native version your Expo app runs?
answer
- one SDK, one React Native
- SDK 57 ships 0.86.3
- newer React Native waits for next SDK
- patch-package or pre-release SDK
- Expo Go runs only the latest SDK
basics
~20 sAn Expo SDK release is built and tested against a single React Native version, and its packages expect that version. SDK 57 targets React Native 0.86.3, so moving to a newer React Native means moving to the SDK that targets it.
solid answer
~50 sEach Expo SDK targets a single React Native version, normally the latest stable when the SDK ships, and every SDK package is built and tested against it: SDK 57 pairs `react-native` 0.86.3 with React 19.2.3, while React Native 0.87 exists only in Expo's canary builds. In practice your React Native version is chosen by the SDK, not independently. Running an older React Native under the latest SDK is not generally supported, and a newer one is not available until an SDK targets it. If you need a fix from a newer React Native before then, the Expo docs offer two routes: `patch-package` for the fix, or a pre-release SDK. Expo Go supports only the latest SDK, so a project on an older SDK needs development builds. The docs describe about three SDK releases a year, each tracking React Native.
go deeper
Know that each Expo SDK comes with one React Native version, and that SDK 57 uses React Native 0.86.
Explain why React Native is upgraded through the SDK, what the version map gives you, and the patch-package or pre-release routes.
Plan upgrades around SDK releases, not React Native releases, and justify any pre-release SDK or patch in terms of risk.
Accept pinning as a deliberate trade of choice for tested compatibility, and set an upgrade cadence that keeps the app within supported SDKs.
## One SDK, one React Native An **Expo SDK** is a numbered release of the `expo` package together with a coordinated set of Expo packages (`expo-router`, `expo-camera`, `expo-updates` and so on) and a map of known-compatible versions for popular third-party libraries. Each SDK **targets a single React Native version**, typically the latest stable React Native at the time of release, and every package in the SDK is built and tested against it. | Expo SDK | React Native | |---|---| | 53 | 0.79 | | 54 | 0.81 | | 55 | 0.83 | | 56 | 0.85 | | 57 | 0.86 (0.86.3 with React 19.2.3) | React Native 0.87 is current stable in React Native's own releases, but in Expo it is only available through canary builds; it is not the target of SDK 57. ## What the pinning constrains - **Your React Native version follows the SDK.** Upgrading React Native in an Expo project means upgrading the SDK; you do not bump `react-native` alone. - **Older React Native under a newer SDK** is not generally supported. The docs say SDK packages typically will not support older React Native versions, though some may. - **A newer React Native** arrives with the SDK that targets it. Expo pre-releases usually add a new React Native quickly, but a stable SDK moves only on its own release. - **Expo Go supports only the latest SDK.** A project that stays on an older SDK uses development builds, which is recommended for production apps anyway. ## When you need something from a newer React Native The Expo docs list two options if a fix will not be cherry-picked into the React Native version your SDK uses: 1. Apply the fix with **`patch-package`**, which patches the dependency in `node_modules` on every install. 2. Move to a **pre-release version of the Expo SDK** that already targets the newer React Native, accepting its pre-release status. Both are exceptions to reach for deliberately; the default is to wait for the SDK and upgrade. ## Cadence The Expo docs state a policy of three SDK releases a year, each targeting one React Native version, and, while React Native was on pace for six releases in 2025, an Expo SDK for roughly every second React Native release. Real dates vary: the changelog of the `expo` package dates 55.0.0 to late February 2026, 56.0.0 to late May and 57.0.0 to the end of June. So check the changelog rather than planning around a fixed calendar. ## Why Expo works this way Pinning trades choice for reliability: - Every Expo package and every mapped third-party version has been tested together on one React Native. - `npx expo install` and `npx expo install --fix` can pick versions mechanically, because the target is fixed. - Upgrades become one coordinated step instead of dozens of independent library bumps. The cost is that you cannot adopt a React Native release on its own schedule. For most teams that is the right trade. ## Package versions follow the SDK Since SDK 55, Expo's packages use the SDK major as their version (`expo-router` `~57.0.x` on SDK 57), so a package from the wrong SDK stands out in `package.json`. Third-party libraries in the map keep their own version numbers. ## Reading the pinning in package.json The map shows up directly in a project's dependencies after `npx expo install`: - `react-native` is an **exact** version, `0.86.3` on SDK 57, because the SDK was tested against precisely that release. - Expo packages use **tilde ranges** on the SDK major, such as `expo-camera` `~57.0.5`, so patch releases can arrive without leaving the SDK. - Third-party libraries in the map carry their own numbering, for example `react-native-reanimated` at `4.5.1`. If any of these disagree with the map, the start-up check and `npx expo install --check` say so. ## A pet-adoption app example A pet-adoption app on SDK 56 runs React Native 0.85. The team reads about a React Native 0.86 improvement and wants it. They do not edit `react-native` in `package.json`; they upgrade to SDK 57, which brings 0.86.3 and the matching versions of every SDK package in one coordinated step.
- A developer bumps react-native in package.json without changing the Expo SDK; what happens?The project now runs a React Native version its SDK packages were not built for. `npx expo start` and `npx expo install --check` report `react-native` as not matching the expected version, and native builds or runtime behaviour can break. The supported path is to upgrade the SDK, which brings its React Native with it.
- Why can a team on an older SDK no longer use Expo Go from the store?Expo Go supports only the latest SDK, and on physical iOS devices only the latest Expo Go can be installed. A project on an older SDK therefore runs in a development build, which contains exactly the native code that project needs.
An Expo SDK is like a car model year: the engine (React Native) and every certified part are chosen together. You can wait for next year's model to get the new engine, but fitting it into this year's chassis is off the certified path.
saying these in an interview costs you the question
- You can upgrade react-native independently of the Expo SDK
- Each Expo SDK supports several React Native versions equally
- The newest React Native is available in Expo the day it ships
- Expo Go can run any older SDK version
- Expo SDK 57 targets React Native 0.87