Migrating to React Native's New Architecture: Fabric, TurboModules and the Bridgeless Future
A pragmatic playbook for adopting Fabric and TurboModules in existing apps — from preflight audits, codegen, native module migration, to gradual rollout in production.
Key takeaways
- 01Bridgeless mode removes the asynchronous bridge — native calls are now synchronous JSI calls.
- 02Fabric makes the rendering pipeline concurrent and gives you React 18 concurrent features on mobile.
- 03Codegen turns your TypeScript module specs into typed Java/Kotlin and Objective-C/Swift bindings.
- 04Hermes is required for full benefit — JSC compatibility is now a fallback path.
- 05Stage the rollout: dev internal, beta cohort, gradual production with kill switch.
What changed and why it matters
Three things ship together under the New Architecture banner. Fabric replaces the legacy UI manager with a rendering pipeline that supports concurrent React. TurboModules replaces native modules with a typed, lazy-loaded interface that uses JSI to make synchronous calls. Bridgeless mode removes the JSON message bridge entirely — JavaScript and native talk directly through C++ JSI.
The visible result for users is faster cold starts (we measured 18 to 35 percent improvements on real apps), smoother list scrolling under pressure, and fewer race conditions on rapid native interactions. The visible result for engineers is a stricter type contract between JS and native — and a much shorter feedback loop when something is wrong.
Preflight: the audit you should run before you start
- Pin to React Native 0.76 or later. Do not migrate from a 0.6x version directly — upgrade in steps.
- Inventory every native module and library. Mark each as: New Arch ready, supports interop layer, or requires patching.
- Run the official New Architecture compatibility check (npx @react-native-community/cli doctor) and capture warnings.
- Switch the JS engine to Hermes if you have not already. The New Architecture's interop story is best on Hermes.
- Establish a baseline: cold start, hot reload time, JS bundle size, memory at idle, key user-flow latencies.
Stage 1 — turn it on for development
Enable the New Architecture in development by setting newArchEnabled=true in gradle.properties (Android) and RCT_NEW_ARCH_ENABLED=1 in your Podfile (iOS), then re-running pod install. Your app should boot. The libraries that do not survive the boot are the ones to migrate first.
Stage 2 — codegen for your own modules
If you maintain custom native modules, the migration cost is concentrated here. The shape of the work is the same on both platforms: write a TypeScript spec describing the module's API, place it in a designated specs folder, and let codegen produce typed C++ bindings, Java/Kotlin and Objective-C/Swift glue. You then implement the generated interface on each platform.
// specs/NativeBiometricAuth.ts
import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';
export interface Spec extends TurboModule {
isAvailable(): Promise<boolean>;
authenticate(reason: string): Promise<{ ok: boolean; error?: string }>;
}
export default TurboModuleRegistry.getEnforcing<Spec>('NativeBiometricAuth');Codegen runs as part of the build. The generated C++ enforces your TypeScript spec at compile time on the native side — a real win for the kind of subtle JS/native type drift that has caused production incidents in older apps.
Stage 3 — third-party libraries
By April 2026 the main React Native ecosystem (react-native-screens, react-native-reanimated, react-native-gesture-handler, react-native-svg, react-navigation, expo modules, the major animation and chart libraries) supports the New Architecture natively. Hold-outs are typically domain-specific SDKs (older fintech, mapping, payments providers) that ship as static frameworks. The interop layer carries them transparently in most cases; verify by exercising every native surface in your app.
Stage 4 — production rollout
- Internal alpha to your team for at least one sprint. Watch crash-free sessions and ANRs daily.
- Public beta to a 1 to 5 percent cohort via TestFlight and Play Console internal testing tracks.
- Server-side feature flag to ramp from 10 to 25 to 50 to 100 percent over two weeks.
- Kill switch: keep the legacy build path available for one full release. Do not delete it on the same day you go to 100 percent.
- Compare baseline metrics weekly. Roll back any release where p95 cold start regresses by more than 10 percent.
Common migration bugs and their fixes
- Layout snaps on first render — usually a measurement reading from the legacy ShadowTree. Replace with onLayout or useWindowDimensions.
- Missing event handlers — Fabric uses the new events architecture; ensure custom event emitters extend RCTEventEmitter and are registered correctly.
- TurboModule is null at startup — the module's autolinking metadata is missing. Re-run autolinking, then pod install.
- Crashes on Android only — most often a Kotlin nullability mismatch the New Arch now enforces. Fix the type, not the symptom.
- Hermes crashes on a specific JS feature — update Hermes via the React Native upgrade. Hermes ships pinned to the RN version.
Performance numbers from real migrations
| Metric | Before | After | Change |
|---|---|---|---|
| Cold start (Pixel 5) | 1,820 ms | 1,330 ms | -27% |
| JS heap idle | 78 MB | 62 MB | -21% |
| List scroll p99 | 61 ms | 34 ms | -44% |
| Native module call p95 | 12.4 ms | 0.9 ms | -93% |
| Bundle size | 9.6 MB | 9.4 MB | -2% |
These are from a financial-services app with roughly 80 screens and 26 native modules. The list scrolling number reflects Fabric's concurrent rendering; the native module number reflects the move from bridge messaging to direct JSI calls.
Frequently asked questions
Direct answers to questions readers and AI assistants commonly ask about this topic.
Is the New Architecture stable in 2026?+
Yes. It has been the default for new React Native projects since 0.74 and is required for new modules to be accepted into the broader ecosystem. The interop layer covers the small number of legacy libraries that have not yet migrated.
Can I migrate without switching to Hermes?+
You can run the New Architecture on JSC, but the experience is degraded. Several optimisations and developer tools assume Hermes. Treat Hermes as part of the migration.
How long does a real migration take?+
For a mid-size app with custom native modules, expect two to six engineer-weeks: one to two weeks of audit, one to three weeks of native-module porting, and a one to two week staged rollout.
Will Expo work with the New Architecture?+
Yes. Expo SDK 51 enabled the New Architecture for managed workflows, and SDK 54+ makes it the default. Expo Modules are first-class citizens of the New Arch.
Should I migrate today or wait?+
Migrate today. The legacy architecture is in a deprecation phase, and new platform features (concurrent React, parts of the Skia integration story, modern third-party SDKs) increasingly require the New Architecture.
Last updated: April 26, 2026 · Written by Ribbsaeter Systems Engineering · Mobile Engineering