Unlocking Expo Updates in an Isolated Brownfield Architecture with SDK 55

Until recently, using Expo Updates within an Isolated Brownfield architecture was a significant challenge. Today, that limitation is a thing of the past.

In this guide, we will walk through the step-by-step process of enabling Expo Updates in an Isolated Brownfield environment using Expo SDK 55.

Getting started

First, let’s bootstrap a new Expo application using SDK 55. We will name this project my-expo-app:

npx create-expo-app@latest --template default@sdk-55

Prerequisites

Before proceeding, ensure you have completed the following:

iOS

Once your prerequisites are met, we need to generate the necessary XCFrameworks. This ensures that the newly added  Expo Updates package is bundled into your native library.

Run the following command to package the iOS library:

npx brownfield package:ios --scheme BrownfieldLib --configuration Release

Verify in Native

Head over to your native iOS application (where your XCFrameworks are linked) and run the app.

When you present the React Native UI, it should now be powered by the Brownfield library with Updates support enabled.

Android

The Android process currently requires a small workaround until official upstream support is available from Expo.

Apply the Temporary patch

Action required: Follow this link to the patch instructions before continuing and return here once completed.

Generate and publish the AAR

After applying the patch, run the following command to generate the AAR (Android Archive):

npx brownfield package:android --module-name brownfieldlib --variant release

Next, publish the AAR to your MavenLocal repository so your native Android app can consume it:

npx brownfield publish:android --module-name brownfieldlib

Verify in Native

Open your native Android project, ensure the AAR link is updated, and run the application.

Testing expo updates

Now for the magic: let’s see the Over-The-Air (OTA) updates in action.

Modify the UI

Open src/app/index.tsx and make a visible change. For example:

