react-native-vision-camera: A Camera Library Built Around Frame Processors
📸 A powerful, high-performance React Native Camera library.
At a glance
- What is it?
- VisionCamera is a React Native camera library from Margelo, now at v5.2.3, that separates the camera module from the frame-processing modules. This is what the repository documents, where it stops, and who should install it.
- Who is it for?
- Adopt it if you need a camera view in React Native plus per-frame work in JS worklets, or barcode scanning through the separate barcode-scanner package. Do not adopt it if your app only needs a single still photo, since you take on the barcode-scanner, location, resizer, skia and worklets packages as separate dependencies.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 17 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 1, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The problem VisionCamera solves for React Native apps
React Native has no camera component in its core. An app that needs one has to bridge to the platform camera APIs itself, or pick a library that already did. VisionCamera's README describes photo and video capture, a QR and barcode scanner, custom devices and multi-cameras, resolutions from 4k to 8k images, frame rates from 30 to 240 FPS, frame processors, drawing onto the camera view, zooming, HDR and night modes, and a C++/GPU accelerated resizer.
The audience is specific. If your app shows the camera in a view and you want to run per-frame work such as facial recognition or object detection, the frame processors are the reason to be here. The README frames them as "JS worklets to run facial recognition, AI object detection, realtime video chats". That is a different job from taking one photo, and the dependency list reflects it.
The repository is a monorepo. Its package.json declares workspaces for the camera package plus react-native-vision-camera-barcode-scanner, react-native-vision-camera-location, react-native-vision-camera-resizer, react-native-vision-camera-skia and react-native-vision-camera-worklets. So scanning and location are not in the camera package. That split is the single most important thing to understand before you start, because it decides which package you install and which docs page you read.
How the camera, worklets and frame processors fit together
The camera itself is a component. The README's example is short:
function App() {
return (
<Camera
style={StyleSheet.absoluteFill}
device="back"
isActive={true}
/>
)
}Three props carry the behaviour. style places the view, device selects which camera, and isActive turns the session on or off. The README also lists a fast pause and resume, which is what isActive is for: you do not unmount the camera to stop it, you flip the flag.
Frame processing is the second layer, and it is deliberately not part of that component tree. The camera package is one workspace; the worklets package is another. The topics list for the repository includes jsi and worklet, which points at the mechanism: frames are handed to JavaScript through JSI rather than through the old asynchronous bridge, and the code that runs on them is written as worklets so it can execute on a separate runtime.
That architecture has a cost. A frame processor runs on every frame, so anything slow inside it shows up as dropped frames rather than as a slow function call. The README does not publish a per-frame budget, and I would not guess one. The repository does ship a resizer package and a C++/GPU accelerated resizer is listed as a feature, which suggests the intended pattern is resizing frames before doing heavier work on them.
Installing react-native-vision-camera and rendering a first camera
The README gives two commands and then points at the docs for permissions. Install the package from npm, then install the iOS pods:
npm i react-native-vision-camera
cd ios && pod installAfter that, the README says to get started by "setting up permissions" at visioncamera.margelo.com. It does not inline the permission steps, and it does not give an Android equivalent of the pod install line. Treat the docs site as part of the install, not as optional reading. A camera that renders a blank view on a device is usually a permission entry that was never added.
Once permissions are in place, the component from the README is the smallest thing that can work. Drop it into a screen, set device to "back" and isActive to true, and you should see the rear camera filling its parent. The README points at ./apps/simple-camera/ for a fuller example, and the monorepo lists apps/simple-camera as a workspace, so that directory is the reference app rather than a fragment.
If you develop the library itself rather than use it, the root package.json has a bootstrap script that runs bun i, a build, and then bundle-install and pods for the example app. That path is for contributors; the npm route above is for consumers.
Where VisionCamera is the wrong tool
The clearest boundary is version support. The README states that as VisionCamera V5 is released, VisionCamera V4 is no longer actively maintained, that the V4 code was archived under margelo/react-native-vision-camera-v4-snapshot, and that the old documentation page is deployed at visioncamera4.margelo.com. If you are pinned to V4, you are on an archived snapshot with a frozen docs site. Upgrading is the supported path, and the README does not document a rollback or a migration guide.
The second boundary is scope. Photo and video capture, barcode scanning, location and frame processing live in separate workspace packages. If you want one dependency that does a bit of everything, this is not that. You will install the camera package and then decide which of the others you actually need.
The third is the frame processor model itself. It is the feature that justifies the library, and it is also the part with the least tolerance for mistakes: work that runs per frame has to stay cheap. If your feature is a one-off scan triggered by a button, a frame processor is more machinery than the job needs. The README does not claim frame processors are free, and the presence of a dedicated resizer package suggests the authors expect you to manage frame size yourself.
react-native-vision-camera compared with expo-camera and react-native-camera
The related searches around this project include react-native-vision-camera vs expo-camera, react-native-vision-camera alternative and react-native-camera, so the comparison is worth stating plainly.
expo-camera is the camera module that ships inside the Expo SDK. Its advantage is that it arrives with the managed workflow: no pod install step of your own, and no native project to keep in sync. The difference in approach is that expo-camera is a camera component, while VisionCamera is a camera component plus a worklet runtime for per-frame code. If your app never processes frames, that extra layer is weight you are not using.
react-native-camera is the older community camera library, and it appears in the same search results. The architectural difference is the frame pipeline: VisionCamera routes frames through JSI and worklets, which is what makes realtime per-frame work in JavaScript plausible. react-native-camera predates that design. The README does not compare itself with either library, so the honest summary is that VisionCamera's differentiator is the frame processor path, not the camera view alone.
There is also react-native-camera-kit in the search data. The repository says nothing about it, so I will not invent a comparison. Check its own docs if you are weighing it.
Maintenance, package layout and what the MIT licence means here
The repository is not archived, and the last push was on 2026-09-14. Recent releases are v5.2.3 on 2026-08-20, v5.2.2 on 2026-08-05 and v5.2.1 on 2026-07-31. The release cadence in that window is roughly one patch every two to three weeks, and the pushes continue after the latest release. V4, by contrast, is archived and unmaintained, so the upgrade cost from V4 to V5 is not optional if you want fixes.
The monorepo layout sets the upgrade cost. Six packages are declared as workspaces, and the root scripts build and lint them separately (bun camera build, bun scanner build, bun resizer build, bun worklets build, bun skia build, bun location build). For a consumer this means version drift between the camera package and, say, the barcode-scanner package is possible, and you should check that the versions you install were released together. The package manager is declared as [email protected] at the root, but that governs the monorepo, not your app; the README's install command is plain npm.
The licence is MIT. That is permissive: you can use the library in a closed-source app, and you keep the copyright notice. It says nothing about the platform camera APIs you call through it, and it says nothing about what your app does with the frames it captures. Those are separate questions, and I am not giving legal advice on either.
Editorial conclusion
Adopt it if you need a camera view in React Native plus per-frame work in JS worklets, or barcode scanning through the separate barcode-scanner package. Do not adopt it if your app only needs a single still photo, since you take on the barcode-scanner, location, resizer, skia and worklets packages as separate dependencies. Before writing code, read the permissions guide at visioncamera.margelo.com and confirm which package each feature lives in.
Frequently asked questions
How do I install react-native-vision-camera?
The README gives two commands: npm i react-native-vision-camera, then cd ios && pod install. After that it directs you to the documentation site to set up permissions before the camera will work.
How do I use react-native-vision-camera in a component?
The README's example renders a Camera component with style={StyleSheet.absoluteFill}, device="back" and isActive={true}. The README points at ./apps/simple-camera/ for a fuller example.
What is react-native-vision-camera?
It is a camera library for React Native from Margelo, described in its README as supporting photo and video capture, a QR and barcode scanner, custom devices and multi-cameras, configurable resolutions and frame rates, and frame processors written as JS worklets.
Is there an alternative to react-native-vision-camera?
The repository does not name alternatives. The related searches point at expo-camera and react-native-camera; expo-camera ships with the Expo SDK and is a camera component rather than a camera plus a worklet runtime, which is the main architectural difference.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/margelo-react-native-vision-camera)