VisionCamera V5, the React Native camera library, ships as a major rewrite built on Nitro Modules instead of hand-written JSI/C++, cutting ~3,000 lines of code and eliminating race-condition crashes like SIGSEGV. A new Constraints API replaces the old fake Formats system, letting the camera negotiate supported feature combinations instead of guessing. Other additions include in-memory Photo objects (no more temp-file writes), depth data streaming, RAW capture (DNG/ProRAW), Multi-Cam sessions, an imperative API, a GPU-accelerated frame resizer (~5x faster), a unified MLKit barcode scanner for both platforms, coordinate-system conversions, manual AE/AF/AWB controls, and a modularized package structure (barcode-scanner, location, resizer, skia, worklets split into separate packages). Native Frame Processor Plugins are now fully typed Nitro Modules, and the default worklets engine switches to react-native-worklets.
Table of contents
Why V5 mattersFull rewrite to NitroThe new Constraints APIOutputs as separate objectsIn-memory PhotoNew DocsManual AE/AF/AWBFull Video Dynamic Ranges API (SDR, HDR, Log)More focus() controlCoordinate System ConversionsA new integrated QR/Barcode ScannerDepth Data StreamingRAW CaptureImperative APIMulti-Cam Camera SessionsThe new GPU-accelerated ResizerModularized packagesreact-native-workletsNative Frame Processor Plugins are now Nitro ModulesExtensible design with custom native CameraOutputsTry VisionCamera V5Questions this post answers
What changed in VisionCamera V5 compared to V4 for React Native camera apps?
VisionCamera V5 is fully rewritten on Nitro Modules instead of hand-written JSI/C++, removing the old Formats API in favor of a new Constraints API that negotiates supported camera configurations. It adds in-memory Photo objects, depth streaming, RAW capture (DNG/ProRAW), Multi-Cam sessions, an imperative API, and splits the barcode scanner, resizer, location, and skia features into separate packages. daily.dev helps React Native developers track breaking changes like the VisionCamera V4-to-V5 migration.
Why was the Formats API removed in VisionCamera V5 and replaced with Constraints?
The Formats API was removed because it exposed a fake, stitched-together list of camera formats on Android that often didn't reflect what the hardware could actually support simultaneously, sometimes causing the camera session to fail or crash. The new Constraints API lets developers express intent (like fps or HDR) and internally negotiates a valid configuration, using AVCaptureDevice.Format filtering on iOS and CameraInfo.isSessionConfigSupported on Android. Developers weighing camera library upgrades can follow API redesigns like this one on daily.dev.
How much faster is Nitro Modules compared to Turbo Modules and Expo Modules for React Native?
Nitro-based native calls are roughly 15x faster than Turbo Modules and about 60x faster than Expo Modules, according to benchmarks from the VisionCamera V5 rewrite. This speedup comes from lazy, per-property native calls instead of serializing entire objects like CameraDevice or CameraFormat upfront, improving startup performance and reducing camera latency. daily.dev keeps performance-focused React Native developers current on native module benchmarks like this.