React native vision camera
Skill margelo/react-native-skills/skills/react-native-vision-camera
The best react-native Agent Skills. Forget 10x, this is 100x.
npx -y skills add margelo/react-native-skills --skill react-native-vision-cameraAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
What its author says it does
Copied from the file, not written here
Best-practices guide for react-native-vision-camera v5 (Nitro rewrite, April 2026) and migrating from v4. Use when installing, configuring, or writing code with the Camera, outputs, frame processors, recording, or barcode/depth/RAW features. Also use when converting v4 code (photo={true}, takePhoto, useCameraFormat, useFrameProcessor) to the new v5 API.
SKILL.md
8.2 KB, as published. Nobody here has run it
react-native-vision-camera (v5)
VisionCamera v5 is the maintained and latest version of react-native-vision-camera. It is a full Nitro Modules rewrite with a new Constraints API, Output-based architecture, in-memory Photo, and a hard break from the v4 format/prop model. Almost every v4 surface is gone or renamed — treat v5 as a new API, not an incremental upgrade.
This skill is a router. Read this file first, then load the reference that matches the task. Every reference is self-contained — do not load more than you need.
When to load which reference
- New install, getting a Camera on screen, permissions, minimum boilerplate → references/quickstart-v5.md
- Porting a v4 codebase, understanding what changed → references/migration-v4-to-v5.md (load this FIRST when the user mentions v4, takePhoto, useCameraFormat, format prop, photo/video boolean props, or CodeScanner in core)
- Porting a whole v4 screen — want a complete before/after file to transplant → references/migration-templates.md (full copy-paste templates: photo screen, video screen, frame-processor+ML, barcode scanner, pro camera)
- Choosing/attaching outputs, fps/HDR/resolution via constraints, session lifecycle → references/outputs-and-constraints.md
- Frame Processors, worklets, async frame work, pixel formats, writing a native plugin → references/frame-processors.md (load this when user says "frame processor", "worklet", "ML on frames", "Nitro plugin", "vision-camera-plugin-*")
- Capturing photos (incl. callbacks, RAW, HDR, preview image), recording video, Recorder lifecycle, manual AE/AF/AWB, exposure bias, zoom, focus → references/capture-and-controls.md
- Depth streaming, multi-cam, Skia preview, GPU resizer for ML, barcode scanner package, GPS location metadata, custom native outputs → references/advanced-features.md
When in doubt, load references/migration-v4-to-v5.md — it covers the shape of the new API by contrasting it with v4 and is the fastest orientation.
Non-negotiable rules for v5 code
These are the rules that catch people who "know" v4. Apply them without asking:
- Install the Nitro peers.
react-native-nitro-modulesandreact-native-nitro-imageare required peer deps. Frame processors additionally requirereact-native-vision-camera-workletsANDreact-native-worklets(Software Mansion's — not-core). Worklets - https://docs.swmansion.com/react-native-worklets/docs/ outputs={[...]}replacesphoto/video/frameProcessor/codeScannerprops. Create outputs withusePhotoOutput,useVideoOutput,useFrameOutput,useDepthOutput,useObjectOutput(oruseBarcodeScannerOutputfrom the barcode package) and pass them in an array. Capture methods (capturePhoto,createRecorder) live on the Output, not the Camera ref.- There is no
formatprop and nouseCameraFormat. Useconstraints={[...]}— array order = priority, descending. The Camera negotiates the closest supported config automatically, so an impossible constraint like{ fps: 99999 }never throws. takePhoto()does not exist. UsephotoOutput.capturePhoto(settings, callbacks)for in-memoryPhoto, orphotoOutput.capturePhotoToFile(...)for a file path. The default path is in-memory — do not write temp files unless explicitly asked.- Frame Processor plugins must be Nitro Modules. The v4
FrameProcessorPluginbase class,VISION_EXPORT_SWIFT_FRAME_PROCESSORmacro, andVisionCameraProxy.addFrameProcessorPluginare gone. A v5 plugin is aHybridObjectwith a typed Nitro spec. See references/frame-processors.md. - Every
Frame(andDepth) MUST be.dispose()d. The buffer pool is bounded; leaking a frame stalls the pipeline. Wrap work intry { ... } finally { frame.dispose() }. When offloading viaasyncRunner.runAsync(...), dispose inside the async callback if it returnedtrue, and dispose immediately in theelsebranch when it returnedfalse. - CodeScanner is not in core.
react-native-vision-camera-barcode-scanneris a separate package, MLKit-based on both platforms. For iOS-only object detection (QR, faces, bodies via native AVFoundation metadata, no ML dep), useuseObjectOutputfrom core. - Keep the Camera mounted; toggle
isActive. Remounting tears down the session. Integrate withuseIsFocused()from react-navigation so the session goes Idle → Ready while not on screen, and keeps preferences warm for fast resume. - Frame output
pixelFormatdefaults to'native'(zero-copy), NOT'yuv'.'native'streams in the session's negotiatednativePixelFormatwith zero conversions (it may resolve to a YUV, RGB, RAW, or'private'format — verify the actual one viaframe.pixelFormat).'yuv'picks the YUV format closest to native and is the best general-purpose CPU-accessible choice (MLKit/OpenCV/Skia);'rgb'forces a YUV→RGB conversion (~2.6× more bandwidth) — use only when a consumer hard-requires RGB.useDepthOutputhas nopixelFormatoption. For ML, preferreact-native-vision-camera-resizer(GPU) over paying a per-frame RGB conversion in the camera pipeline.
- Do not hand-clamp FPS/resolution with
Math.min/Math.max. That was a v4 workaround. In v5 the Constraints API negotiates internally — express intent and let the Camera pick. - Worklets mutate Reanimated SharedValues directly in v5. The worklets-core bridge is gone; no
runOnJSround-trip required to update a ReanimatedSharedValuefrom a frame processor.
Operating rules for this skill
- Never invent v4→v5 API shapes. If a v4 API has no documented v5 equivalent in the references, say so and link to the v5 docs — do not guess.
- Do not add documentation files (README, CHANGELOG) unless the user asks.
- Assume the user is on v5 unless they show v4 code. If they show v4 code, load references/migration-v4-to-v5.md before writing anything.
- When writing a new Camera example, default to the hook-based declarative form (
useCameraPermission+useCameraDevice+usePhotoOutput+<Camera />). Use the imperativeVisionCamera.createCameraSession(...)API only when the user asks for multi-cam or full programmatic control. - When the user asks for an ML / CV pipeline, recommend
react-native-vision-camera-resizer(GPU-accelerated, returns a pooledGPUFrame) overvision-camera-resize-plugin(v4-era, CPU).
- Verify peer dependency installs. A user reporting a native crash after install 95% of the time has missed
react-native-nitro-modules,react-native-nitro-image, or (for frame processors)react-native-worklets+react-native-vision-camera-worklets.
Authoritative links
- Docs: https://visioncamera.margelo.com
llms.txtindex: https://visioncamera.margelo.com/llms.txt- V5 release notes (includes migration snippets):
gh api repos/mrousavy/react-native-vision-camera/releases/tags/v5.0.0 - Blog announcement: https://blog.margelo.com/whats-new-in-visioncamera-v5
- Main repo: https://github.com/mrousavy/react-native-vision-camera
- V4 snapshot (archived docs): https://visioncamera4.margelo.com