diff --git a/apps/ExpoApp55/src/app/index.tsx b/apps/ExpoApp55/src/app/index.tsx
index 25d499a..09eb462 100644
--- a/apps/ExpoApp55/src/app/index.tsx
+++ b/apps/ExpoApp55/src/app/index.tsx
@@ -36,7 +36,7 @@ export default function HomeScreen() {
         <ThemedView style={styles.heroSection}>
           <AnimatedIcon />
           <ThemedText type="title" style={styles.title}>
-            Welcome to&nbsp;Expo
+            Welcome to&nbsp;Expo 55
           </ThemedText>
         </ThemedView>

Publish the update

Push the changes to your staging channel using EAS:

eas update --channel staging --message 'testing 1st stg channel update' --environment staging

Verify the update

  1. First launch: Close the native app and relaunch it. Expo will detect and download the update in the background.
  2. Second launch: Close and relaunch the app again. You should now see "Welcome to Expo 55" reflected in your app.

🚀 Congratulations! You now have Expo Updates running smoothly in an Isolated Brownfield environment.

Final thoughts and notes

  • Android patch: Remember to remove the temporary Android patch once official support is released by the Expo team.
  • SDK 54 compatibility: If you are still on SDK 54, Expo Updates in an Isolated Brownfield Setup are not officially supported. However, you can use this specific patch to enable it.
  • Explore more: For more Brownfield tools and documentation, check out the React Native Brownfield GitHub. Don't forget to leave a star!

Insights

Learn more about Brownfield

cover

Aug 27Article

React Native in .NET MAUI: A Practical Brownfield Integration Guide

Learn how to embed React Native inside a .NET MAUI app with a brownfield setup. This guide covers runtime packaging, lifecycle wiring, navigation, and shared state across both runtimes.

cover

Aug 3Article

Migration to React Native in 2026 Starts With a Delivery Question

Choosing between brownfield and greenfield React Native migration? Learn where risk sits, when to use a checkpoint, and what to prove before committing.

cover

Jul 8Article

How we made Hybrid iOS apps compile 39% faster with React Native Brownfield

See how React Native Brownfield uses iOS prebuilts to cut packaging times by up to 39% for hybrid apps, with details on setup, internals, and benchmark results.

cover

Jun 18Article

How We Made the Brownfield Gradle Plugin 22% Faster

See how task-driven Gradle optimization made the Brownfield Gradle Plugin 22% faster for clean Android release builds.

cover

Jun 3Article

AI-Supported Brownfield Migration to React Native

See how AI-supported workflows cut brownfield React Native evaluation from weeks to days by speeding up setup, planning, implementation, and QA.

cover

Apr 23Talk

State of Brownfield in React Native

A practical look at Brownfield React Native adoption in mature native apps, architecture, tooling, and real-world tradeoffs.

cover

Apr 2Webinar

AI-Assisted Migrations to React Native: From Months to Days

Reduce migration time from months to days by using AI in real React Native workflows. Learn when to migrate incrementally and when starting fresh is the better option.

cover

Mar 31Article

Brownie: A Type-Safe Shared-State Workflow for Brownfield React Native

Brownie brings stable, cross-platform shared state to brownfield React Native apps with typed models for Swift and Kotlin.

cover

Nov 17Talk

Vega Developer Meetup

Learn how to integrate React Native into Android TV apps at the Vega Developer Meetup. Workshop, roadmap, and community talks, live in Munich.

cover

May 16Podcast

You Don’t Need a Rewrite, You Need React Native Brownfield

Discover how modern React Native Brownfield integration enables cross-platform power in native apps, without rewriting from scratch.

cover

Jan 13Podcast

Lessons from Shopify's Migration to React Native with Mustafa Ali

Learn how Shopify's migration to React Native led to 86% code unification, reduced build times, and seamless feature parity across platforms.

cover

Jun 14Podcast

Migration to React Native

The 13th episode of React Universe On Air (formerly known as The React Native Show) is fully focused on migrating from different technologies to React Native, the two most popular approaches to this process (greenfield and brownfield software development), and our state-of-the-art brownfield approach.

cover

Mar 19Tutorial

The Hard Way vs. The React Native AI SDK Way: Stop Writing Custom Modules for Every Model

Learn how React Native AI uses a unified provider model to switch between cloud and on-device LLMs without rewriting application logic, enabling reliable AI experiences online and offline.

cover

Mar 12Tutorial

Build Smarter Apps: Tool Calling & AI Orchestration Explained

Learn how on-device models in React Native can call tools, interact with external APIs, and return structured outputs you can use directly in application logic.

cover

Mar 5Tutorial

MLC LLM + React Native: On-Device AI Without the Pain

Learn how to run third-party on-device LLMs in React Native using MLC LLM. Choose your models, run them efficiently across platforms, and keep a unified JavaScript API with React Native AI.

cover

Feb 24Tutorial

Intelligent Fallbacks with Apple Intelligence in React Native

Learn how to use Apple’s built-in Foundation Models in React Native apps, reduce memory usage, and enable fast, fully on-device AI with React Native AI Apple.

cover

Feb 10Tutorial

What Is the React Native AI SDK? A Complete Intro & Quickstart

Learn why on-device AI matters for React Native apps, how local LLMs behave offline, and what problems React Native AI is designed to solve from day one.

cover

Jan 29Tutorial

Implementing an Android TurboModule with Kotlin

Learn how to implement a React Native TurboModule on Android, from the TypeScript spec and Codegen to the Kotlin implementation and package registration.

cover

Jan 19Tutorial

Working with Different Threads in Swift TurboModules

Learn how JavaScript, native module, background, and main threads interact in React Native TurboModules, and how to use GCD queues to run async work safely in Swift.

cover

Jan 9Tutorial

How to Add Type-Safe Constants to Swift TurboModules

Learn how to expose typed, immutable constants from a Swift TurboModule using Codegen, and get full end-to-end type safety between native and JavaScript.

cover

Dec 30Tutorial

Adding Event Emitters to Your TurboModule in Swift

Learn how to emit native events from a Swift TurboModule and subscribe to them in JavaScript, including proper memory management and Codegen integration.

cover

Dec 22Tutorial

Writing Your First TurboModule in Swift

Learn how to build a fully working TurboModule in Swift, integrate it with Codegen, and bridge it through Objective‑C inside an Expo app.