Keyboard Test
Physical key check
{{ summaryLine }}
{{ summaryValue }}
Overview shows all keys. Choose a section; arrows scroll. Pressed keys appear automatically.
Start capture, then press and release keys. Exit: Stop, hold Esc for 2 seconds, or Shift+Esc.
On-screen keyboards do not report physical keys. Connect a USB or Bluetooth keyboard.
{{ exportStatus }}
{{ reportText }}
{{ exportStatus }}
| Physical key | Physical code | Coverage | Presses | Repeats | Suspects | Min gap (ms) | No-release count | No-release observations (ms) | State | Copy |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ keyName(row.code) }} | {{ row.code }} | {{ row.excluded ? 'Excluded by you' : row.mapped ? (row.tested ? 'Registered' : 'Untested') : 'Extra / outside map' }} | {{ row.presses }} | {{ row.repeats }} | {{ row.suspects }} | {{ row.min_gap_ms === null ? '—' : row.min_gap_ms }} | {{ row.no_release_observations.length }} | Down {{ observation.pressed_ms }}; no release for {{ observation.duration_ms }}; observed through {{ observation.observed_ms }}; {{ observation.ended_by }}. — | {{ row.excluded ? 'Excluded by you' : row.stuck ? 'Possibly stuck now' : row.held ? 'Held' : row.no_release_observations.length ? 'No-release observed' : row.suspects ? 'Chatter suspect' : row.tested ? 'Tested' : 'Untested' }} |
{{ exportStatus }}
| Time (ms) | Type | Physical key | Code | Key | Location | Repeat | Modifiers | Last-event gap (ms) | Flag | Copy |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ row.time_ms }} | {{ row.type }} | {{ keyName(row.code) }} | {{ row.code }} | {{ row.key || '—' }} | {{ row.loc }} | {{ row.repeat }} | {{ row.modifiers || '—' }} | {{ row.gap_ms === null ? '—' : row.gap_ms }} | {{ row.flag }} |
Start capture and press physical keys to populate this log.
{{ exportStatus }}
Chart unavailable. The ledger and report retain the measurements.
{{ frequencies.length ? 'Each dot counts gaps of exactly that duration; amber dots fall below the current threshold. No gap values are rounded before grouping.' : 'Press and release the same key at least twice to collect a gap.' }} Zero-ms gaps: {{ values.gaps.filter(gap => gap === 0).length }} (not plotted on a logarithmic axis). Auto-repeat, IME and unmatched releases are excluded.
Similar tools
- Mouse Test Check your mouse for unwanted clicks and scroll problems in your browser, then save a factual report for repair or warranty discussions.
- Gamepad Test Test your gamepad for stick drift, missed buttons and trigger range, with suggested deadzones and a local report of the recorded evidence.
- Touch Screen Test Check your touchscreen for missed or unwanted touches in your browser and save an observation report for purchase or repair discussions.
- CPS Test Measure clicks per second in a timed browser trial, compare pace and consistency, and filter near-duplicate presses when checking switch bounce.
Typing a sentence leaves much of a keyboard unchecked. Arrow keys, both Shift keys, the number pad and combinations used in games may behave differently from the letters used in ordinary typing. A useful keyboard test checks whether each physical key registers, whether its release is observed and whether several intended keys can register together. These checks help investigate missed presses, double typing or a problem that needs a repeatable description for a seller or manufacturer.
Checking every key means working through the positions actually present on the keyboard. A compact board legitimately lacks keys found on a full-size model, while a laptop may combine functions on shared keys. An untouched or unseen position is not evidence of a fault. Registration establishes that an event arrived on that occasion; repeated light presses are more informative when a problem occurs only intermittently.
Simultaneous presses introduce three related terms that are often confused:
- Ghosting
- An unpressed key appears in the reported combination. In a keyboard switch matrix, unintended electrical paths can make an additional position appear pressed.
- Blocking
- A key that is physically pressed fails to appear in the combination. Some keyboards suppress ambiguous combinations to avoid reporting phantom keys.
- Rollover
- The ability to recognize overlapping keypresses. N-key rollover, or NKRO, means arbitrary simultaneous combinations can be reported, up to all the keyboard's keys.
A keyboard can recognize one large combination yet miss a different, smaller combination. Testing the keys used together in a game or shortcut therefore matters more than reaching a high count once. The phrase anti-ghosting may describe protection for only part of a keyboard. Comparing the keys actually held with the keys reported distinguishes a missing press from an unwanted extra press.
Double typing concerns successive presses of one key. Mechanical contacts can bounce between open and closed before settling, and debouncing suppresses those extra transitions. When one intended tap produces repeated registrations, switch chatter is one possible explanation. Holding a letter down normally produces operating-system auto-repeat, so a stream of repeated characters during a deliberate hold does not by itself demonstrate chatter. A key that appears held after physical release can also reflect a missed release event.
Physical position and typed character are separate. A browser distinguishes the position of a key from the character or action produced under the current language layout and modifiers. For example, the number-row 2 position can produce @ with Shift on a US layout or " with Shift on a UK layout. Left and right modifiers, and number-row and numpad digits, remain distinct positions even when their visible output looks alike.
A browser observes events that reach it after keyboard and operating-system processing. Fn, some media keys and system shortcuts may never arrive. Focus changes can interrupt release tracking as well. Browser observations can document a reproducible symptom, but they cannot alone identify a failed switch, certify NKRO or establish a hardware latency or polling-rate measurement.
How to Use This Tool:
Use a physical keyboard and match the displayed board to its actual shape before capturing events. On a phone or tablet, connect a USB or Bluetooth keyboard; an on-screen keyboard cannot establish physical-key coverage.
- Choose Physical layout and Keyboard size. ANSI has a wide Enter key; ISO has a tall Enter and an extra position beside left Shift. The initial selection is ANSI and Full-size.
- Open Keys absent from your board while capture is stopped and select only positions the keyboard physically lacks. Keep a present but unresponsive key included so it remains visible as a coverage gap.
- Select Start capture, then press and release the keys row by row, including both sides of modifiers and the numpad when present. Blue shows a currently held key, and registered positions remain marked after release.
If Check threshold prevents capture, clear Chatter threshold in Advanced to restore 50 ms, or enter a whole number from 1 to 1,000 ms.
- Hold A, S and D, then add J, K, L and Space. Compare every physically held key with the map, and repeat with other combinations you actually use. On a narrow screen, the whole-board overview retains the complete view while the enlarged section follows delivered keys.
- Select Stop and inspect Defect report for registered keys, flagged observations and the separate list of unpressed positions. Holding Esc for two seconds or pressing Shift+Esc also ends capture. Moving focus away pauses capture; use Resume to continue with the retained observations.
- Add the keyboard model and useful reproduction notes in Advanced if they help explain the symptom. They appear in the report alongside the observed results.
- Copy the report or download it as TXT when the evidence is ready to share. The Per-key ledger can be copied or downloaded as CSV, or exported as DOCX, when exact physical codes and timings are needed.
Reset starts a fresh test by clearing observations, model and notes while preserving board settings. Export any evidence you want to keep before resetting.
Interpreting Results:
The summary describes the retained observations. A complete map and a clean summary support only what was observed during that session.
- All mapped keys registered means every selected, non-excluded position produced qualifying evidence. It does not establish that every combination works or that an intermittent fault is absent. With Coverage incomplete, follow the unpressed-key checklist and recheck the physical board selection.
- No keys selected means all mapped positions have been excluded. Restore the positions that are physically present before treating coverage as meaningful.
- Chatter suspects counts flagged presses, not distinct keys. Find the affected positions in the ledger and repeat slow, separate taps with complete releases. Deliberately rapid tapping can produce the same flag.
- Review no-release observations means one or more long intervals lacked a delivered release. An intentional hold can qualify. Compare the recorded interval with what you were doing, then repeat a short press and release while the capture area stays focused.
- Max simultaneous includes modifiers. Compare the reported combination with the keys you actually held. A high number does not certify NKRO, and a missing or extra key needs a repeatable combination before it becomes useful evidence.
With at least one position selected, chatter takes summary priority over no-release observations. Read both flagged-observation groups in the report. The red Possibly stuck now indication clears when live holds are cleared, while qualifying no-release history remains in the report and ledger.
The Release gaps chart counts paired release-to-press intervals of exactly the same duration. Its millisecond axis is logarithmic, so equal horizontal distances represent ratios rather than equal time differences. Amber points lie below the selected threshold. Zero-ms gaps are counted separately because a logarithmic axis cannot display zero. The ledger's Min gap (ms) uses these paired intervals; the event log's Last-event gap (ms) instead measures time since the previous event for that same physical code, which may be a press, release or repeat.
Technical Details:
Physical-key analysis follows press and release events for each position. Character output is recorded for context, but changing a legend or language layout does not merge left and right modifiers or the number row with the numpad. Coverage, rapid re-presses and simultaneous holds use different parts of that event sequence.
Formula Core
Coverage is the percentage of selected physical positions that have registered. Exclusions reduce the set being checked.
C is coverage in percent, R is the number of registered, non-excluded mapped positions, M is the selected map's key count, and E is the number of exclusions within that map. The formula applies when M exceeds E. If no positions remain, coverage is reported as 0 of 0 and 0%, with No keys selected. The report rounds the percentage to one decimal place.
A qualifying non-repeat press or a delivered release can register a position. A release without an earlier recorded press therefore counts as registration without adding a press or a held key. Auto-repeat alone, input-method composition and empty or unidentified physical codes do not establish coverage. Events outside the selected map remain available as extra observations but do not increase the numerator.
These counts describe the available browser-key profiles. Size labels do not guarantee that every manufacturer's board has the same inventory, and Fn is omitted from every profile.
| Keyboard size | ANSI keys | ISO keys |
|---|---|---|
| Full-size | 104 | 105 |
| Tenkeyless | 87 | 88 |
| 75% / laptop | 81 | 82 |
| 65% | 67 | 68 |
| 60% compact | 61 | 62 |
The 75% and 65% profiles omit right Meta and Menu. The 65% profile also omits the function row and End; both 65% and 60% place Escape at the usual backquote position. Exclusions change coverage only. A delivered event from an excluded or outside-map key can still contribute to chatter, no-release history and simultaneous-key observations.
Chatter uses the interval after release
A chatter sample requires a recorded press, its matching release, and another non-repeat press of the same physical key. The relevant gap begins at the release, so the time spent holding the previous press is not part of it.
The paired release-to-press gap is calculated in milliseconds.
A sample is flagged when its nonnegative gap g is strictly less than threshold T. The default T is 50 ms. For example, a release at 1,000 ms followed by a new press at 1,049 ms produces a 49 ms gap and one suspect; a new press at 1,050 ms produces a 50 ms gap and no suspect. These are illustrative event timestamps, not measurements of a particular keyboard.
Operating-system repeat events increase the separate repeat count. A second press event without an intervening release is recorded as down without release, not as another press or a chatter sample. Composition events from an input method editor, abbreviated IME, and unidentified codes are excluded from these measurements. An unmatched release does not supply a paired-release baseline.
The threshold accepts whole numbers from 1 to 1,000 ms. A blank override restores 50 ms; a nonblank invalid value requires correction. Raising the threshold can flag more retained gaps, and lowering it can flag fewer. This changes the classification of observations without filtering or repairing keyboard input. The threshold is a screening choice, not a switch-failure specification.
No-release intervals
A no-release duration runs from an accepted press to its matching release, a stop or focus reset, a Meta-release reset, or the current observation time while it remains held.
The duration d is in milliseconds. An interval qualifies once it reaches 10,000 ms, or 10 seconds. One observation is retained per qualifying interval, including its start, duration, observation end and reason tracking ended. A press at 0 ms closed by a stop at 10,001 ms retains a 10,001 ms observation; it does not keep growing after capture has stopped.
The two flags treat their boundaries differently:
| Observation | Boundary (ms) | Below boundary | Exactly at boundary | Above boundary |
|---|---|---|---|---|
| Paired chatter gap at the default threshold | 50 | Flag the new press | Do not flag | Do not flag |
| No-release interval | 10,000 | Do not record an observation | Record an observation | Record an observation |
Caps Lock is exempt from no-release classification on detected Apple platforms, accommodating macOS cases where its release event is omitted. The Mac modifier-label preference does not control that exemption. Clearing live holds preserves completed qualifying intervals and removes the release baselines used for chatter, so gaps are not joined across those interruptions. A delivered Meta release, meaning a Windows or Command key release, also clears the other live holds and release baselines.
Observed rollover and timing limits
The simultaneous-key maximum is the largest set of distinct physical codes held according to the delivered events. Repeats do not enlarge it. The first combination reaching that maximum is retained, and the greatest ordinary-key count is tracked separately. Ordinary keys here exclude left and right Shift, Control, Alt and Meta; that separate maximum need not occur at the same moment as the overall maximum.
USB Human Interface Device, or HID, version 1.11 defines a keyboard boot report with six ordinary-key slots and separate modifier bits. Other report formats can differ. A repeated ceiling at six ordinary keys can therefore suggest that reporting limit, but a browser count cannot identify the active protocol. Repeated blocking at two or three ordinary keys can suggest matrix restrictions; browser or operating-system interception remains another explanation.
Gap comparisons and frequency grouping use the full timestamps supplied by the browser, without rounding first. A zero-ms paired gap qualifies at every allowed chatter threshold, although it is absent from the positive-gap chart data. Preserving timestamp precision does not make these electrical switch measurements. The observations do not measure contact-bounce duration, actuation force, scan rate or end-to-end input latency.
Browser Limits and Privacy:
Capture operates only while the test is running and its keyboard area has focus. Normal capture requests no keyboard-lock permission. Observed keys, character values, model and notes are processed in this tab without being sent as test data or saved in browser storage.
- Fn and some manufacturer or media keys may be handled before they reach a web page. System combinations such as Alt+Tab, Command+Tab or Ctrl+Alt+Delete can be intercepted. During focused capture, the page blocks default actions where the browser allows it, including Tab navigation, Space scrolling and Save, Print, Find and Reload shortcuts. Other shortcuts can still open or close tabs, so avoid testing them with unsaved work.
- PrintScreen may deliver only a release event, which can still establish registration. On macOS, Caps Lock can omit its release, and keys released while Command is held can also lose release events. These delivery quirks can make a key look held after you have let go.
- Fullscreen Keyboard Lock is an explicit optional action in Advanced, available only in a supporting Chromium browser in a secure context. It enters fullscreen and requests the lock; Chrome 130 and later require permission. It can expose more shortcuts but remains subject to operating-system restrictions. A denied or unavailable lock leaves normal capture usable.
- Use my key labels optionally reads the current keyboard layout when the browser supports it in a secure context. If access fails, physical-position labels remain. This affects labels, not coverage or physical identity.
- Changing the physical layout, keyboard size, modifier-label preference or chatter threshold pauses running capture and recalculates the retained observations. A settings URL can carry the selected layout, size, modifier labels, exclusions and an explicit threshold override. It does not carry observed events, character values, model or notes. Clearing the threshold override removes it from the URL.
- The session retains up to 6,000 events, including releases, repeats and capture resets. The Event log and its exports contain only the latest 200 rows; summary counts and the ledger use the full retained session. Export needed evidence before resetting or reloading, because sessions are not saved for later visits.
- Local event processing does not mean the page makes no network requests; the chart may load supporting resources. Copied or downloaded evidence can contain typed character values, and the report includes browser/platform details plus any model and notes you supplied. Check that content before sharing it.
Worked Examples:
A compact board with one absent position
Suppose an ANSI 75% keyboard physically lacks right Control. Selecting 75% / laptop provides 81 positions, and excluding that absent position leaves 80. If 79 of those positions register, the report shows 98.8% coverage after rounding 98.75%. The remaining position still needs checking. Excluding a present key merely because it did not respond would conceal that gap rather than resolve it.
Eight held keys with only six ordinary keys
If A, S, D, J, K and L plus both Shift keys are delivered and remain held, Max simultaneous reaches eight while the ordinary-key count reaches six. That observation is compatible with six ordinary-key slots and separate modifiers. Add another ordinary key and try different combinations, recording what is physically held and what appears. Even a successful larger combination does not establish that every combination works.
References:
- UI Events KeyboardEvent code Values, W3C, 22 April 2025.
- UI Events, Working Draft, W3C, 21 February 2026.
- Device Class Definition for Human Interface Devices, version 1.11, Appendix B.1, USB Implementers Forum.
- How a Keyboard Matrix Works, QMK Firmware.
- Contact Bounce / Contact Chatter, QMK Firmware.
- Glossary of QMK Terms: N-Key Rollover, QMK Firmware.
- Keyboard Ghosting and the SideWinder X4, Microsoft Applied Sciences.
- Capture Keys with the Keyboard Lock API, Chrome for Developers.
- KeyboardEvent, MDN Web Docs, 18 September 2025.
- KeyboardEvent: keyCode property, special-key compatibility notes, MDN Web Docs.
- Missing key releases while Command is held on macOS, Mozilla, bug 1299553.
- Keyboard: getLayoutMap() method, MDN Web Docs, 13 March 2025.