By Malik Chohra
Expo and the React Native New Architecture: A Practical Deep Dive
How the React Native New Architecture (JSI, Fabric, TurboModules, Codegen) changes Expo apps in 2026, what actually gets faster, the migration gotchas, and how to verify it is enabled in your project.
The React Native New Architecture replaces the old asynchronous bridge with JSI, a Fabric renderer, and TurboModules. In practice that means synchronous native calls, fewer serialization round-trips, and smoother UI under load. By Expo SDK 55 (the current line in 2026) the New Architecture is the default for new projects, and most of the Expo-maintained modules support it out of the box. This guide is the practical version: what genuinely gets faster, where the migration gotchas are, and how to confirm it is actually on in your app.
What is the New Architecture, in plain terms?
The old architecture passed every native call across an asynchronous JSON bridge. Each interaction, measuring a layout, reading a native module value, dispatching a UI update, was serialized to a string, queued, and deserialized on the other side. That bridge was the source of a whole class of React Native performance problems: dropped frames during heavy scroll, laggy gesture handlers, and the “everything feels half a beat behind” quality that cheap apps have.
The New Architecture removes that bridge. Four pieces do the work:
- JSI (JavaScript Interface), a thin C++ layer that lets JavaScript hold direct references to native objects and call them synchronously, with no serialization.
- Fabric, the new rendering system. It builds the UI tree in C++ and can apply updates synchronously, which is what makes animations and gesture-driven UI feel tight.
- TurboModules, native modules that load lazily and expose themselves to JS through JSI, so startup does not pay for modules the screen does not use yet.
- Codegen, generates the type-safe native interfaces from your TypeScript spec files, so the JS and native sides cannot drift out of shape.
What actually gets faster (and what does not)
Be precise about the wins, because not everything improves. The real gains show up where the old bridge was the bottleneck:
- Gesture and animation responsiveness. Synchronous layout reads through JSI mean a gesture handler can measure and react in the same frame instead of one frame late.
- Startup on module-heavy apps. TurboModules' lazy loading means an app with dozens of native dependencies does not initialize all of them on launch.
- Large-list and complex-screen rendering. Fabric's C++ tree and concurrent rendering cut the cost of big updates.
What does not magically improve: your own slow JavaScript, an unmemoized component that re-renders the whole tree, or a network layer that blocks the UI. The New Architecture removes the bridge tax; it does not fix application-level mistakes. If your jank is in your render logic, see React Native AI performance optimization for the patterns that actually move the needle there.
Migration gotchas to expect
Turning the New Architecture on is mostly a flag, but a few things bite teams in practice:
- Unmigrated native libraries. A dependency that only ships an old-architecture native module will either run through the interop layer or break. Audit your native dependencies before you flip the switch.
- Direct manipulation of native views. Code that reached around React to mutate views imperatively (some older animation libraries did this) needs to move onto Fabric-aware APIs.
- Custom native modules. If you wrote your own bridge module, it has to be reimplemented as a TurboModule with a Codegen spec.
With Expo, the managed workflow handles most of this for you because the Expo team migrates their modules ahead of each SDK. The risk lives almost entirely in third-party native packages and your own native code.
How to confirm the New Architecture is enabled
In an Expo project the relevant flag lives in app.json /app.config.js:
{
"expo": {
"newArchEnabled": true
}
}At runtime you can confirm Fabric is active by checking the global flag React Native exposes:
// true when the app is running on the New Architecture (Fabric)
const isFabric = !!(global as any)?.nativeFabricUIManager;
console.log("New Architecture:", isFabric);If that logs false after you set the flag, you are almost always running a cached old-architecture build, rebuild the native project (a fresh npx expo prebuild --clean and a new dev build) rather than reloading JS.
Where AI Mobile Launcher sits
AI Mobile Launcher ships on the current Expo line (~55) with the New Architecture enabled, so the gesture, animation, and startup wins above come configured rather than as a migration you run yourself. If you want the broader picture of why an opinionated, AI-ready Expo base saves weeks, read the Expo vs React Native CLI comparison and the best React Native boilerplate guide for 2026.