Expo SDK 55

Alan HughesAlan Hughes
Brent VatneBrent Vatne

Today we're announcing the release of Expo SDK 55. SDK 55 includes React Native 0.83. Thank you to everyone who helped with beta testing.

Expo SDK 55 is released. SDK 55 includes React Native 0.83

Today we're announcing the release of Expo SDK 55. SDK 55 includes React Native 0.83 and React 19.2. Thank you to everyone who helped with beta testing.

Transition period for default projects and Expo Go

Expo Go for the App Store and Play Store will remain on SDK 54 for a short window of time following this release, and the default project created with npx create-expo-app will continue to use Expo SDK 54 for consistency.

The Expo Go app is our tool for getting started quickly, it's an educational tool to help you learn to build on mobile. We encourage you to take advantage of this transition period to migrate your project to using a development build, which provides you with everything that you need to build an app that you ship to stores.

During this period, you can install Expo Go for SDK 55 from Expo CLI directly on Android devices. For iOS, you can use the TestFlight External Beta or the new eas go command to create an Expo Go build for SDK 55 and upload it to your own TestFlight team. To create an SDK 55 project, use the --template default@sdk-55 flag with create-expo-app.

Revamped default project template

The default template has been redesigned with a focus on native platform conventions and an improved project folder structure:

  • Uses the Native Tabs API for a platform-native tab experience on iOS and Android, with a responsive web-optimized layout for browsers.
  • Refreshed design for a better out-of-the-box experience.
  • New /src folder structure, so application code now lives in /src/app instead of /app, better separating your code from project configuration files.

To use the new project template:

Terminal
# npm
npx create-expo-app@latest --template default@sdk-55
# bun
bun create expo-app --template default@sdk-55
# pnpm
pnpm create expo-app --template default@sdk-55
# yarn
yarn create expo-app --template default@sdk-55

Dropped support for the Legacy Architecture

As explained in the SDK 54 release notes - “SDK 54 is the final release to include Legacy Architecture support”. In other words, you will not be able to use the Legacy Architecture in SDK 55 projects and later. Accordingly, the newArchEnabled config option has been removed from app.json. Learn more in the “React Native’s New Architecture” guide.

Hermes v1 is now available for opt-in

Hermes v1 represents a huge step forward for the engine, showing early signs of meaningful performance improvements across various scenarios, and shipping better support for modern JavaScript features (ES6 classes, const/let syntax, async/await). You can try it out in your app with the useHermesV1 field in expo-build-properties.

It’s important to note that using Hermes v1 in Expo SDK 55 / React Native 0.83 requires building React Native from source, which significantly increases native build times. This tradeoff might be worth it for your app, give it a try, find out, and let us know!

app.json
{
"expo": {
"plugins": [
[
"expo-build-properties",
{
"buildReactNativeFromSource": true,
"useHermesV1": true
}
]
]
}
}

You will need to override the hermes-compiler version to use the Hermes V1 compiler. Depending on your package manager, this field may be named differently. With npm, pnpm, and bun, the field is named overrides; for yarn, it is resolutions. For example:

package.json
{
"dependencies": {},
"overrides": {
"hermes-compiler": "250829098.0.4"
}
}

Hermes bytecode diffing for EAS Update and expo-updates

The Hermes bytecode diffing feature in expo-updates and EAS Update is an optimization that significantly reduces update download sizes for Hermes-compiled JavaScript bundles. Instead of downloading complete Hermes bytecode files for each update, the expo-updates client can request and apply binary patches (diffs) to the previously installed bytecode files.

This means your updates will be downloaded more quickly by end-users, and that each update will use less bandwidth. That all translates to faster update adoption rates and more updates available within the bandwidth of your EAS plan. It’s estimated that diffs will result in an approximately 75% reduction in Hermes bytecode and JavaScript download times on both Android and iOS.

app.json
{
"expo": {
"updates": {
"url": "https://u.expo.dev/[your-project-id]",
"enableBsdiffPatchSupport": true
}
}
}

