Kipt

Expo brownfield skill: add React Native to an existing native app

Expo's official expo-brownfield skill helps your coding agent embed Expo and React Native in an existing iOS or Android app, isolated or integrated. Install it.

By the Kipt team · Updated 24 October 2026

Source: expo/skills · Maintainer: Expo · License: MIT · Checked: 24 October 2026

What is the expo-brownfield skill?

The expo-brownfield skill is Expo's official Agent Skill for adding Expo and React Native to an app that is already native iOS or Android. It helps your coding agent pick between the isolated approach (ship React Native as a prebuilt AAR or XCFramework) and the integrated approach (add React Native to your existing Gradle and CocoaPods builds), then embed and verify a React Native screen without breaking the host app. Install it with npx skills add https://github.com/expo/skills --skill expo-brownfield.

Its description reads: "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." Expo's own brownfield overview points AI agent users to this skill.

As of 24 October 2026, its skills.sh page listed 27.6K installs (snapshot, 24 October 2026). skills.sh first saw it on 19 May 2026.

What does it do?

The skill is model-invoked, so the agent loads it when you ask to bring React Native into a native app. The SKILL.md defines the term first: a brownfield app is "an existing native iOS or Android app that adopts React Native incrementally."

Inspect the host first. Before changing anything, the agent identifies the app's entry point, who owns navigation, the native build system, deployment targets and any React Native runtime already linked, and records the installed Expo, React Native and brownfield package versions from the lockfile. If you only want EAS Build or Submit for a Swift app, the skill says that doesn't need React Native and sends the task to eas-app-stores.

Protect the native app. It tells the agent to keep your SwiftUI App or UIKit window and your native screens, and states: "Do not run prebuild in a manually maintained native host, including during troubleshooting."

Pick an approach.

Approach What ships to the native app When the skill says to choose it
Isolated Prebuilt AAR and XCFramework The native team shouldn't need Node or React Native tooling; code lives in separate repos or ships on separate schedules
Integrated React Native sources added to the existing Gradle and CocoaPods build One team owns both sides and is comfortable with React Native tooling

It adds that both approaches support Metro and Fast Refresh in Debug, so "Choose integrated for shared build ownership, not because isolated lacks live JS iteration."

Match versions. For an existing Expo project, keep its SDK and align packages with npx expo install, and "Do not upgrade it just to follow this skill." For a new producer project, use the current stable SDK that fits the host's OS support and toolchain. A reference file compares SDK 55 and SDK 57 (React Native version, iOS minimum, Node and Xcode versions, and build defaults), and another notes that expo-brownfield was introduced in SDK 55.

Verify inside the host. The test is concrete: open the React Native screen with input, return a result to native, dismiss, reopen with fresh input, check listener cleanup and the host's navigation, then build the host in Release with Metro stopped. "Rendering only in Expo Go or the producer's example app does not validate the integration."

Reference files. Six files load as needed:

  • brownfield-isolated.md: building AAR and XCFramework artifacts with npx expo-brownfield build:android and build:ios, and the Kotlin and Swift entry points such as BrownfieldActivity, ReactNativeViewController and the SwiftUI ReactNativeView
  • brownfield-integrated.md: adding React Native and Expo directly to existing Gradle and CocoaPods builds
  • feature-integration.md: passing input, returning results, dismissing, cleaning up listeners and forwarding lifecycle events, with a SwiftUI host example
  • comparison.md: the full decision matrix
  • troubleshooting.md: Metro connection, build, signing and module resolution issues
  • version-compatibility.md: SDK and toolchain requirements

There is also an agents/openai.yaml for Codex.

How do you install it?

Expo's README recommends the plugin for Claude Code and Codex, and the skills CLI for other agents. The Expo skills docs cover the same routes.

Claude Code plugin (all Expo skills plus the Expo MCP server).

claude plugin install expo@claude-plugins-official

You can also run /plugin install expo@claude-plugins-official inside Claude Code. The plugin comes from Anthropic's official plugin marketplace; see Claude Code plugins.

Codex plugin.

codex plugin add expo@openai-curated

Just this skill, with the skills CLI. The command on skills.sh:

npx skills add https://github.com/expo/skills --skill expo-brownfield

Run it in the repo where the agent will work. The skills CLI puts the skill in .claude/skills/expo-brownfield/ for Claude Code, or ~/.claude/skills/expo-brownfield/ with -g, the standard Claude Code skill locations. Codex and Cursor read the same SKILL.md format; see Codex skills and Cursor skills.

