Adjacent complete-press gaps
After at least two complete presses, show each release-to-next-press gap against the current threshold.
Choose a key and complete repeated press-and-release cycles to flag intervals below a threshold and review the suspected chatter rate and stability.
Test settings and live samples
For example KeyA, Space, or ShiftLeft. Tab is not supported.
Enter a valid KeyboardEvent.code that does not move focus, such as KeyA, Space, or ShiftLeft. Tab is not supported.
Use 5–100 ms; the default is 10 ms.
Enter a number from 5 to 100 milliseconds.
Current phaseNot started
The result describes event gaps received by the browser and is not a hardware-fault diagnosis.
After at least two complete presses, show each release-to-next-press gap against the current threshold.
Adjacent gap Δt = next keydown time − previous keyup time. When Δt < threshold T, the gap is suspected; suspected rate = suspected gaps ÷ comparable gaps × 100%. The first complete press has no preceding gap and is excluded.
Unrounded millisecond values are used internally. The page displays one or two decimals, and threshold comparison uses the strict less-than rule.
Independent checks cover 5, 10, and 20 ms gaps, strict threshold boundaries, repeat=true, composition, orphan keyup, duplicate keydown, and unfinished presses.
The browser sees only the final event stream and cannot measure switch waveforms or firmware debounce. An intentional fast second press can be flagged. Bluetooth, system load, scheduling, focus loss, and Tab navigation affect the test; Tab cannot be a target.
After a complete down-up on the target key, a non-repeat keydown is a suspected chatter gap when the time since the previous keyup is below the threshold.
Not directly. event.repeat=true auto-repeat events are excluded, and only a press with a matched keydown and keyup enters the statistics.
Start with 10 ms for screening and adjust between 5 and 100 ms. A larger threshold is more likely to flag an intentional fast second press.
All key events and statistics are processed locally in this browser. Nothing is uploaded, no remote API is called, and no URL or local storage is used.
No third-party runtime code or assets are reused. The algorithm and interface are independently implemented; external links explain browser standards only.