This feature is opt-in for SDK 55, and we’ll turn it on by default in SDK 56. To enable it in your project today, refer to the enableBsdiffPatchSupport property documentation for information on the app.json config or iOS/Android native config options. You can confirm that bundle diffs are being served from the Update Details page. Open the Update Group you published, then select the platform you want to inspect.

If you’d like to try it with your own custom updates server, refer to this branch on expo/custom-expo-updates-server. Note that we’re prioritizing polishing up the experience with EAS Update, and we will improve the custom updates server reference at a later date.

Expansion of AI tooling for Expo developers

MCP: new tools for CLI actions and EAS services

An Expo Module can expose plugins and commands to the Expo CLI which will be made available in the [SHIFT] + M menu - these actions can now be automatically installed in the Expo MCP Server.

Additionally, you can now query EAS with the Expo MCP - so you can ask questions like “why did my most recent build fail?”. You can also query TestFlight crashes and feedback (if you have your ASC key associated with your Expo account, which is used typically during EAS Submit), so you can ask your agent of choice to “investigate the most recent crash reports and feedback from testflight” and watch it work.

Agent skills

The expo/skills repository is the official collection of AI agent skills from the Expo team for building, deploying, and debugging robust Expo apps. We primarily use Claude Code at Expo and skills are fine-tuned for Opus models. But you can use these skills with any AI agent.

We have found these skills to be a great complement to the MCP, and they help Claude Code work with Expo apps better than ever before. Try them yourself and give us feedback on how we can make them even better! We also welcome pull requests!

Be sure to check out the upgrade skills (installation instructions), which we recommend in the upgrading section to help you with upgrading to SDK 55.

Note: there are a lot of “expo/skills” being created by the community, which is great! The only skills that we currently officially endorse and plan to maintain/update are the skills you find in our expo/skills repo.

“Brownfield” (adding Expo to existing native apps)

SDK 55 improves the support for Brownfield apps and introduces a new isolated approach to brownfield integration via the new expo-brownfield package. You can now choose between integrated and isolated when developing your Brownfield project.

  • Integrated: React Native code lives inside your existing native project, ideal for teams iterating on both together.
  • Isolated: package your React Native app as a native library (AAR/XCFramework) that native developers can consume without needing a Node.js environment.

The package includes a config plugin, CLI for building artifacts, and APIs for bi-directional messaging between your native and Expo apps. We've also improved support for packages like expo-dev-menu with SwiftUI support and standalone usage.

Learn more in the Brownfield documentation.

More native features in Expo Router

  • New Colors API: add dynamic Material 3 styles to your Android app and adaptive colors on iOS.

Notice that the colors in the app adapt to the operating system in these screenshots.

  • New Apple Zoom transition: we’ve added support for interactive shared element transitions on iOS using the native zoom transition and gestures. This is currently an Apple-only feature, and it is enabled by default. Learn more.
  • New Stack.Toolbar API: UIToolbar API for iOS apps that provides access to APIs for building menus and actions. It’s currently iOS-only, and we plan to add support for similar Android APIs in the future. Learn more.

This UI pattern is a useful alternative to tabs when you want buttons at the bottom of the screen that need to perform actions or open menus rather than navigate between entire screens.

Expo UI

We are working towards a stable release in mid-2026, and the improvements in SDK 55 represent a huge improvement in its capabilities already. We’ve also added skills to expo/skills to make it easier to get started with Expo UI for both SwiftUI and Jetpack Compose.

Jetpack Compose

We have promoted our Jetpack Compose API from alpha to beta. As a test case for it, we created a clone of WikiReader by @nsh07: expo/wiki-reader.

Learn more in the Jetpack Compose documentation.

SwiftUI

We've updated @expo/ui SwiftUI component APIs to more closely match SwiftUI's. If you're familiar with SwiftUI, the Expo UI equivalents should now feel more familiar. We’re still in beta, and accordingly there are a number of breaking changes:

The hot-chocolate showcase app has also been updated to SDK 55 and the latest Expo UI APIs. Check it out for an example of building with SwiftUI in Expo.

New Expo SDK package versioning scheme