How do you use it?

Tell the agent about your host app and what the React Native part should do. The skill's first step is reading the host, so give it access to the native project.

Example prompts (suggestions, not quotes from the repo):

  • We have a SwiftUI app and want one onboarding flow in React Native. Inspect the project and recommend isolated or integrated.
  • Package our Expo feature as an XCFramework and an AAR so the native teams can consume it without Node.
  • Embed the React Native checkout screen in our Kotlin app, pass the cart ID in and return the order result.
  • The embedded React Native screen can't reach Metro in Debug. Troubleshoot it without running prebuild on the host.
  • Check that our brownfield integration works in a Release build with Metro stopped.

Tips and limits

From the SKILL.md, Expo's docs and skills.sh, not from testing:

  • Alpha support. Expo's brownfield overview says integrating Expo modules into existing native projects is in alpha and that not all Expo tools and services work there yet. Its table marks Expo Dev Client as unsupported in brownfield, and EAS Build, EAS Submit and EAS Update as supported.
  • Toolchain needs. The machine that builds the React Native side needs Node.js (LTS) and the project's package manager; iOS builds need Xcode and CocoaPods. The skill says not to switch package managers just to follow an example. A native app that only consumes the isolated artifacts needs Xcode but no CocoaPods or React Native tooling.
  • Versions move fast. The reference file tells the agent to check the installed CLI's --help, generated wrappers and Package.swift, because flags and product names can change within a major release.
  • No license line in the frontmatter. Unlike most Expo skills, this SKILL.md has no license field. The MIT LICENSE files at the repo root and in plugins/expo cover it.
  • Feedback command. The skill tells the agent it can send feedback to Expo with npx --yes @expo/agent-cli@latest feedback, only when it has something specific to report. Watch for it if you don't want anything sent.
  • Audits. On 24 October 2026, skills.sh showed Pass from Gen Agent Trust Hub, Socket and Snyk, all three audits dated 22 October 2026.

Save it in your Kipt library

In Kipt, open Skills and paste the skill's GitHub folder link into the import box; it reads the SKILL.md, the six references/ files and agents/openai.yaml. Paste the repo link instead and Kipt shows a list of Expo skills to pick from, so you can add expo-module in the same pass. Your library stays in a private GitHub repo you own and installs into Claude Code or Codex with one command:

npx skills add https://github.com/<you>/<repo>.git --all -g

Kipt is not affiliated with Expo.

Similar skills

Questions

What is the expo-brownfield skill?

expo-brownfield is an official Agent Skill from Expo in the expo/skills repo. It helps a coding agent add Expo and React Native to an existing native iOS or Android app, such as embedding a React Native screen in SwiftUI, UIKit or Kotlin, or packaging it as an AAR or XCFramework. It is MIT licensed through the plugin's LICENSE file.

How do I install the expo-brownfield skill?

For Claude Code, Expo recommends the plugin: claude plugin install expo@claude-plugins-official, which installs every Expo skill and the Expo MCP server. For Codex, run codex plugin add expo@openai-curated. For this skill only, run npx skills add https://github.com/expo/skills --skill expo-brownfield.

Should I choose the isolated or the integrated approach?

The skill says to choose isolated when the native team should consume React Native as a regular AAR or XCFramework without Node or React Native tooling, or when the code lives in separate repos. Choose integrated when one team owns both sides and accepts adding React Native and Expo to the Gradle and CocoaPods builds.

Will the skill run expo prebuild on my native project?

It shouldn't. The SKILL.md says in bold: do not run prebuild in a manually maintained native host, including during troubleshooting. An isolated Expo producer project may use prebuild, but its generated ios and android folders stay separate from the app that consumes them.

Is brownfield support in Expo stable?

Expo's brownfield overview says support for integrating Expo modules into existing native projects is in alpha, and that not every Expo tool works in an existing native app yet. For example, it lists Expo Dev Client as not supporting brownfield, while EAS Build, EAS Submit and EAS Update do.

More in Skill directory

All guides

Keep your prompts and skills in one place, in your own GitHub. Install every skill with one command.

Get started

Kipt is an independent product, not affiliated with or endorsed by Anthropic, OpenAI, Cursor or GitHub. Claude, ChatGPT, Codex, Cursor and GitHub are trademarks of their owners.