diff --git a/README.md b/README.md
index 073aa7e..b5fa8cb 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
# @snap/react-camera-kit
-React Camera Kit for web applications.
+The official React wrapper for the [Camera Kit Web SDK](https://developers.snap.com/camera-kit/integrate-sdk/web/web-configuration). It provides declarative components and hooks that handle SDK bootstrapping, session lifecycle, media sources, and Lens management — so you can integrate Snap AR into React apps with minimal boilerplate.
-**[Live Demo](https://snapchat.github.io/react-camera-kit/)**
+**[Live Demo](https://snapchat.github.io/react-camera-kit/)** · **[Camera Kit Docs](https://developers.snap.com/camera-kit/integrate-sdk/web/guides/react-camera-kit)**
## Installation
@@ -10,107 +10,347 @@ React Camera Kit for web applications.
npm install @snap/react-camera-kit @snap/camera-kit
```
-## Prerequisites
+### Requirements
-Before using this package, complete Camera Kit Web setup and obtain:
+- `@snap/camera-kit` `^1.13.0` (peer dependency)
+- `react` `>=16.8.0` and `react-dom` `>=16.8.0`
+- `rxjs` `>=7`
+- `https://` for deployed apps (`http://localhost` works for local development)
-- `apiToken`
-- `lensId`
-- `lensGroupId`
-- `https://` for deployed apps (`http://localhost` should works for local dev)
+You'll need a Camera Kit API token, Lens ID, and Lens Group ID from the [Snap Developer Portal](https://kit.snapchat.com/manage). See [Setting Up Accounts](https://developers.snap.com/camera-kit/getting-started/setting-up-accounts) if you're new to Camera Kit.
-Full setup guides:
+## Quick start
-- Camera Kit Web configuration: https://developers.snap.com/camera-kit/integrate-sdk/web/web-configuration
-- `@snap/camera-kit` docs: https://www.npmjs.com/package/@snap/camera-kit
+```tsx
+import { CameraKitProvider, LensPlayer } from "@snap/react-camera-kit";
-## Compatibility
+function App() {
+ return (
+
+
+
+ );
+}
+```
-- Requires `@snap/camera-kit` `^1.13.0`, because `1.13.0+` includes the SDK-side font bootstrap behavior needed by this package.
+That's it — `CameraKitProvider` initializes the SDK, and `LensPlayer` sets up the camera, applies the Lens, and renders the output canvas.
-## Usage
+## Components
-This package provides a simple API for integrating Camera Kit into React applications.
+### CameraKitProvider
-The simplest use case is:
+The root provider that initializes the Camera Kit SDK. All other components and hooks must be descendants of this provider.
```tsx
-
-
-
+import { CameraKitProvider, createConsoleLogger } from "@snap/react-camera-kit";
+
+
+ {children}
+;
```
-if you need to render specific canvas with custom layout:
+| Prop | Type | Default | Description |
+| ----------------------------- | ---------------------------------------- | ------------ | ------------------------------------------------------------- |
+| `apiToken` | `string` | **required** | Camera Kit API token |
+| `logger` | `CameraKitLogger` | `noopLogger` | Logger instance — use `createConsoleLogger()` for development |
+| `logLevel` | `"debug" \| "info" \| "warn" \| "error"` | `"info"` | Log verbosity |
+| `renderWhileTabHidden` | `boolean` | `false` | Continue rendering when the browser tab is hidden |
+| `stabilityKey` | `string \| number` | auto | Manual control over when the SDK re-initializes |
+| `extendContainer` | `(container) => container` | — | Customize the SDK's DI container |
+| `createBootstrapEventHandler` | `MetricEventHandlerFactory` | — | Factory for tracking bootstrap success/failure |
+
+### LensPlayer
+
+All-in-one component that handles source setup, Lens application, and playback. Defaults to the user's camera if no `source` is provided.
```tsx
-
-
-
-
-
-
-
-
-
-
+
```
-if you need to access lens status (assuming `CameraKitProvider` context):
+| Prop | Type | Default | Description |
+| ---------------- | ----------------------- | -------------------- | ------------------------------------------------------------------------------------------------ |
+| `lensId` | `string` | — | Lens to apply |
+| `lensGroupId` | `string` | — | Lens Group containing the Lens |
+| `source` | `SourceInput` | `{ kind: "camera" }` | Media source (camera, video, or image) |
+| `outputSize` | `OutputSize` | — | Rendering canvas size |
+| `lensLaunchData` | `LensLaunchData` | — | Launch parameters passed to the Lens |
+| `lensReadyGuard` | `() => Promise` | — | Async guard called while Lens is loading (2s timeout) |
+| `refreshTrigger` | `unknown` | — | When this value changes, the Lens is removed and reapplied |
+| `canvasType` | `"live" \| "capture"` | `"live"` | Which canvas to render. For custom layouts, use `LiveCanvas`/`CaptureCanvas` as children instead |
+| `fpsLimit` | `number` | — | Maximum rendering framerate |
+| `muted` | `boolean` | `false` | Mute audio output |
+| `screenRegions` | `ScreenRegions` | — | Screen regions for Lens-aware UI layout |
+| `onError` | `(error, lens) => void` | — | Callback for playback errors |
+| `className` | `string` | — | CSS class name |
+| `style` | `CSSProperties` | — | Inline styles |
+| `children` | `ReactNode` | — | Custom children (use with `LiveCanvas`/`CaptureCanvas`) |
+
+### LiveCanvas / CaptureCanvas
+
+Render the live preview or capture canvas as children of `LensPlayer`:
```tsx
-function Preview() {
- const { lens } = useCameraKit();
+
+
+
+
+
+
+
+
+```
+
+Both accept `className` and `style` props.
+
+## Hooks
+
+### useCameraKit
+
+Access the full Camera Kit context — SDK status, source/Lens state, and imperative methods. Must be called within a `CameraKitProvider`.
+
+```tsx
+import { useCameraKit } from "@snap/react-camera-kit";
+
+function Controls() {
+ const { sdkStatus, lens, lenses, isMuted, toggleMuted, applyLens, removeLens, fetchLenses } = useCameraKit();
+
+ if (sdkStatus !== "ready") return
+ );
+ }
-# Build the package (ESM + CJS)
-npm run build
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
+export default function App() {
+ return (
+
+
+
+ );
+}
+```
-# Build in watch mode (for development)
-npm run watch
+## Utilities
-# Type checking
-npm run typecheck
+| Export | Description |
+| ------------------------ | --------------------------------------------------- |
+| `createConsoleLogger()` | Returns a logger that prints to the browser console |
+| `createNoopLogger()` | Returns a silent logger (default) |
+| `isCameraSource(source)` | Type guard for `CameraSourceInput` |
+| `isVideoSource(source)` | Type guard for `VideoSourceInput` |
+| `isImageSource(source)` | Type guard for `ImageSourceInput` |
+| `CameraRotationOptions` | Valid rotation values: `[0, -90, 90, 180]` |
-# Run tests
-npm test
+## Development
-# Clean dist folder
-npm run clean
+```bash
+npm install # Install dependencies
+npm run build # Build ESM + CJS
+npm run watch # Build in watch mode
+npm run typecheck # Type checking
+npm test # Run tests
+npm run clean # Clean dist folder
```
-## Demo App
+### Demo app
-A Vite demo app is available at `demo`.
+A Vite demo app is available in `demo/`:
```bash
npm run demo:install
@@ -120,7 +360,7 @@ npm run demo:dev
## Contributing
-We welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details on how to get started.
+We welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details.
- [Code of Conduct](CODE_OF_CONDUCT.md)
- [Security Policy](SECURITY.md)