Every detector has an enabled flag and a single sensitivity (0–1). Turn any off, tune the rest — the same knob everywhere.
Calibration-free look-away, learned from the candidate's own neutral gaze.
Absolute 3D head pose — no calibration, works the first frame.
Flags a second person even when only partially in frame.
Detects phones and books in view, including partial glimpses.
Knows when the candidate leaves the frame or turns away entirely.
No dot-clicking setup. It calibrates itself from the candidate’s own attention, then only flags sustained look-aways.
On start, it watches a few seconds of the candidate looking at the screen and learns their neutral gaze — no dot-clicking calibration.
Every frame it measures how far the eyes and head have moved from that neutral, smoothed and de-jittered.
A look-away only becomes an event once it holds past your threshold — short glances never fire, so alerts stay meaningful.
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.
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
The demo runs entirely in your browser. Nothing is uploaded — allow the camera and watch the signals live.