Migrating to Expo SDK 55: What Changed and What to Watch Out For

By Rafat Saqqa · 5 min read

A no-fluff migration walkthrough for Expo SDK 55 the React 19 upgrade, react-native-worklets, and the gotchas we hit shipping a real app.

Expo SDK 55 landed with React 19, React Native 0.83, and a bunch of subtle changes that shipped in the patch notes but bite if you skim them. We migrated our flagship template and a couple of internal apps over the last week. Here's what to actually watch for.

React 19 is the headline

The biggest change is React 19. For most apps the upgrade is transparent useState, useEffect, hooks all work as before. The pieces that bite:

  • Hydration warnings are stricter. If you're rendering anything time-based on the server (rare in RN, common in Expo Web), you'll see warnings you didn't see before.
  • Refs are now props. forwardRef still works, but new code can pass ref like any other prop. Update your component patterns gradually.
  • Server actions in Next-style RSC frameworks. Mostly irrelevant for pure RN apps, but Expo Router for web picks it up.

react-native-worklets pinned

If you use react-native-reanimated 4, it now imports worklets from react-native-worklets rather than bundling them. Expo SDK 55 wants version 0.7.4 exactly. expo install --fix will downgrade you if you've got something newer.

peerDependency drift in @expo/devtools

This one cost us half a day. The @expo/devtools package transitively pulls in Radix UI (yes, the web component lib Expo's dev server runs as a web app). Radix wants react-dom@^19.2.5 but Expo SDK 55 pins react@19.2.0. npm install fails with ERESOLVE.

The fix is one line in package.json:

"overrides": {
  "react-dom": "19.2.0"
}

This forces the transitive react-dom to match your react.

Maps API key now required on Android

react-native-maps 1.27 still works, but Android needs an explicit key in app.json under android.config.googleMaps.apiKey. Without it, the map tiles render gray. iOS uses Apple Maps, no key needed.

Expo Router dynamic routes are stricter

Expo Router now strictly enforces the [param].tsx filename syntax. Files like item-itemId.tsx (kebab-case) are silently ignored they used to work in some 54.x builds. If your tracking screens 404 unexpectedly, check the filenames.

TypeScript stricter on JSX union types

If you have an array of section items with optional props (some have a badge, some don't, some have a value), TypeScript 5.6 now infers a union and refuses to let you access the optional property without narrowing. Define an explicit interface for the array element type.

Build performance

Cold start of expo start is noticeably faster on SDK 55 the new Metro config caches more aggressively. EAS Build times for development profiles dropped roughly 20% in our measurements.

Should you upgrade?

Yes, but read the official changelog first and budget half a day for peer-dep cleanup. The React 19 wins (better Suspense, automatic batching improvements) are worth it for any app with real interaction complexity.

We'll be shipping SDK 55-only patches to our templates from now on SDK 54 support continues for security fixes through Q3 2026.