In a greenfield app, React Native typically takes over the app, while a brownfield app adds React Native screens to an actively developed native app. Those screens can sit alongside SwiftUI, UIKit, Kotlin, or Jetpack Compose screens, with React Native initialized when needed, such as when someone opens a Settings tab.
You Don’t Need a Rewrite, You Need React Native Brownfield
Speakers
Callstack engineers Oscar Kashnitsky and Burak discuss React Native brownfield integration with host Łukasz on React Universe On Air Coffee Talk #27.
Historically, teams copied and modified React Native initialization code, then had to maintain it across React Native versions and architectures. The approach required deep native and React Native knowledge, and Objective-C integration could be awkward in Swift projects. The earlier Brownfield library simplified initialization and view creation for the Old Architecture, but it did not support the New Architecture.
Oscar describes work that began with React Native VisionOS and led to APIs for creating React Native instances and views. React Native Factory removes the need to subclass RCTAppDelegate, while RCTRootViewFactory handles view creation. The hosts say React Native 0.79 deprecates RCTAppDelegate, with further migration planned for a later release.
The library provides native-facing APIs for creating React Native views in UIKit, SwiftUI, and Jetpack Compose. Teams can use the standard setup with native and JavaScript code in one repository, or package React Native and its native dependencies as iOS frameworks or XCFrameworks and Android AARs. The packaged approach lets a native app consume React Native without adding CocoaPods or changing its existing repository workflow.
The guests recommend limiting data passed between native code and JavaScript because converting types and communicating across the boundary has a cost. Initial props are one simple way to pass data into a screen, and screens in one React Native instance can share JavaScript state. Separate instances can isolate contexts, but add memory, processing, and maintenance overhead.
Takeaways
- Keep the existing native app and introduce React Native screen by screen instead of planning a full rewrite.
- Decide whether a shared repository or packaged native frameworks better fits the team's build and review workflows.
- Use initial props for screen data and keep cross-boundary communication small.
- Screens in one React Native instance can share JavaScript state; separate instances bring isolation but add overhead.
- Brownfield integration still calls for native and React Native expertise, even as the APIs improve.
Mentioned in this talk
Search inside this talk
What was claimed 12
- role atOscar Kashnitsky is senior software engineer at
Callstack“I'm a senior software engineer here at Callstack.”
YouTube Unverified1 source· Talk
- uses
“React Native visionOS uses the SwiftUI life cycle.”
4:44inReact Native ❤️ Apple Vision Pro: Your App in the New DimensionYouTube Verified3 sources· Talk
- integrates withReact Native Brownfield integrates with React Native
“With the React Native Brownfield library, we can do that in two lines of code”
16:44inBrownfield Incremental React Native Adoption x RNEFYouTube Verified3 sources· Talk
- built
“I started working with Ricardo from the core team at Meta, and we came up with an API called RCTRootViewFactory.”
YouTube Unverified1 source· Talk
- featureReact Native Factory: Initializes React Native without requiring an RCTAppDelegate subclass.
“Its main goal was to completely remove the RCTAppDelegate subclass.”
YouTube Unverified1 source· Talk
- featureReact Native: React Native 0.80 is expected to enable the described migration away from RCTAppDelegate.
“React Native 0.80, which will have this enabled.”
YouTube Unverified1 source· Talk
- featureReact Native: React Native 0.79 deprecates RCTAppDelegate.
“Now, in React 0.79, the RCTAppDelegate is deprecated.”
YouTube Unverified1 source· Talk
- featureReact Native Brownfield: Supports loading SwiftUI, UIKit, and Jetpack Compose views.
“We have some view APIs that can load SwiftUI views, UIKit views, and Jetpack Compose views.”
YouTube Unverified1 source· Talk
- featureReact Native Brownfield: Provides native-facing APIs for creating React Native views from Swift and Kotlin code.
“You can import and use it from Swift and Kotlin code to create React Native views.”
YouTube Unverified1 source· Talk
- featureReact Native Brownfield: Can package React Native code and native dependencies as framework files for native applications.
“We take all the React Native code—and by that I mean JavaScript plus all the native dependencies—and package it all together.”
YouTube Unverified1 source· Talk
- usesReact Native uses Redux
“They can communicate with each other using a client state management library such as Redux.”
YouTube Unverified1 source· Talk
- featureLynx: Described as brownfield-first.
“Lynx, the new framework from ByteDance, is brownfield-first.”
YouTube Unverified1 source· Talk





