expo-brownfield

Integrate Expo and React Native into existing native iOS and Android apps.

Updated Sep 6, 2026
One-click install
npx skills add https://github.com/sombek/fitness-guidance-app --skill expo-brownfield-sombek
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: expo-brownfield
Source: https://github.com/sombek/fitness-guidance-app/tree/main/mobile/.agents/skills/expo-brownfield
Command: npx skills add https://github.com/sombek/fitness-guidance-app --skill expo-brownfield-sombek

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes references (resource) components.

What problem does it solve? Adding React Native to an existing native iOS or Android app requires choosing between shipping a prebuilt AAR/XCFramework or embedding React Native directly into the Gradle and CocoaPods build, and each path involves complex native configuration that is easy to get wrong. ## Core Features & Use Cases - Isolated approach: Build the Expo project as a prebuilt AAR or XCFramework (or Swift Package) with expo-brownfield, so native teams consume React Native as a regular library without Node or RN tooling. - Integrated approach: Add React Native and Expo directly to the existing Gradle and CocoaPods build with autolinking, ExpoReactHostFactory, and ExpoReactNativeFactory for hot reload inside one unified build. - Decision guidance and troubleshooting: A comparison reference maps team structure and release cadence to the right approach, and a troubleshooting guide covers Metro connectivity, XCFramework signing, Maven resolution, and module name mismatches. - Use Case: An iOS team using Tuist wants to embed a React Native onboarding flow without installing Node; the skill guides building an XCFramework with npx expo-brownfield build:ios --package and presenting it via ReactNativeViewController. ## Quick Start Ask the assistant to help you add an Expo React Native screen to your existing native iOS or Android app and recommend whether the isolated or integrated brownfield approach fits your team.

Frequently Asked Questions about expo-brownfield

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I add React Native to an existing native iOS or Android app?

Use Expo's brownfield support with one of two approaches: build the Expo project as a prebuilt AAR/XCFramework consumed as a library, or add React Native and Expo directly to the existing Gradle and CocoaPods build. Both require Expo SDK 55 or later.

What is the difference between the isolated and integrated brownfield approaches?

The isolated approach ships React Native as a prebuilt AAR or XCFramework so the native team needs no Node or RN tooling. The integrated approach adds React Native sources to the existing Gradle and CocoaPods build, giving one unified build with hot reload but requiring RN tooling.

Which Expo SDK version is required for brownfield integration?

Expo SDK 55 is the minimum supported version for brownfield integration. Earlier SDKs lack the expo-brownfield package and the required ExpoReactHostFactory and ExpoReactNativeFactory entry points. Pin the SDK explicitly when creating the project.

Can the native team consume React Native without installing Node.js?

Yes, with the isolated approach the native app consumes a prebuilt AAR or XCFramework like any other dependency. Node.js and Yarn are only needed in the environment that builds the artifact, not in the consuming native app.

Why does my iOS app crash with 'Library not loaded' after embedding the XCFramework?

Every xcframework produced by build:ios must be set to Embed & Sign in the app target; missing one, commonly hermesvm.xcframework, causes runtime crashes. Using the Swift Package output via build:ios --package links all frameworks automatically.

Why does Gradle say it cannot find my brownfield AAR in mavenLocal?

The mavenLocal() repository must be declared under dependencyResolutionManagement in settings.gradle.kts, not the deprecated allprojects block. Also verify the artifact exists in ~/.m2 and that the group and libraryName match the plugin configuration.