EyeLab ← joshuaopolko.com

loading tracker...

Screen reach: does your gaze cover the whole screen?

Press Start camera, then this. A dot appears full screen: just look at it each time it moves, eyes only.
Press Start camera, then press "Guide me: look here" and just look at the dot each time it moves.
directiongaze reachesshort of the edgeiris movedangles (gaze / head)needs

Blue glow = where your gaze has been. Dashed box = the area your gaze covered (middle 94% of samples). Red bands = parts of the real screen your gaze never reached, with the distance in cm. The dotted rectangle is this browser window; the hollow circle is where the + in the middle of this map really is on your screen, so look at it and the dot should land there.

Head and gaze monitor (mirror view)

Start the camera and look at the screen; I will help you line your head up.

Amber cube + nose line = your head (turn right and it turns right, like a mirror). Green arrow = 3D gaze (head + eyes combined). Keep your head still and move only your eyes: the cube should stay put while the green arrow swings.

Camera, as the tracker sees it (mirrored)

MediaPipe iris (landmark model) Limbus ring fit (my own: image gradients) Dark-blob centroid (my own: pixel intensity)

Jitter: iris position inside the eye, last ~6 s (pixels, mean removed)

Hold still and look at one spot: any wobble here is pure measurement noise. Moving your eyes should show as clear steps. If the noise is the same size as the steps, a game cannot see the move.

Face signals: which expressions can a game use as buttons?

Each bar is how far the signal rises above your own resting level (learned over the last few seconds); the white line is the level I treat as a deliberate press. Try: widen your eyes, squint, raise your brows, frown, open your mouth, smile. A signal that clears the line cleanly, without flickering when you do nothing, is reliable enough to use as a control on your face.

Raw eye pixels (what the pupil really looks like to the camera)

right eye
left eye

Each square is a straight, un-smoothed crop from the camera, blown up with no interpolation: every block is ONE real camera pixel. If the iris is only a handful of blocks wide, that is the whole resolution budget for gaze.

Pupil map: iris position inside each eye (zoomed, mirror view)

Not centred yet: press Head sweep (best) or Centre eyes, then stare at the dot.

Each box is one eye: left/right edges are the eye corners, top/bottom the lids, zoomed so small movements show. Dots are the three detectors with a mild fading trail; the dashed rectangle is the range your pupil has covered over the last ~10 seconds. Look hard left, right, up and down and check the trail reaches the edges without the three detectors splitting apart.

Physical limits right now

An eyeball rotates about its centre, so the iris shifts only ~0.21 mm per degree (12 mm radius). The iris is 11.7 mm wide, so pixels per degree = iris width in pixels x 0.0179. That number, versus the noise in pixels, is the accuracy ceiling no software can beat.

Results

Run the tests above. The noise test shows the raw precision of each detector; the accuracy test calibrates on 9 dots, then checks 9 different dots and reports the true error in degrees and screen pixels.