React Native 0.89 is close. The first release candidate, v0.89.0-rc.0 , went up on November 4, 2026, a second one followed on November 10, and the official release schedule puts the stable release on December 7. That gives you about four weeks to find out what breaks in your app before it matters. Unlike 0.88, which the core team shipped with no user-facing breaking changes, 0.89 is a cleanup release. Most of what it removes is old plumbing left over from the move to the New Architecture. Your JavaScript will mostly be fine. The time goes into native modules, build tooling and the third-party libraries you depend on. This post is the audit we run before an upgrade like this, written for founders and product leads who need to know how big the job is, not just what changed.
Why this release needs a plan
React Native 0.82 made the New Architecture the only architecture. Since then, a set of switches and old APIs stayed around so older code would keep compiling. In 0.89 many of them are gone. The 0.89 changelog removes the bridgelessEnabled flags on both Android and iOS, along with the old three-argument load() overload on Android and the deprecated bridge-era initializers on iOS. Bridgeless mode is simply always on. If your app is a fairly standard Expo or React Native project, that may mean a quiet upgrade. If you have custom native modules, a brownfield app that embeds React Native inside an existing native app, or libraries that have not shipped an update in a year, this is where the surprises come from.
The breaking changes most teams will hit
From the 0.89 changelog, these are the items that show up in real B2B apps rather than in edge cases: CLI setup. @react-native/community-cli-plugin is no longer picked up automatically from react-native . It now has to be listed in your devDependencies , and React Native Community CLI 21.x is required. Assets. The separate @react-native/assets-registry package is removed. Code that imports it should use AssetRegistry from react-native and @react-native/asset-utils instead. Some older image and icon libraries import it directly. Removed props and APIs. The deprecated blurOnSubmit prop on TextInput is gone (use submitBehavior ), as are hasTVPreferredFocus and unstable_getScrollParent . unstable_batchedUpdates is now deprecated. Babel. The destructuring transform plugin is turned off in the preset, and the default transform profile is now hermes-stable . Most apps will not notice, but a custom Babel setup should be tested.
Android: codegen, Gradle and the target SDK
Android is where we expect the most build failures. Libraries that ship pre-generated JNI codegen will not build until they regenerate it with 0.89's codegen, because the codegen CMake build now uses -Werror and treats warnings as errors. The deprecated rncore.h header is removed, and the old New Architecture entry-point settings such as fabricEnabled and turboModulesEnabled are removed too. The release also moves the toolchain forward. The changelog lists the Android targetSdk moving to 37, Kotlin updated to 2.3.21 and the NDK bumped to r28c. A new target SDK can change runtime behaviour, not just the build, so plan a round of device testing on recent Android versions rather than only checking that the build is green.
iOS: Swift modules and removed bridge APIs
On iOS, RCTBridgeModule.h now has nullability annotations. The changelog gives a concrete example: a Swift module that overrides constantsToExport with an implicitly unwrapped return type, -> [AnyHashable : Any]! , no longer compiles and must return [AnyHashable : Any] . Several RCTBridge initializers and helpers are removed, and the legacy RCTNativeAnimatedModule is deleted. Projects using CocoaPods with USE_FRAMEWORKS may also need a header search path change for cxxreact . iOS packaging is a separate story. We covered the move from CocoaPods to Swift Package Manager in our CocoaPods exit plan ; check the final 0.89 release notes for exactly where that rollout lands.
A one-afternoon audit before you upgrade
You can size most of the work before anyone touches the upgrade. These searches across your app and node_modules find the removed APIs quickly:
# Removed or moved APIs (app code and dependencies)
grep -rn "assets-registry" --include=*.js --include=*.ts* src node_modules/*/package.json
grep -rn "blurOnSubmit\|unstable_getScrollParent\|unstable_batchedUpdates" src
# Native code on Android
grep -rn "rncore.h\|bridgelessEnabled\|fabricEnabled" android node_modules/*/android
# Swift modules returning implicitly unwrapped constants
grep -rn "constantsToExport" ios node_modules/*/ios | grep "!"Then do three things. First, list every dependency with native code and check whether its maintainers have tested against the 0.89 release candidates. Second, create an upgrade branch with the latest RC and build a release variant for both platforms, not just a debug build. Third, run your main flows on real devices: sign in, push notification open, deep links, payments and any screen that uses a native SDK.
Expo teams: what this means for you
If you use Expo, you will usually take React Native 0.89 through the next Expo SDK rather than on its own. The current Expo SDK 58 ships React Native 0.88. One date in Expo's notes matters now: the opt-out that lets you defer React Native's Strict TypeScript API migration is set to be removed after React Native 0.89, and Expo advises planning that migration during the SDK 58 cycle. If you set that opt-out, schedule the TypeScript work now. Our Expo SDK 58 upgrade plan covers the rest of that upgrade.
Should you upgrade in December?
Not necessarily on day one. The release schedule lists 0.88 and 0.87 as actively supported, so a production app on 0.88 is in good shape. A reasonable plan for most teams is to run the audit and the RC branch in November, fix or replace blocking libraries, and then upgrade in the weeks after the stable release once the first patch versions are out. What you should avoid is skipping several releases in a row. As we wrote when 0.88 shipped , each skipped version makes the next jump bigger and harder to test. If you also ship to the App Store, line this up with Apple's next deadline. Our post on Apple's April 2027 SDK requirement covers the iOS side, and doing both in the same quarter means one round of regression testing instead of two.
Founder takeaway
React Native 0.89 is a cleanup release, and cleanup releases are where old native code finally stops compiling. The cost depends almost entirely on your native modules and third-party libraries, and you can measure that in an afternoon with the RC. Do the audit in November, fix the blockers early, and upgrade after December 7 on your own schedule. Want a team to run the audit and the upgrade for you? Talk to CodeFlamme about your React Native app.