As of SDK 55, all Expo SDK packages use the same major version as the SDK. For example, the version of expo-camera that is compatible with SDK 55 is ^55.0.0. This makes it easy to identify at a glance that your Expo SDK packages are in fact intended for the SDK version you are using. It also accurately reflects that we do not intend for packages to be compatible across different SDK versions.

55 Modules, 55 CLIs, 55 Snacks, 55 Updates, 55 Builds, 55 Workflows, 55 Launches

Expo Modules Core

Expo Modules Core is the foundation for building native modules with a modern, unified API across iOS and Android. We use it for all of our modules, and we are always investing in making it the best tool to reach for when you need to extend the native capabilities of your app. Some of the improvements in SDK 55 include:

  • Adopted Swift 6 language mode: if you maintain native modules, your code will now be checked for data races at compile time, helping guarantee thread safety.
  • Added ArrayBuffer support: enabling efficient binary data transfer between JavaScript and native code — useful for audio, image, and file processing. Learn more in these pull requests: #39943, #41404, #41415, #41548. Documentation coming soon.
  • Added StaticFunction and StaticAsyncFunction to Class in modules API: allowing you to call functions on the module class itself without creating instances. Learn more in these pull requests: #38754, #39228.

Expo CLI

  • Improved dev server startup screen: the startup screen has been tweaked and got polished a little. It will now try not to cut off the QR code in small terminal windows, smaller QR codes will be displayed in terminals that support the new rendering mode we added (Alacritty, Ghostty, Kitty, Windows Terminal), and rendering bugs that prevent a working QR code from displaying have been fixed.
  • Environment file support via @expo/env: updated to rely on Node.js’ built-in parseEnv support. Dotenv support shouldn’t have noticeably changed and still supports expanding environment variables.
  • Reliable first-time local network access in development builds: we’ve added Apple Bonjour support for iOS + expo-dev-client in development builds in order to reliably request local network permissions before any request is made to a dev server by React Native. This works around an issue caused by a lack of a public API on iOS for requesting or querying local network access, and fixes a longstanding issue on iOS development builds where the app would hang or fail to load apps from your dev server on the first launch. We’ll continue investigating how to improve the experience on Android.
  • Dynamic app config loading: loading of dynamic app config files, such as app.config.js, has been updated to align with Node.js’ support of module loading. We now experimentally allow using .mjs, .cjs, .cts, and .mts for dynamic config extensions.
  • Experimental new Log Box on native: on web the new experience is enabled out of the box, for mobile development add EXPO_UNSTABLE_LOG_BOX=1 and rebuild the native application. The new interface doesn’t work in Expo Go yet. Try it out and let us know your thoughts!

Alpha release of expo-widgets for iOS

expo-widgets enables the creation of iOS home screen widgets and Live Activities using Expo UI components, without writing native code. It provides a shared-objects-based API for creating and updating widget timelines, starting and managing Live Activities, and listening for push-to-start tokens. Layout can be built using @expo/ui components and modifiers — this is the main distinction between expo-widgets and Voltra. Learn more about expo-widgets.

expo-blur is now stable on Android

Performant background blurring has been a pain point for Android developers for a long time — and that includes React Native developers targeting Android. In expo-blur, blurring on Android was hidden behind the experimentalBlurMethod due to high performance cost of rendering the blur. Starting with SDK 55, expo-blur uses the much more efficient RenderNode API on Android 12 and newer. This allows developers to add background blurs to views at a low performance cost.

Support for the new blur method required us to change how the Blur API works. You will now have to specify a <BlurTargetView> wrapper for the blurrable background content. If you don’t want to migrate to the new API just yet and need background blurs only for previously supported platforms, you can keep your current implementation as the introduced changes are non-breaking. Learn more.

A special thanks goes out to Dima Saviuk — these changes were possible thanks to work on Dimezis/BlurView, which we use for blurring on Android.

Experimental support for receiving shared data in expo-sharing

expo-sharing now provides a highly requested feature out-of-the-box: first-class support for sharing data into Expo apps. This will be possible thanks to a config plugin, which adds a share-extension app target on iOS and appropriate intent-filters on Android. Sharing requests are delivered via deep links, allowing you to easily handle them in JavaScript.

