expo-brownfield
This skill helps agents add React Native to existing native iOS or Android apps incrementally using Expo.
Identity proven by GitHub's verified organisation badge (expo)
- Agents
- Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode, claude.ai and API
- License
- MIT (permissive)
- Pin
- d4f4840pinned Oct 9, 2026
- Context cost
- about 1,400 tokenswhen the skill loads
- GitHub stars
- 2,682on expo/skills
- Scripts
- None found
What it does
“Integrate Expo and React Native into an existing native iOS or Android app. Use for brownfield, embedding a React Native screen in SwiftUI/UIKit or Kotlin, or AAR/XCFramework packaging. Covers isolated and integrated approaches. For building or distributing a purely native app with EAS, use eas-app-stores.”
Generated summary from the skill's own text
This skill helps agents add React Native to existing native iOS or Android apps incrementally using Expo. It supports two approaches: isolated (building prebuilt AAR/XCFramework artifacts) and integrated (adding React Native directly to the native project's build system). The skill covers version compatibility, feature integration patterns, and troubleshooting for both methods.
When to use it
- Embedding a React Native screen into an established SwiftUI, UIKit, or Kotlin app
- Building and distributing React Native as a library for native teams without Node tooling
- Adding React Native features to an app on independent native and JavaScript release cadences
- One team managing both native and React Native code in shared repositories
When not to
- Building a purely native app that does not need React Native features
- Starting a new app from scratch without existing native code to preserve
- Using EAS Build only to distribute native-only applications
Install
These commands install from the publisher's repository and need no account.
skills CLI
npx skills add expo/skills --skill expo-brownfieldInstalls from the repository's default branch, which may have changed since the commit we checked.
GitHub CLI 2.90 or later
gh skill install expo/skills expo-brownfield@d4f484024fec15196bfd3c272e953e3f983972cfInstalls the commit we checked (d4f4840).
Copy by hand
Download the folder at d4f4840 and put it in .claude/skills/expo-brownfield for Claude Code and in .agents/skills/expo-brownfield for Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode.
Claude Code plugin
/plugin install expo@claude-plugins-officialThe publisher's plugin in Claude's official marketplace. It may hold more than this skill, and we have not pinned it.
Copy for your agent
A prompt for any coding agent. It installs this skill from GitHub at the pinned commit, copies the files as they are, and runs nothing unless you ask.
Prompt
Install the agent skill "expo-brownfield" by Expo. Source, pinned to commit d4f484024fec15196bfd3c272e953e3f983972cf: https://github.com/expo/skills/tree/d4f484024fec15196bfd3c272e953e3f983972cf/plugins/expo/skills/expo-brownfield 1. Download that folder at exactly this commit. Do not use the default branch. 2. Copy every file unchanged, keeping the folder structure, into .claude/skills/expo-brownfield/ for Claude Code and .agents/skills/expo-brownfield/ for Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode. Create the folders if they do not exist. 3. Do not edit the files, and do not run any script in the folder unless I ask you to. 4. When you are done, list the files you copied and where you put them. Listing and checks: https://www.agentnative.dev/skills/expo/expo-brownfield
SKILL.md at the pin
--- name: expo-brownfield description: Integrate Expo and React Native into an existing native iOS or Android app. Use for brownfield, embedding a React Native screen in SwiftUI/UIKit or Kotlin, or AAR/XCFramework packaging. Covers isolated and integrated approaches. For building or distributing a purely native app with EAS, use eas-app-stores. --- # 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. ## Inspect the host first Identify the existing app entry point, navigation owner, native build system, deployment targets, and any React Native runtime already linked. Record the installed Expo, React Native, and brownfield package versions from the lockfile. Adding EAS Build or Submit to a Swift app alone does not require React Native; route that task to `eas-app-stores`. Preserve the host's SwiftUI `App` / UIKit window and native screens when embedding a feature. **Do not run prebuild in a manually maintained native host**, including during troubleshooting. An isolated Expo producer may use CNG; keep its generated `ios/` and `android/` separate from the consuming app. 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. - Both approaches support Metro and Fast Refresh in Debug. Choose integrated for shared build ownership, not because isolated lacks live JS iteration. ## 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, preserving the native app shell - ./references/feature-integration.md -- Pass input, return results, dismiss, clean up listeners, and forward lifecycle events; includes a SwiftUI host example - ./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. - The project's package manager and lockfile — npm, Yarn, pnpm, or Bun. Do not switch package managers just to follow an example. The iOS build environment needs Xcode and CocoaPods (use the project's Gemfile/Bundler setup when present). The isolated consuming app needs Xcode but no CocoaPods or RN tooling just to consume the artifacts. ## Select compatible versions For an existing Expo/RN project, keep its selected SDK and use `npx expo install` to align dependencies. Do not upgrade it just to follow this skill. For a new producer, use the **current stable SDK** compatible with the host's OS support, dependencies, and build toolchain; confirm the release is stable before selecting it. Before native setup, read [./references/version-compatibility.md](./references/version-compatibility.md) for matching native templates, toolchain/OS requirements, and build defaults across SDK versions. A purely native consumer has no Expo SDK version to pin, but must satisfy the artifact's requirements. ## Verify the feature in the host Open the RN screen with input, return a result to native, dismiss, and reopen with fresh input. Check listener cleanup and the host's original navigation. Then build the host in Release with a Release artifact and Metro stopped. Rendering only in Expo Go or the producer's example app does not validate the integration. See [./references/feature-integration.md](./references/feature-integration.md) for the complete acceptance scenario. ## Submitting Feedback If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve: ```bash npx --yes submit-expo-feedback@latest --category skills --subject "expo-brownfield" "<actionable feedback>" ``` Only submit when you have something specific and actionable to report. Include as much relevant context as possible. If an AI agent repeatedly failed or the user had to take over an Expo task, load the expo-skill-feedback skill and follow its eval-candidate flow instead of reusing the command above.
From expo/skills at d4f4840, shown as plain text under its license: MIT (permissive). The license text is in plugins/expo/LICENSE.
View SKILL.md on GitHub at d4f4840Files
- SKILL.md5.8 KB · 1f3e6b51e4f5
- agents/
- openai.yaml420 B · 1c3eb46ac47c
- references/
- brownfield-integrated.md23 KB · 5399ab0e61b1
- brownfield-isolated.md22 KB · 8f31a566c6c7
- comparison.md6.8 KB · 4ae5556acdc7
- feature-integration.md10 KB · 6ad925783577
- troubleshooting.md8.4 KB · 672dcd740bdc
- version-compatibility.md4.5 KB · 768c5472da08
8 files, 81 KB in total. Each file has a sha256 in the pin's manifest; the first 12 characters are shown.
Skill folder on GitHub at d4f4840More from Expo
expo-app-intents
This skill adds Apple App Intents to Expo apps, enabling Siri voice commands and Shortcuts automation through Swift declarations that dispatch to JavaScript…
Claude Code, Codex, Cursor +4 · about 3.6K tokens · pinned 6 days ago
expo-sqlite
This skill enables SQLite database operations in Expo and React Native apps for structured data storage, offline queues, and persistent caches.
Claude Code, Codex, Cursor +4 · about 2.6K tokens · pinned 6 days ago
eas-app-stores
This skill configures and executes iOS and Android app builds and store submissions using EAS, Expo's app distribution service.
Claude Code, Codex, Cursor +3 · about 1.7K tokens · pinned 6 days ago
eas-hosting
This skill deploys Expo web applications and API routes to EAS Hosting, a managed edge platform running on Cloudflare Workers.
Claude Code, Codex, Cursor +3 · about 2.7K tokens · pinned 6 days ago
eas-observe
EAS Observe tracks startup, navigation, and custom-event performance in production Expo apps through instrumentation (AppMetricsRoot/ObserveRoot wrapper…
Claude Code, Codex, Cursor +3 · about 1.1K tokens · pinned 6 days ago
eas-simulator
Runs a user's app on a remote iOS or Android simulator hosted on EAS cloud infrastructure, accessible from machines without local simulator support like Linux…
Claude Code, Codex, Cursor +3 · about 6.3K tokens · pinned 6 days ago
Related in Mobile
clerk-android
This skill implements Clerk authentication in native Android apps written in Kotlin and Jetpack Compose by following the clerk-android SDK patterns and…
by ClerkOfficial publisher
Claude Code, Codex, Cursor +4 · about 2K tokens · pinned 6 days ago
clerk-expo
Adds Clerk authentication to Expo and React Native apps using the @clerk/expo SDK.
by ClerkOfficial publisher
Claude Code, Codex, Cursor +4 · about 2.7K tokens · pinned 6 days ago
expo-animation
This skill guides building animations in React Native and Expo apps using Reanimated, Gesture Handler, and Expo Router.
by ExpoOfficial publisher
Claude Code, Codex, Cursor +3 · about 4.6K tokens · pinned 6 days ago
expo-migrate-module
Converts the Swift source code of an existing Expo native module from the 1.0 definition DSL to the 2.0 macro API, keeping its JavaScript and TypeScript…
by ExpoOfficial publisher
Claude Code, Codex, Cursor +3 · about 2.5K tokens · pinned 6 days ago
expo-module
This skill guides agents through creating and writing Expo native modules and views using the Expo Modules API with Swift, Kotlin, and TypeScript.
by ExpoOfficial publisher
Claude Code, Codex, Cursor +3 · about 1.5K tokens · pinned 6 days ago
expo-overview
Routes Expo and EAS tasks to the correct specialized skill by detecting the user's goal and project type.
by ExpoOfficial publisher
Claude Code, Codex, Cursor +3 · about 2K tokens · pinned 6 days ago