HCI · Ergonomics · ISO 9241-411 · Next.js · 2026 · Solo — HCI science, TDD implementation, interaction design, deployment

fitts-lab

Click 20 targets. Get your optimal DPI. Download your OpenLogi profile — backed by ISO ergonomics science.

The problem

Mouse DPI and acceleration are configured by feel and forum guessing. No browser-based tool measures actual pointing performance with the ISO-standardized Fitts's Law protocol and translates the result into a concrete hardware recommendation. Users who care about precision — graphic designers, gamers, CAD operators — have no objective calibration path without specialist software.

Architecture

Key decisions

01

Pointer Events API over rAF timing

PointerEvent.timeStamp is driven by the browser's high-resolution performance clock, independent of frame scheduling. This gives sub-millisecond trial timing even under rAF jitter, which matters when Movement Time differences of tens of milliseconds separate DPI conditions.

02

Shannon (log₂(2D/W+1)) over Fitts original (log₂(D/W))

The Shannon formulation from MacKenzie 1992 is the ISO 9241-411 reference standard. It produces non-negative ID for all realistic target sizes and correlates better with empirical data across wide parameter ranges than the original Fitts log₂(D/W) or the 'adjusted' formulation.

03

IQR outlier rejection before throughput averaging

First and last trials in a session systematically inflate MT due to learning and fatigue effects. The 1.5×IQR Tukey fence removes these without requiring a fixed warm-up/cool-down protocol, giving a robust mean IP estimate from unconstrained user sessions.

04

SmartShift recommendation from throughput spread

When throughput gain from low to high DPI exceeds 20%, SmartShift dynamic switching is flagged in the profile — the user benefits from low-DPI precision at rest and high-DPI speed during fast gestures. A flat throughput curve means no benefit from switching.

Metrics

13
TDD unit tests (vitest, all passing)
20
target-acquisition trials per DPI condition
2
DPI conditions compared (800 vs 1600)
0
network calls after page load