client-side · no server video

Proctoring that runs
in the browser.

Gaze, head-pose, multiple-person and device detection on MediaPipe — calibration-free, framework-agnostic, and TypeScript-first. The candidate’s video never leaves their device.

Try the live demo →Read the docs
# install
npm i proctor-vision @mediapipe/tasks-vision
gaze · head-pose · presence
Signals

Five detectors, one uniform dial.

Every detector has an enabled flag and a single sensitivity (0–1). Turn any off, tune the rest — the same knob everywhere.

eyeGaze

Eye gaze

Calibration-free look-away, learned from the candidate's own neutral gaze.

headMovement

Head movement

Absolute 3D head pose — no calibration, works the first frame.

multiplePerson

Multiple people

Flags a second person even when only partially in frame.

device

Phone & notes

Detects phones and books in view, including partial glimpses.

faceDetection

Face presence

Knows when the candidate leaves the frame or turns away entirely.

Calibration-free

How the auto-baseline works.

No dot-clicking setup. It calibrates itself from the candidate’s own attention, then only flags sustained look-aways.

01

Learn neutral

On start, it watches a few seconds of the candidate looking at the screen and learns their neutral gaze — no dot-clicking calibration.

02

Track deviation

Every frame it measures how far the eyes and head have moved from that neutral, smoothed and de-jittered.

03

Flag sustained

A look-away only becomes an event once it holds past your threshold — short glances never fire, so alerts stay meaningful.

Integration

Five lines to live.

Headless engine + typed events. Point it at a <video> or a MediaStream, listen, and render however you like. An optional vanilla UI and a React hook ship too.

Full API →
proctor.ts
import { createProctor } from "proctor-vision";

const proctor = createProctor({
  features: {
    eyeGaze:        { enabled: true, sensitivity: 0.5 },
    headMovement:   { enabled: true, sensitivity: 0.5 },
    multiplePerson: { enabled: true, sensitivity: 0.6 },
    device:         { enabled: true, sensitivity: 0.7 },
  },
});

proctor.on("prolonged", (e) => showBanner(e.message));
await proctor.start(videoEl);
const report = proctor.getReport();  // evidence for review

See it track your gaze in real time.

The demo runs entirely in your browser. Nothing is uploaded — allow the camera and watch the signals live.

Launch the demo →Star on GitHub