Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

Installation

Prerequisites

Rust Toolchain

The ZCAM SDK packages include Rust bindings built via UniFFI. You need Rust installed with the targets for your target platform(s):

# Install Rust (if not already installed)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
 
# Add iOS targets
rustup target add aarch64-apple-ios aarch64-apple-ios-sim
 
# Add Android targets
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android

Xcode

Xcode is required for iOS development. Install it from the Mac App Store.

Android Studio

Android Studio is required for Android development. Install it from developer.android.com.

Development Environment

  • Node.js 18+
  • React Native 0.81+
  • Expo SDK 54+ (if using Expo)

Installing Packages

The ZCAM SDK is available as a single package:

npm i @succinctlabs/react-native-zcam1
 
# iOS: install native dependencies
cd ios && pod install
 
# Android: native JNI libraries are downloaded automatically during the Gradle build

The package provides the following functionality:

Import pathPurpose
@succinctlabs/react-native-zcam1Camera capture, verification, image picker, and C2PA utilities
@succinctlabs/react-native-zcam1/provingZK proof generation

iOS Configuration

Bundle Identifier

Configure your app's bundle identifier in your project. For Expo apps, set it in app.json:

{
  "expo": {
    "ios": {
      "bundleIdentifier": "com.yourcompany.yourapp"
    }
  }
}

App ID for App Attest

You'll need your Apple Team ID combined with your bundle identifier. The format is:

<TEAM_ID>.<BUNDLE_IDENTIFIER>

For example: NLS5R4YCGX.com.yourcompany.yourapp

To find your Team ID:

  1. Open Keychain Access on your Mac
  2. Find a certificate named "Apple Development"
  3. The Team ID is the "Organizational Unit" field

Required Permissions

Add these keys to your Info.plist (or app.json for Expo):

{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSCameraUsageDescription": "This app uses your camera to capture photos.",
        "NSPhotoLibraryUsageDescription": "This app needs access to save photos."
      }
    }
  }
}

Android Configuration

Package Name

Configure your app's package name in app.json for Expo apps:

{
  "expo": {
    "android": {
      "package": "com.yourcompany.yourapp"
    }
  }
}

Required Permissions

Add camera and storage permissions to your app.json:

{
  "expo": {
    "android": {
      "permissions": [
        "android.permission.CAMERA",
        "android.permission.READ_MEDIA_IMAGES",
        "android.permission.RECORD_AUDIO"
      ]
    }
  }
}

Enabling Proving (optional)

ZK proof generation on Android is opt-in due to the large binary size. To enable it, add the following to your android/gradle.properties:

enableProving=true

Running on Device

iOS

App Attest requires a physical iOS device—it does not work in the simulator (the SDK falls back to mock mode for development).

# Expo
npx expo prebuild
npx expo run:ios --device
 
# React Native CLI
npx react-native run-ios --device

On first run, you may need to trust the developer certificate on your device: Settings → General → Device Management → Trust

Android

# Expo
npx expo prebuild
npx expo run:android --device
 
# React Native CLI
npx react-native run-android

The SDK detects Android emulators and generates a test gradient image in place of a real camera capture, allowing UI development without a physical device.