The React Native New Architecture in 2026: When Fabric and TurboModules Actually Pay Off
Fabric and TurboModules are now the default in React Native. Here's an honest read on which apps benefit, which don't, and what breaks when you flip the switch.
For most of 2024 and 2025, the React Native "new architecture" was the thing everyone nodded about and quietly deferred. In 2026 that excuse is gone: it's the default in React Native 0.76+, Expo SDK 52 ships with it enabled, and the old bridge is on a deprecation clock. The interesting question is no longer should we migrate, but what do we actually get, and what breaks when we do?
This is a field report from shipping several apps on the new architecture — some greenfield, some migrated from 0.72-era codebases — and a frank look at where the pain sits.
What "new architecture" actually means now
The umbrella term covers three related pieces that ship together:
- Fabric — the new renderer. Replaces the old UIManager and moves layout and view creation off the JS thread's async bridge onto synchronous C++ calls into native.
- TurboModules — lazy-loaded native modules with a codegen'd type-safe interface (JSI-based) instead of the batched, JSON-serialised bridge.
- Bridgeless mode — the final step: the classic bridge is removed entirely. Everything goes through JSI and the new event loop.
By React Native 0.76 these are on by default. By 0.78 (mid-2025) Bridgeless became the only supported mode for new projects. If you're on Expo SDK 52 or later you already have all three unless you explicitly opted out.
The mental model shift
Under the old bridge, JS and native spoke by posting serialised messages across a queue. That queue was the source of most of React Native's famous gotchas: dropped frames during heavy JS work, setNativeProps as an escape hatch, awkward measurement APIs that had to round-trip async.
JSI replaces that with direct C++ function calls. JS can hold a reference to a native object and call methods on it synchronously. That single change is what makes Fabric, TurboModules, Reanimated 3+, and the new event loop possible.
Where it genuinely helps
Let's be specific. In our experience, the wins cluster in a few areas.
Complex list and gesture-heavy screens. Anything using Reanimated worklets, gesture handlers, or FlashList with custom cell renderers feels noticeably smoother. Synchronous layout means you can measure and respond in the same frame instead of waiting a tick. Scroll jank on long feeds — the kind you'd previously fix by rewriting a cell in native — often just goes away.
Apps with lots of small native modules. TurboModules load lazily. If your app pulls in 40 native modules through transitive dependencies (Sentry, Firebase, RevenueCat, MMKV, a dozen Expo modules, etc.), old-architecture startup paid the init cost for all of them. New architecture defers most of that until first use. Cold start improvements in the 100–300ms range are realistic, though your mileage depends heavily on what those modules do.
Screens that mix native views with React. Interop between native components and React trees used to require careful use of requireNativeComponent and hope. Fabric's concurrent rendering plays much better with native views embedded mid-tree — think camera previews, map overlays, or video players surrounded by React UI.
Anything using Suspense and transitions. React 18/19 features like useTransition and Suspense boundaries only really behave correctly under Fabric. On the old architecture they mostly worked but had rough edges around commit timing.
Where it doesn't move the needle
Be honest with yourself. If your app is:
- Mostly forms, lists of text, and CRUD screens
- Not gesture-heavy
- Not doing custom native views
- Already hitting 60fps on mid-range Android devices
...you will not see a user-visible difference. The architecture is better engineered, but the perf ceiling on a settings screen is already the ceiling. Migrate for the future support story, not for a wow moment that isn't coming.
The migration reality
If you're on a recent Expo SDK or a fresh RN 0.76+ template, you're done — it's on. The interesting story is migrating an older app.
What breaks
The short list of things that reliably need attention:
- Any native module that hasn't been updated. Modules using the old
RCTBridgeModuleinterface still work through an interop layer, but that layer has quirks — particularly around constants and synchronous methods. Check every native dependency for a new-architecture-compatible release. findNodeHandleand imperative ref patterns. Some of these were already discouraged; now they either don't work or behave differently. Audit uses ofUIManager.measure,setNativePropson non-host components, and anything reaching into the view hierarchy imperatively.- Custom native views written against the old ViewManager API. These need to be ported to the codegen'd component spec. It's mechanical but not zero work — expect a day per non-trivial component.
- Third-party libraries with C++ code. Anything statically linking or doing JSI tricks may need version bumps. Reanimated, Skia, MMKV, and Gesture Handler are all fine on current versions, but pinned older releases will fight you.
A minimal check
Before you migrate, run this against your package.json dependencies to spot native modules:
npx react-native config | grep -E '"(ios|android)"' -A 2 | grep sourceDir
For each native dependency, check its changelog for a "new architecture support" or "Fabric support" note. If it's silent and hasn't been updated in 12+ months, treat it as a risk item.
Enabling it manually
On a bare React Native project the switches are:
# android/gradle.properties
newArchEnabled=true
# ios/Podfile.properties.json
{
"newArchEnabled": "true"
}
On Expo, it's a single field in app.json:
{
"expo": {
"newArchEnabled": true
}
}
Rebuild native, and then spend a full day clicking through the app on both platforms. Not automated tests — hands on the device. The failure modes are visual and timing-related; unit tests won't catch them.
Comparison: is this closing the gap with Swift/Kotlin?
A fair question, and the honest answer is somewhat.
For UI-heavy screens, the gap between a well-built React Native app and a native Swift/Kotlin app in 2026 is smaller than it's ever been. Fabric's synchronous layout removes one of the last structural reasons a native app felt inherently smoother. Gesture-driven interactions that previously required dropping into native can now be built entirely in JS with Reanimated worklets.
Where native still wins, unambiguously:
- Deep OS integration — Live Activities, App Intents, Widgets, WatchOS, Wear OS. These have RN wrappers of varying quality but you're always trailing the platform.
- Startup time on cold launch. New architecture helps, but a Swift app that doesn't boot a JS runtime will always start faster. If sub-400ms cold start is a hard product requirement, that's a native conversation.
- Binary size. RN adds roughly 8–15MB depending on what you include. Sometimes that matters, usually it doesn't.
For most product teams building consumer or B2B apps, the new architecture makes React Native a defensible default rather than a compromise. If you want a longer conversation about that trade-off for a specific product, that's the kind of thing we talk through on our mobile engagements.
The OTA and release-ops angle
One underdiscussed detail: the new architecture changes what's shippable via OTA updates.
JS-only changes still push through EAS Update or CodePush as before. But because more logic lives in codegen'd native interfaces, certain changes that felt like JS changes now require a store build — particularly adding a new native module or bumping one to a version with a different spec. The rule of thumb hasn't changed (native code = store build) but the boundary is easier to cross accidentally.
Build verification is worth automating. Fail the CI job if the native fingerprint changed on a branch that was expecting to ship OTA-only.
What we'd do
If you're starting a new React Native app in 2026: use Expo SDK 52 or later, leave the new architecture on, and don't think about it again.
If you're on an older codebase: don't migrate for perf theatre. Migrate when you're already doing a dependency sweep or a major RN upgrade, budget a full sprint for regression testing on real devices, and check every native module's compatibility before you start rather than after. The upgrade itself is a two-line config change; the tail of edge cases is where the time goes.
Want a team like ours?
72Technologies builds production software for the kind of teams who actually read this blog.
Start a projectKeep reading

Debugging React Native Startup Time in 2026: Where the Milliseconds Actually Go
A field guide to profiling and shrinking cold-start time in a New Architecture React Native app — what to measure, which tools lie to you, and the fixes that consistently move the needle.

Deep Links That Actually Work: Universal Links, App Links, and Expo Router in 2026
Deep linking looks trivial until a marketing email opens Safari instead of your app. Here's how we wire Universal Links, Android App Links, and Expo Router so links land where they should — every time.

Offline-First React Native in 2026: Choosing Between WatermelonDB, PowerSync, and Plain SQLite
We've shipped offline-first React Native apps on WatermelonDB, PowerSync, and hand-rolled SQLite. Here's how to pick the right one before you've written 40k lines of sync code you'll regret.
