Camera SDK
The Meeeetup camera SDK turns a video stream into one good photograph per face. It detects faces, tracks each one across frames, scores how well the subject is facing the lens, and hands you the best frame it saw.
It is capture-only. The SDK never opens a socket: you receive face crops through a callback and decide where they go — the Meeeetup /capture API, your own backend, disk, anywhere.
Packages
| Package | Install | What it is |
|---|---|---|
@meeeetup/camera-core |
pnpm add @meeeetup/camera-core |
The pipeline: tracking, pose scoring, selection. No DOM, no native code. |
@meeeetup/camera-web |
pnpm add @meeeetup/camera-web |
MediaPipe BlazeFace + React provider, hooks and components. |
@meeeetup/camera-react-native |
pnpm add @meeeetup/camera-react-native |
Vision Camera frame processor backed by native ML Kit. |
The platform packages depend on core, so installing @meeeetup/camera-web pulls the pipeline with it. Install core on its own only when you are wiring a detector the SDK does not ship.
Both platform packages are published publicly on npmjs.org — no token, no registry configuration.
How a face becomes a photo
video frame
└─ detector (MediaPipe on web, ML Kit on native) → Detection[]
└─ admission: drop anything under minDetectionScore or minFaceHeight
└─ track: match each face to a track by centroid distance
└─ score pose: getFrontalness() → 0–100
└─ select the best frame for that track
└─ onSelect(face) / onBatchCapture(faces)
Two things are worth internalising before you configure anything:
- Tracking is per face, not per frame. A subject who walks in, hesitates and then looks up is one track with many frames, and the SDK’s job is choosing among them.
- Pose and detector confidence are different numbers.
Detection.scoreis the detector’s certainty that a face is there. Frontalness is how well that face is turned towards the camera. They are filtered separately and never multiplied.
Two capture modes
Passive watches a room. Every face in frame is tracked independently, best frames are buffered, and a timer hands them to you in batches. This is the mode for a ceiling camera, a doorway, a reception desk that nobody interacts with.
Interactive captures one subject who knows they are being photographed — a check-in kiosk. On web this is the alignment ring: the subject centres their face, holds still, and a frame is taken.
<MeeeetUpCamProvider mode="passive" onBatchCapture={send}>
<CameraViewport />
</MeeeetUpCamProvider>
Where to go next
- Quick start (React) — a working passive camera in about twenty lines.
- Configuration — every capture gate, what it defaults to, and when to move it.
- React Native — the Vision Camera frame processor.
Nothing beats watching it run: the live demo executes this exact pipeline in your browser, with the thresholds on sliders.