1. 1 About
  2. 2 Capture
  3. 3 Result

Prove there's a real person here

A camera check that resists photos, replayed video and masks.

Why

CAPTCHAs are beaten by bots and by paid humans. Camera checks can be beaten by feeding in a recorded video instead of a live one.

What we test

  • That your face reflects light changes we make on screen
  • That you can move your face, showing real depth

You'll need

  • A camera
  • A reasonably lit room
  • About 30 seconds

Privacy

Everything runs in this page. No image, video or measurement is sent anywhere.

Flashing screen. The light test changes the whole screen colour about twice a second for five seconds - below the WCAG 2.3.1 threshold, muted colours, no saturated red. If you are sensitive to flashing light, untick it below and the check will run without it.

Every instruction is spoken aloud and a tone rises as you get into position, so the check can be completed without looking at the screen.

Starting the camera...
Camera off.
Not run
Run the check to produce a result.
Reflected our light
Showed real depth
Detailed measurements

Illumination response

Correlation between the emitted colour sequence and the light measured off the skin.

--
Skin correlation
1.0 = perfect. A screen replaying video should be near 0.
--
Response lag
Frames between emitting and seeing it.
--
Modulation depth
How far skin brightness moved, in digital numbers.
--
Background corr.
The scene behind you should respond too.

Parallax

Residual after fitting a homography between head poses, as a percentage of face width. A flat surface fits well and so scores low.

--
Homography residual
Higher means more genuine 3D depth.
--
Yaw swept
Turn range achieved.

Weak diagnostics

Trivially bypassable. Recorded for interest, deliberately excluded from the score.

--
Frame jitter
Metronomic timing can hint at a synthetic feed.
--
Camera label
Matched against virtual-camera names. Renaming defeats it.
no run yet
How the two checks work

Illumination response

The screen steps through a random sequence of colours. Skin reflects it; a phone screen replaying a video is emissive and barely reflects anything. Measured as the correlation between what was emitted and what the camera saw, plus the lag between them.

Parallax

A flat surface can only change by a single projective transform when it rotates. A real face cannot. So a homography is fitted between your landmarks at two head angles and the leftover error is measured: low error means flat, high error means genuine depth. Only the 2D landmark coordinates are used - the tracker also reports a z value, but that comes from fitting a canonical 3D face model, so it would describe depth even for a flat photo and defeat the whole test.

Why both

A video on a phone screen defeats a pulse check but fails both of these. A moulded 3D mask passes parallax but fails illumination. Each covers the other's blind spot. Neither covers a virtual camera.

Limitations - please read

This is not a security control

Every measurement runs inside the page, so anyone can patch it out, hook the camera, or feed the page a synthetic video stream. A real deployment must generate the challenge on a server, verify the captured frames on that server, and treat the result as one score inside a risk decision - never as a gate decided by the client. Treat this as a measurement instrument, not a product.

Thresholds are provisional

Nothing has been calibrated against real spoofs. The pass marks come from synthetic geometry, not from captures of an actual phone screen or print held up to a camera. Export the JSON from a genuine run and from a spoof attempt to compare them properly.

Who this excludes

The movement test needs enough neck rotation to register, so it will fail some users for reasons that have nothing to do with liveness. Any real deployment needs an alternative route, and that route then becomes the weakest link.

Look at the screen and hold still
Keep your whole face visible