The New Architecture in React Native 0.76+ was supposed to be the holy grail - no more bridge, better performance, fewer crashes. After migrating three production apps to it, here's what actually happened.
The official architecture documentation promises a lot, and early benchmarks from Meta showed impressive improvements. But community reports tell a different story.
JSI: Finally, No More Bridge From Hell
The JavaScript Bridge was React Native's original sin. Every call between JS and native had to be serialized, queued, and batched. It was slower than dial-up internet and twice as frustrating.
JSI replaces this with synchronous calls. Sounds great, right? The JSI documentation and engineering blog posts made it sound revolutionary.
What actually works: Native calls don't block the UI anymore. Getting device info is instant instead of waiting forever. Animations stutter less, especially on Android. Camera libraries like VisionCamera can actually process real-time video without killing performance.
What broke: Half our custom native modules. JSI is picky about data types in ways the old bridge wasn't. The Codegen requirements are strict, and migration guides don't cover edge cases. Spent two weeks debugging why passing a nullable string crashed the app with "TypeError: Cannot read property of null" instead of just handling it gracefully like before.
The debugging nightmare: When JSI crashes, you get C++ stack traces. The debugging documentation doesn't help with native crashes, and Flipper integration becomes hit-or-miss. Good luck reading those at 3am when the app store review is due tomorrow.
Fabric: The Renderer That Sometimes Works
Fabric was supposed to make everything smooth as butter. React 18's concurrent features on mobile! Native performance! The Fabric renderer deep dive promises synchronous layout and useLayoutEffect support.
Reality check: It works great... until it doesn't. List performance is legitimately better - 60fps scrolling through thousands of items actually works now. The automatic batching and concurrent rendering features do help. But then you hit edge cases that GitHub issues barely document.
Real example: Had this one screen that worked fine on the old renderer. After Fabric, it would randomly freeze for a few seconds. No crash, no error, just frozen UI. Users would tap frantically and nothing would happen. Turns out we had a FlatList nested inside a ScrollView that Fabric didn't like. Spent forever figuring this out because the app would work fine 90% of the time.
Migration pain: Converting custom components to Fabric isn't just changing imports. The layout calculation system is completely different. Components that used to work fine now have weird spacing issues or don't render at all. The component migration guide helps, but community libraries are still catching up.
TurboModules: Lazy Loading That's Not So Lazy
TurboModules load native code on demand instead of at startup. Great idea in theory. The TurboModule specification and lazy loading benefits sound promising.
What improved: Apps do start faster. My test app went from taking forever to boot to being usable in under 2 seconds on older Android phones. Startup feels snappier overall.
What got complicated: Debugging. When a TurboModule fails to load, you get cryptic errors like "TurboModuleRegistry.get('RNSomeModule') returned null". Was the module not installed? Not linked? Wrong version? The troubleshooting guide doesn't cover half these scenarios, and community debugging tips are scattered across GitHub discussions.
Library hell: Half the libraries don't work with TurboModules yet. react-native-camera is dead. react-native-maps sometimes works. react-native-vector-icons crashes on random Android versions. You'll spend hours finding libraries that actually work with the new architecture.
The Migration Reality: Weeks, Not Days
"Just enable the new architecture" they said. "It'll be easy" they said.
Week 1: Enabling the flags and watching 40% of the app break in exciting new ways.
Week 2: Hunting down library incompatibilities. Some have new architecture versions, some don't, some claim to work but crash mysteriously.
Week 3: Debugging performance regressions. Turns out JavaScript-heavy screens actually got slower because JSI has overhead for complex data structures.
Week 4: Fixing platform-specific crashes that only happen on certain Android versions or iOS devices we didn't test on.
Pro tip: Don't believe anyone who says they migrated in a day. They either have a trivial app or they're lying.
What Actually Ships in Production
Discord: Still using React Native across iOS and Android since they unified on it in 2022. Their engineering blog details the custom tooling they built, but they have an army of 50+ mobile engineers and custom performance monitoring most of us don't have access to.
Microsoft Office: Uses React Native for parts of their mobile app, detailed in their technical case study. But notice how the performance-critical features like document editing are still native? The Office mobile architecture keeps RN for UI, native for heavy lifting.
Instagram: Meta's own app uses React Native for specific screens, not the whole app. Their React Native at Meta blog shows they're selective about where they use it. If Meta won't bet their flagship product entirely on React Native, what does that tell you?
Other production examples: Shopify's mobile app, Bloomberg's consumer app, and Walmart's grocery app all use React Native strategically, not universally. Check the React Native showcase for more examples and their specific use cases.
The New Architecture is better, but it's not magic. It fixes some problems and creates new ones. Whether it's worth the migration pain depends on how much you're willing to debug and how much time you have. The migration timeline estimates from the working group are optimistic at best.