React Native New Architecture
React Native Nitro Modules Guide
July 22, 2026
A practical guide to React Native Nitro Modules in 2026 architecture, performance vs TurboModules, and when to use them. By Numan, full-stack React Native engineer.
Quick answer: Nitro Modules are a statically bound, type-safe JSI layer for native functionality. They are most interesting when an app crosses the JavaScript/native boundary often or moves binary and structured data at high volume.
- The Nitro repository describes statically compiled JSI bindings, typed JavaScript bindings, and implementations in C++, Swift, or Kotlin.
- react-native-mmkv 4.2.0 requires react-native-nitro-modules 0.35.0 or newer, showing a production library tracking Nitro releases.
- VisionCamera releases document Nitro-based integrations for direct camera output and high-throughput native work.
What Are React Native Nitro Modules?
Nitro Modules are created by Marc Rousavy and the Margelo team as a high-performance native module framework for React Native. The public API starts as a TypeScript interface that extends HybridObject. Nitrogen can then generate the native declarations, converters, and binding code needed to implement that interface in C++, Swift, or Kotlin.
Nitro Modules vs TurboModules: Architecture Differences
TurboModules are React Native's official New Architecture native-module system. They use JSI and React Native Codegen, support synchronous and asynchronous methods, and are the right default for most native integrations. Nitro takes a different route: a HybridObject is backed by native state and reaches JavaScript through Nitro's statically compiled binding layer and Nitro Tunnel.
That distinction matters when the native API is called repeatedly, when a result is large, or when an API benefits from synchronous reads. Nitro does not make all code synchronous; disk, network, camera, and other long-running work should still expose asynchronous methods or streaming primitives.
| Aspect | Bridge (Legacy) | TurboModules | Nitro Modules |
|---|---|---|---|
| Call type | Async, serialized | Sync/async, JSI-based | Sync, direct JSI bindings |
| Type safety | None | Partial (codegen) | Full (codegen, strongly typed) |
| Performance | Lowest | High | Highest for suitable hot paths |
| Maturity (2026) | Deprecated | Stable, default | Emerging, growing adoption |
Performance Comparison: Nitro vs TurboModules vs Bridge
The old bridge serializes arguments, schedules messages, crosses an asynchronous queue, and reconstructs values. TurboModules remove much of that cost with JSI, lazy loading, and Codegen. Nitro targets the remaining overhead with generated converters, native-backed HybridObjects, and direct bindings designed for low-cost calls.
There is no honest universal multiplier. The result depends on payload size, conversions, call frequency, thread scheduling, native implementation, and whether the work itself dominates the boundary. Measure cold start, calls per second, p50/p95 latency, allocations, frame time, and memory on release builds and representative devices.
For a normal settings read, analytics event, or occasional permission check, TurboModules are usually already fast enough. Nitro becomes compelling for storage primitives, camera frames, image processing, ML tensors, audio buffers, and other paths where copying or repeatedly translating data is visible in a profile.
How to Create a Basic Nitro Module
- Define the contract. Create a
.nitro.tsinterface extendingHybridObject. Keep methods small, explicit, and platform-aware. - Generate bindings. Configure Nitrogen for the package and generate the C++ base, platform adapters, type converters, and registration code.
- Implement native behavior. Write the generated methods in C++, or use the supported Swift/Kotlin platform layers where that is the best fit. Keep ownership, threading, and lifetime rules explicit.
- Package and validate. Install
react-native-nitro-modules, run iOS pods and Android/Gradle setup, rebuild the app, and test release builds on both platforms. Expo Go cannot load arbitrary native code; use a development build or prebuild workflow.
Start with one narrow capability rather than turning an entire domain service into a native object. Add unit tests around the native implementation, TypeScript contract tests, and a small benchmark that compares the old and new call paths with realistic data.
Is the Nitro Modules Ecosystem Production-Ready in 2026?
Nitro is mature enough for carefully selected production dependencies, but it is not yet as universal as TurboModules. The core repository is MIT-licensed, actively released, and documents C++, Swift, Kotlin, HybridObjects, and Nitrogen. Adoption is visible in the Margelo ecosystem: MMKV v4 is Nitro-based, and VisionCamera's current releases expose Nitro-oriented high-throughput integrations.
Community support is growing through the Nitro documentation, GitHub issues, Discord, examples, and libraries such as Nitro Image and Nitro Fetch. The tradeoff is a smaller pool of engineers who understand the generated C++ boundary, platform build systems, ABI compatibility, and the interaction with React Native versions.
Use Nitro when you have a measured native-boundary problem and can pin compatible versions. If the feature is ordinary app logic, a JavaScript library, an Expo module, or a straightforward TurboModule, the simpler option is often the more production-ready choice.
Migrating from TurboModules to Nitro
Treat migration as an API and build-system redesign, not a search-and-replace. First freeze the public JavaScript contract, record current behavior, and profile the calls that justify the move. Then model that contract as a HybridObject, deciding which methods should remain asynchronous and which small reads can safely be synchronous.
- Keep the old TurboModule behind the same JavaScript facade while the Nitro implementation is tested.
- Move one capability at a time and compare outputs, errors, threading, memory, and lifecycle behavior.
- Pin React Native, Nitro, Nitrogen, Xcode, Kotlin, NDK, and C++ compatibility in CI.
- Test cold start, reload, background/foreground, app process death, permissions, and release builds on real devices.
- Keep a fallback or rollback path until crash and performance telemetry confirms the migration.
For background on the official native-module path, read React Native TurboModules. If you need an architecture review, my React Native consulting services cover native integration, performance profiling, and upgrade risk. Teams can also hire a React Native developer for focused migration work or work with a React Native app development company.
Frequently Asked Questions
What are React Native Nitro Modules?
Nitro Modules are a performance-focused native module system built around statically generated JSI bindings and typed HybridObjects. A TypeScript interface describes the API, Nitrogen generates the binding layer, and the implementation can live in C++, Swift, or Kotlin. Calls can be synchronous and avoid the legacy bridge's serialized message path.
How do Nitro Modules differ from TurboModules?
Both use React Native's New Architecture and JSI rather than the legacy bridge, but they have different binding designs. TurboModules use React Native Codegen and the official module provider model. Nitro uses HybridObjects, a Nitro Tunnel, and the optional Nitrogen generator to create a statically compiled, strongly typed native binding layer.
Are Nitro Modules faster than TurboModules?
They can be faster for frequent synchronous calls, large binary values, or data-heavy native work because Nitro is designed to minimize conversion and dispatch overhead. That is not a universal application-speed guarantee. A TurboModule that makes a few asynchronous calls with small payloads may be indistinguishable in a real product, so benchmark the actual hot path.
How do you create a Nitro Module?
Start with a TypeScript Nitro interface extending HybridObject, choose platform implementations, and run Nitrogen to generate the native spec and converters. Implement the generated contract in C++, Swift, or Kotlin, install react-native-nitro-modules, configure the native build, autolink it, and validate sync, async, lifecycle, and error behavior on real iOS and Android release builds.
Is the Nitro Modules ecosystem production-ready in 2026?
It is production-capable but still emerging. The Nitro repository has frequent releases, and libraries such as react-native-mmkv and VisionCamera have adopted Nitro-based implementations or integrations. The core is MIT-licensed and usable today, but the community is smaller than TurboModules, version compatibility matters, Expo Go is not a substitute for a development build, and troubleshooting often requires native expertise.
Should I migrate my existing TurboModule to Nitro?
Migrate when profiling shows native-boundary overhead is material, the API is stable enough to model as a HybridObject, and your team can own C++, Swift, Kotlin, and build maintenance. Keep TurboModules when calls are infrequent, the module is already fast, official Codegen is sufficient, or broad ecosystem compatibility matters more than the last part of native-call latency.