Creating Frame Processor Plugins
Expose your Frame Processor Plugin to JS​
To make the Frame Processor Plugin available to the Frame Processor Worklet Runtime, create the following wrapper function in JS/TS:
import type { Frame } from 'react-native-vision-camera'
/**
 * Scans QR codes.
 */
export function scanQRCodes(frame: Frame): string[] {
  'worklet'
  return __scanQRCodes(frame)
}
Users will then have to add the Frame Processor Plugin's name to their  babel.config.js.
For the QR Code Scanner, this will be __scanQRCodes:
module.exports = {
  plugins: [
    [
      'react-native-reanimated/plugin',
      {
        globals: ['__scanQRCodes'],
      },
    ],
note
You have to restart metro-bundler for changes in the babel.config.js file to take effect.
Test it!​
Simply call the wrapper Worklet in your Frame Processor:
function App() {
  const frameProcessor = useFrameProcessor((frame) => {
    'worklet'
    const qrCodes = scanQRCodes(frame)
    console.log(`QR Codes in Frame: ${qrCodes}`)
  }, [])
  return (
    <Camera frameProcessor={frameProcessor} {...cameraProps} />
  )
}
Next Steps​
If you want to distribute your Frame Processor Plugin, simply use npm.
- Create a blank Native Module using bob or create-react-native-module
- Name it vision-camera-plugin-xxxxxwherexxxxxis the name of your plugin
- Remove the generated template code from the Example Native Module
- Add VisionCamera to peerDependencies:"react-native-vision-camera": ">= 2"
- Implement the Frame Processor Plugin in the iOS, Android and JS/TS Codebase using the guides above
- Add installation instructions to the README.mdto let users know they have to add your frame processor in thebabel.config.jsconfiguration.
- Publish the plugin to npm. Users will only have to install the plugin using npm i vision-camera-plugin-xxxxxand add it to theirbabel.config.jsfile.
- Add the plugin to the official VisionCamera plugin list for more visibility