Thank you, Maxi Ast for your work on MaxAst/expo-share-extension! If you’re looking for this feature and want to use a library that has been battle tested in production, expo-share-extension may be a good option for you. This feature in expo-sharing will be marked as experimental in SDK 55.

Learn more about adding the ability to share content from other apps to your app.

Other Highlights

Deprecations

  • Deprecated removeSubscription functions exported from several Expo modules: switch to subscription.remove(), where subscription is the object returned when registering an event listener.
  • expo-video-thumbnails: deprecated in favor of generateThumbnailsAsync from expo-video. Not receiving patches and will be removed in SDK 56.
  • expo-video: deprecated track bitrate field in favor of averageBitrate and peakBitrate: #41532.
  • expo-navigation-bar: most methods deprecated and no-op'd now that edge-to-edge is mandatory on Android — background color, border color, behavior, position, and button style APIs no longer have any effect. The androidNavigationBar app.json config is also deprecated; use the expo-navigation-bar config plugin instead: #43276.
  • expo-status-bar: deprecated backgroundColor, translucent, and networkActivityIndicatorVisible props and their corresponding setter functions — these are no-ops with edge-to-edge. The androidStatusBar.backgroundColor and androidStatusBar.translucent app.json properties are also deprecated; use the expo-status-bar config plugin instead: #43276.
  • Refer to the CHANGELOG for a full list of deprecations.

Notable breaking changes

  • Following the deprecation and a warning, the notification configuration field was removed from the app.json schema. Specifying a notification entry will throw an error in prebuild - migrate to the expo-notifications config plugin.
  • Attempting to use push notifications in Expo Go on Android will throw an error. Until now, this was a warning. We first informed about the planned removal in the SDK 53 release post. To use push notifications, migrate to a development build.
  • App config evaluation toolchain changed. app.config.ts files are now transpiled with your installation of TypeScript, rather than a separate internal tool. If you notice any differences to prior SDK releases, open an issue.
  • expo-av was removed from Expo Go because it has been replaced by expo-video and expo-audio. Additionally, expo-av is no longer receiving patches and may not continue working in your apps as a result.
  • edgeToEdgeEnabled removed from app.json config: edge-to-edge is now mandatory when targeting Android 16+. #42518.
  • expo-router: the reset prop in headless tabs has been renamed to resetOnFocus: #40349.
  • expo-blur: experimentalBlurMethod prop renamed to blurMethod: #39996.
  • expo.experiments.autolinkingModuleResolution is now enabled by default in monorepos: if you're having issues with dependencies during the upgrade, we recommend trying to enable it to see if it resolves your issue. Learn more in the "Work with monorepos" guide.
  • The fast resolver and the EXPO_USE_FAST_RESOLVER have been removed: the fast resolver was already the default — there's now just one resolver implementation, and no action is needed.
  • experiments.reactCanary flag removed: React 19 is now the baseline, so the flag is no longer necessary.
  • Refer to the CHANGELOG for a full list of breaking changes.

Tool version bumps

  • Minimum Xcode bumped to 26. EAS Build uses Xcode 26.2 by default for SDK 55.
  • Minimum Node.js version increased. Expo's Node.js version support tracks LTS versions and also aims to support the latest version. Supported versions for SDK 55 include: ^20.19.4, ^22.13.0, ^24.3.0, and ^25.0.0.

Upgrading your app

Try using our upgrade skills (installation instructions) with Claude Code, or a similar tool of your choice, to upgrade your app.

Here's how to upgrade your app to Expo SDK 55 from 54:

  • Upgrade all dependencies to match SDK 55:
Terminal
npx expo install expo@^55.0.0 --fix
  • Check for any possible known issues with Expo Doctor. If you see warnings about duplicate native modules, a guide will appear to help resolve dependency update issues. To temporarily let Expo CLI work around this, enable expo.experiments.autolinkingModuleResolution in app.json. This option is enabled by default in monorepos.
Terminal
npx expo-doctor@latest

