expo-brownfield
$
npx mdskill add expo/skills/expo-brownfieldA **brownfield** app is an existing native iOS or Android app that adopts React Native incrementally, as opposed to a **greenfield** app that is React Native from day one.
SKILL.md
.github/skills/expo-brownfieldView on GitHub ↗
--- name: expo-brownfield description: Integrate Expo and React Native into an existing native iOS or Android app. Use when the user mentions brownfield, embedding React Native in a native app, AAR/XCFramework, or adding Expo to an existing Kotlin/Swift project. Covers both the isolated approach and the integrated approach. --- # Expo Brownfield A **brownfield** app is an existing native iOS or Android app that adopts React Native incrementally, as opposed to a **greenfield** app that is React Native from day one. Expo supports two distinct ways to add React Native to a brownfield project: | Approach | What ships to the native app | When to choose | | -------------- | ------------------------------------------------------------------- | -------------------------------------------------------------------------------- | | **Isolated** | Prebuilt AAR / XCFramework | Native team doesn't need Node or RN tooling; RN code can live in a separate repo | | **Integrated** | React Native sources added to the existing Gradle / CocoaPods build | One team owns everything; comfortable with RN tooling; wants a single build | For the full decision matrix, see [./references/comparison.md](./references/comparison.md). ## Pick an approach Use these quick rules — fall through to `comparison.md` for anything ambiguous. - **Choose isolated** if the iOS/Android team must consume RN as a regular library dependency (AAR or XCFramework), without installing Node, Yarn, or the React Native build toolchain. - **Choose isolated** if RN code and native code live in separate repositories or release on independent cadences. - **Choose integrated** if a single team owns both the native and RN code and is willing to add React Native + Expo to the native project's Gradle and CocoaPods setup. - **Choose integrated** if you want hot reload and JS source maps to work seamlessly inside the existing native build process. ## References - ./references/brownfield-isolated.md -- Build RN as AAR/XCFramework and consume from the native app (BrownfieldActivity, ReactNativeViewController, ReactNativeView) - ./references/brownfield-integrated.md -- Add RN and Expo directly to existing Gradle and CocoaPods builds (ReactActivity, RCTRootView, Podfile) - ./references/comparison.md -- Decision criteria, trade-offs, and scenario mapping for choosing an approach - ./references/troubleshooting.md -- Metro connection, build, signing, and module-resolution issues common to both approaches More information available at https://docs.expo.dev/brownfield/overview/ ## Shared prerequisites Both approaches require, in the environment that _builds_ the React Native side: - **Node.js (LTS)** — runs the Expo CLI and JavaScript code. - **Yarn** — manages JavaScript dependencies. The integrated approach additionally requires **CocoaPods** on iOS (`sudo gem install cocoapods`). The isolated approach does **not** require CocoaPods or any RN tooling in the consuming native app. ## Versioning note **Expo SDK 55 is the minimum supported version for brownfield integration.** Earlier SDKs lack `expo-brownfield`, the required `ExpoReactHostFactory` / `ExpoReactNativeFactory` entry points, and the current autolinking surface. When creating the Expo project, always pin the SDK explicitly: ```sh npx create-expo-app@latest my-project --template default@sdk-55 ``` Pin the same Expo SDK across both the RN project and any embedded dependencies.
More from expo/skills
- add-app-clipAdd an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.
- building-native-uiComplete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.
- building-native-uiComplete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.
- codex-expo-run-actionsWire Expo projects into the Codex app with project-local run scripts and .codex/environments/environment.toml actions. Use when the user wants the Codex app Run button, build/run actions, action buttons, or a stable Expo start/run workflow from Codex.
- eas-update-insightsCheck the health of published EAS Updates: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health.
- expo-api-routesGuidelines for creating API routes in Expo Router with EAS Hosting
- expo-api-routesGuidelines for creating API routes in Expo Router with EAS Hosting
- expo-buildUse when building and deploying Expo apps with EAS Build. Covers build configuration, development builds, production builds, and app store submission.
- expo-cicd-workflowsHelps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.
- expo-cicd-workflowsHelps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.