Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
6ef300f
chore: enable debug logging of brownfield plugin in demo apps
artus9033 May 11, 2026
c7a5d0d
feat: support RN Apple prebuilts in brownfield
artus9033 May 11, 2026
bf946a2
chore: embed proper frameworks
artus9033 May 12, 2026
1bc8380
chore: enable verbose logging in demo app build scripts
artus9033 May 12, 2026
f0af44f
chore: upgrade dependencies in ExpoApp55
artus9033 May 12, 2026
cd55536
fix: emit swiftversioninfo from packages
artus9033 May 12, 2026
c77bfbf
chore: nodemon do not exit on build failure
artus9033 May 12, 2026
8e93fa3
docs: update frameworks screenshot
artus9033 May 12, 2026
2e16963
chore: nodemon do not exit on build failure
artus9033 May 12, 2026
666dd6c
docs: update CONTRIBUTING.md with demo app reference
artus9033 May 12, 2026
32f28f0
chore: embed frameworks with signing in AppleApp
artus9033 May 12, 2026
68f941f
fix: brownfield app dylib install name with @rpath
artus9033 May 13, 2026
2949b2e
fix(demo): code-sign frameworks on copy in AppleApp
artus9033 May 13, 2026
d9319b4
chore: upgrade Rock & dependencies
artus9033 May 13, 2026
ebddd20
chore: upgrade dependencies in ExpoApp54
artus9033 May 13, 2026
47db72a
chore: restructure ios code of react-native-brownfield
artus9033 May 13, 2026
ebd03e6
chore: conditionally compile all source code in ExpoHostRuntime.swift
artus9033 May 13, 2026
f9a4e94
fix: vanilla ReactNativeHostRuntime
artus9033 May 13, 2026
a08437a
chore: fix paths to artifacts in AppleApp
artus9033 May 13, 2026
d3a85c8
chore: embed & sign frameworks in AppleApp
artus9033 May 13, 2026
ec7027a
chore: update Podfile in RNApp
artus9033 May 13, 2026
c2a3e4b
chore: commit yarn.lock
artus9033 May 13, 2026
acd6b4b
Merge branch 'main' into react-native-brownfield-prebuilts
artus9033 May 13, 2026
2a4d374
feat: make RN core prebuilts unsupported for Expo < 55 due to lack of…
artus9033 May 14, 2026
5a827e1
Merge remote-tracking branch 'origin/main' into react-native-brownfie…
artus9033 May 14, 2026
86375cd
chore: downgrade jest due to problems
artus9033 May 15, 2026
1736110
ci: rename AppleApp jobs
artus9033 May 15, 2026
78e6dfc
chore: reorganize AppleApp project to accomodate prebuilt & non-prebu…
artus9033 May 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/reactbrownfield-swiftinterface-xcframework.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@callstack/react-native-brownfield': patch
---

Force `BUILD_LIBRARY_FOR_DISTRIBUTION` / `SWIFT_EMIT_MODULE_INTERFACE` on the CocoaPods ReactBrownfield, Brownie and BrownfieldNavigation targets so Release builds emit `.swiftinterface` files and `xcodebuild -create-xcframework` (brownfield `package:ios`) can merge slices.
7 changes: 7 additions & 0 deletions .changeset/use-prebuilt-rn-core-flag.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@callstack/brownfield-cli': minor
---

Support RN prebuilts in Brownfield, by default enabled in RN >= 0.84, opt-in in RN 0.83; or in Expo 55+ (Expo 54 is not supported).

Add `--use-prebuilt-rn-core` to `brownfield package:ios` so callers can opt into or out of React Native Apple prebuilt binaries; omitting the flag defers to version-aware defaults handled by Rock. The CLI rejects `--use-prebuilt-rn-core` when React Native is older than 0.81 or when the project is Expo SDK older than 55.
2 changes: 1 addition & 1 deletion .github/actions/appleapp-road-test/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ runs:
run: echo "$(brew --prefix)/opt/ccache/libexec" >> $GITHUB_PATH
shell: bash

- name: Restore RNApp & AppleApp ccache
- name: Restore AppleApp ccache
uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5
with:
path: |
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,73 +54,73 @@
yarn workspace @callstack/react-native-brownfield brownfield --version

android-androidapp-expo:
name: Android road test (RNApp & AndroidApp - Expo ${{ matrix.version }})
name: Android road test (AndroidApp - Expo ${{ matrix.version }})
runs-on: ubuntu-latest
needs: build-lint
strategy:
matrix:
include:
- version: '54'
- version: '55'

steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6

- name: Run RNApp -> AndroidApp road test (Expo ${{ matrix.version }})
uses: ./.github/actions/androidapp-road-test
with:
flavor: expo${{ matrix.version }}
rn-project-path: apps/ExpoApp${{ matrix.version }}
rn-project-maven-path: com/callstack/rnbrownfield/demo/expoapp${{ matrix.version }}/brownfieldlib

android-androidapp-vanilla:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}
name: Android road test (RNApp & AndroidApp - Vanilla)
name: Android road test (AndroidApp - Vanilla)
runs-on: ubuntu-latest
needs: build-lint

steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6

- name: Run RNApp -> AndroidApp road test (Vanilla)
uses: ./.github/actions/androidapp-road-test
with:
flavor: vanilla
rn-project-path: apps/RNApp
rn-project-maven-path: com/rnapp/brownfieldlib

ios-appleapp-vanilla:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}
name: iOS road test (RNApp & AppleApp - Vanilla)
name: iOS road test (AppleApp - Vanilla)
runs-on: macos-26
needs: build-lint

steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6

- name: Run RNApp -> AppleApp road test (Vanilla)
uses: ./.github/actions/appleapp-road-test
with:
variant: vanilla
rn-project-path: apps/RNApp

ios-appleapp-expo:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}
name: iOS road test (RNApp & AppleApp - Expo ${{ matrix.version }})
name: iOS road test (AppleApp - Expo ${{ matrix.version }})
runs-on: macos-26
needs: build-lint
strategy:
matrix:
include:
- version: '54'
- version: '55'

steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6

- name: Run ExpoApp -> AppleApp road test (Expo ${{ matrix.version }})
uses: ./.github/actions/appleapp-road-test
with:
variant: expo${{ matrix.version }}
rn-project-path: apps/ExpoApp${{ matrix.version }}

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}
48 changes: 44 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,51 @@ We use [changesets](https://github.com/changesets/changesets) to make it easier
- `build:example:android-consumer:expo55` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the Expo 55 RN app (`apps/ExpoApp55`) artifact
- `build:example:android-consumer:expo54` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the Expo 54 RN app (`apps/ExpoApp54`) artifact
- `build:example:android-consumer:vanilla` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the vanilla RN app (`apps/RNApp`) artifact
- `build:example:ios-consumer:expo55` - builds the example native iOS consumer app (`apps/AppleApp`) consuming the Expo 55 RN app (`apps/ExpoApp55`) artifact
- `build:example:ios-consumer:expo54` - builds the example native iOS consumer app (`apps/AppleApp`) consuming the Expo 54 RN app (`apps/ExpoApp54`) artifact
- `build:example:ios-consumer:vanilla` - builds the example native iOS consumer (`apps/AppleApp`) app's flavor consuming the vanilla RN app (`apps/RNApp`) artifact
- `build:example:ios-consumer:expo` - alias for `build:example:ios-consumer:expo55`
- `build:example:ios-consumer:expo55` - builds the `Brownfield Apple App (ExpoApp55)` target via scheme **Brownfield Apple App Expo 55** (`Release`)
- `build:example:ios-consumer:expo54` - builds the `Brownfield Apple App (ExpoApp54)` target via scheme **Brownfield Apple App Expo 54** (`Release`)
- `build:example:ios-consumer:vanilla` - builds the `Brownfield Apple App (RNApp)` target via scheme **Brownfield Apple App Vanilla** (`Release Vanilla`)

## Example app tests
## Running demo apps

Each of the apps in `apps/` provides scripts for running them. You can run them either standalone, or package for brownfield.

### Standalone run

Each of the apps can be run standalone, by running `yarn ios` or `yarn android`.

### Packaging for brownfield

To package an application for brownfield, you can run `yarn brownfield:package:ios` or `yarn brownfield:publish:android`.

### Running a brownfield host app

There are 2 brownfield host apps.

> [!IMPORTANT]
> Each of the scripts below requires you to **first** package the consumed RN application with `yarn brownfield:package:ios`, e.g. `cd apps/ExpoApp55 && yarn brownfield:package:ios`.

- `apps/AndroidApp` - for Android
- `build:example:android-consumer:expo54` - consumes Expo 54
- `build:example:android-consumer:expo55` - consumes Expo 55
- `build:example:android-consumer:vanilla` - consumes the vanilla `RNApp`
- `apps/AppleApp` - for Apple (three Xcode targets, each with its own shared scheme)
- `build:example:ios-consumer:expo54` — target `Brownfield Apple App (ExpoApp54)`, scheme **Brownfield Apple App Expo 54**
- `build:example:ios-consumer:expo55` (or `expo`) — target `Brownfield Apple App (ExpoApp55)`, scheme **Brownfield Apple App Expo 55**
- `build:example:ios-consumer:vanilla` — target `Brownfield Apple App (RNApp)`, scheme **Brownfield Apple App Vanilla**

For iOS, each script uses the previously packaged artifacts from the respective directory (`apps/RNApp`, `apps/ExpoApp54`, or `apps/ExpoApp55`), invokes `prepareXCFrameworks.js` to copy XCFrameworks into `apps/AppleApp/package`, then runs `xcodebuild` against the matching scheme. The Xcode project reads fixed paths under `package/` (for example `package/BrownfieldLib.xcframework`).

| Yarn script | RN app | Xcode target | Scheme | Configuration |
| --- | --- | --- | --- | --- |
| `build:example:ios-consumer:vanilla` | `RNApp` | `Brownfield Apple App (RNApp)` | Brownfield Apple App Vanilla | `Release Vanilla` |
| `build:example:ios-consumer:expo54` | `ExpoApp54` | `Brownfield Apple App (ExpoApp54)` | Brownfield Apple App Expo 54 | `Release` |
| `build:example:ios-consumer:expo55` | `ExpoApp55` | `Brownfield Apple App (ExpoApp55)` | Brownfield Apple App Expo 55 | `Release` |

> [!IMPORTANT]
> You can build and run `AppleApp` from the Xcode GUI by selecting the scheme for the variant you want. Before running, after switching schemes or re-packaging an RN app, run the matching `build:example:ios-consumer:...` script so fresh artifacts are present in `apps/AppleApp/package`. Otherwise Xcode will still link against the previous XCFrameworks.

## Tests

The React Native example apps share Jest utilities and test suites from `apps/brownfield-example-shared-tests`. Tests exercise integration with `@callstack/react-native-brownfield`, `@callstack/brownfield-navigation`, and `@callstack/brownie` as used in each demo.

Expand Down
Loading
Loading