Thanks to everyone who contributed to the release!

The team, in no particular order: everyone contributed one way or another, with special mentions to the engineers most directly involved in this release: Alan Hughes, Aleksander Mikucki, Cedric van Putten, Christian Falch, Doug Lowder, Evan Bacon, Gabriel Donadel, Kudo Chien, Łukasz Kosmaty, Phil Pluckthun, Vojtech Novak, Wojciech Dróżdż, Jakub Grzywacz, Jakub Tkacz, Tomasz Sapeta, Hassan Khan, Krystof Woldrich, and Nishan Bende. Other contributors include Aman Mittal, Kadi Kraman, Keith Kurak, Quin Jung, Will Schurman, and Stanisław Chmiela. Welcome, Bartłomiej Klocek and Mathieu Acthernoene.

External contributors: Abhishek Raj, Aleksandr Kondrashov, Alfonso Curbelo, Amaury Liet, Andrej Pavlovic, Arthur Blais, Artur Morys - Magiera, Azeem Idrisi, azro352, Bartosz Kaszubowski, benjamin, Benjamin Komen, Benjamin Wallberg, Billy, brianomchugh, Błażej Kustra, C. Obama, CamWass, Choco, Chris Masters, Chris Zubak-Skees, Christian Wooldridge, Dalibor Belic, Daniel Meyer, Daniel Reichhart, Danish, Dave Mkpa-Eke, David Alonso, Delphine Bugner, Dennis Morello, desii, Dimitar Nestorov, Donghoon Nam, Doğukan Yıldız, Dwight Watson, Dylan, Emil Lindén, Eric Kreutzer, Eric Zeiberg, Fernando Rojo, Frank Calise, Gary Chiu, Gregory Moskaliuk, Gustavo Harff, hssdiv, HubertBer, Hugo Extrat, Ian K, Isaiah Hamilton, Jakub Kosmydel, Jc Cloete, Jeroen van Warmerdam, JeroenG, Jesper Sørensen, John HU, Jonathan Baudanza, Jonathan Rivera, Joseph Gift, Julie Saia, jurajpaska8, K.Dileepa Thushan Peiris, Kazuho Maejima, Kfir Fitousi, kimchi-developer, Kornelijus Šliubauskas, Krastan Dimitrov, Kræn Hansen, Kyle Ledbetter, Leonardo E. Dominguez, leonmetthez, Loic CHOLLIER, lucabc2000, Lucia Sarni, Manu, Matin Zadeh Dolatabad, Matthew Abraham, Mauko Quiroga-Alvarado, Maxime, Mikołaj Szydłowski, Mohammad Amin, Momtchil Momtchev, Myagmarsuren, Nicholas Pachulski, Nick Ater, Nicola Corti, Otávio Stasiak, Patrick Michalik, Patrick Wang, Patryk Mleczek, Peter Lazar, Petr Chalupa, Pflaumenbaum, Preet Patel, Randall71, Regi24, roach, Rodrigo Leite Araujo, Ronald Goedeke, Samuel Brucksch, Samuel Newman, Santiago Topolansky, Satyajit Sahoo, Sergiy Dybskiy, Serhii Pustovit, Shane Friedman, Shoghy Martinez, Shridhar Gupta, Shubh Porwal, Shubham Shinde, snowingfox, starsky-nev, teamclouday, Terijaki, TheUntraceable, ThiMal, Tomasz Zawadzki, Ty Rauber, Victor Bolivar De la Cruz, Vsevolod Lomovitsky, xoyseau, yerevin, and Zhovtonizhko Dmitriy.

Beta testers: Agrit Tiwari, Amrit Saini, androidanimation, Anthony Mittaz, Berhan, Brandon Austin, Chris Zubak-Skees, David Grimsley, Dunak, dylanfcsr, Eduardo Lomelí, ifx326, Kenji Okura, Kingfapa, Leonardo E. Dominguez, Lucas Hardt, Matthew Horan, Max, Nikhil Reddy Avuthu, R4Y, Robrecht Meersman, Rodolfo Perottoni, sbkl, Simon, and Sven.