Keyboard Tester

Press keys and watch a 63-key on-screen layout light up. Read the code and key values, count how many keys are held at once, catch a stuck key.

🌐 Español

Last key pressed: Press any key to begin.

Keys held right now (0): none

0 / 63 on-screen keys tested this session.

UntestedTestedPressed nowPossibly stuck
`
1
2
3
4
5
6
7
8
9
0
-
=
Backspace
Tab
Q
W
E
R
T
Y
U
I
O
P
[
]
\
Caps
A
S
D
F
G
H
J
K
L
;
'
Enter
Shift
Z
X
C
V
B
N
M
,
.
/
Shift
Ctrl
Win/Cmd
Alt
Space
Alt
Ctrl
←
↑
↓
β†’

πŸ”’ Private by design: everything runs locally in your browser and never uploaded to any server.

The 63 keys on screen, and the ones that are not

The layout drawn below is a compact ANSI board: the number row with backtick through Backspace, the three letter rows with their punctuation, and a bottom row of modifiers, a spacebar and four arrows. Sixty-three squares in total, which is what the progress line counts against.

Left out, deliberately: the function row, the numpad, the Insert to Page Down cluster, and the right-hand system key. Drawing a full-size board would take over the page for keys that are rarely the ones people come here to check. Those keys still register when you press them, they simply have nowhere to light up, and the readout above the board names them by their raw identifier instead.

Working through the whole keyboard in one pass

  1. Click once on an empty part of the page, so the focus is not in a text field, then start pressing. There is no start button.
  2. Watch the square light up as you hold, and check the readout above for the two values the browser reported for that press.
  3. Release, and the square turns green and stays that way. That is the record you build up.
  4. Work along each row in order rather than at random. The point of the pass is to end with a board of green squares and to notice the one that stayed grey.
  5. Press several keys together and watch the Keys held right now count and list.
  6. Click Reset test to clear the green squares, the held list and the last-key readout in one go.

The legend under the readout names all four states a square can be in: untested, tested, pressed now, and possibly stuck. Space, Tab, Backspace and the arrows have their normal page behaviour suppressed while you test, so the page will not scroll or jump under you as you work.

Position against character, and why the highlight follows the position

Each key press hands the page two different values. One describes the physical key in its place on the board and does not change with your language or layout. The other is the character that key currently produces, which very much does. On an AZERTY keyboard the key sitting where a QWERTY board puts Q reports the physical identifier for Q and the character A.

Highlighting is driven by the physical identifier, so the square that lights up is always the key your finger is on, whatever layout the operating system has loaded. Both values appear in the readout so you can see the pair for yourself, which is quietly the most useful thing on this page when you are debugging keyboard shortcuts in your own application and cannot work out why they misfire on somebody else’s machine.

Twelve seconds without a release

A key is flagged as possibly stuck once it has been held for twelve seconds with no release event. That threshold is a compromise. Short enough to catch a switch that never came back up, long enough that ordinary use does not trip it, and it will still fire if you genuinely hold a modifier down that long while reading something, which the warning admits in its own wording.

One implementation note that shows up if you watch closely. Nothing re-renders on its own while a key is simply held, so a timer ticks twice a second whenever at least one key is down, purely to keep the elapsed time honest, and shuts itself off the moment nothing is held. The warning can therefore appear up to half a second after the twelve-second mark rather than exactly on it.

Holding six keys at once, and what the count cannot see

The held list is a live view of every key with a press but no release yet. Hold W, A, S, D, Shift and Ctrl together, the combination that matters in a lot of games, and either all six appear or they do not. That is a real rollover check, and on cheaper membrane boards and some wireless ones it is common to find that certain combinations simply cannot all arrive.

The limit is worth being blunt about. This can only report events that reached the browser. When the keyboard matrix or the operating system drops a press before it becomes an event, which is precisely the failure you are testing for, nothing in JavaScript can observe the drop directly. What you see is the count coming in lower than the number of keys under your fingers, which is the symptom rather than the cause. Pair it with the Mouse Tester if you are auditing a whole desk setup, and with the Gamepad Tester for controllers, which report through a different browser interface entirely.

A dead key is an absence, so the test runs backwards

There is no way to detect a key that sends nothing. A non-event cannot be observed, here or in any other web page, so any tool promising dead-key detection is really promising something else. What this does instead is track the inverse: every key that has fired at least once is marked, and stays marked, for the rest of the session.

That turns the question into one you can answer by elimination. Go along each row, then look for a square that never turned green despite being pressed. That key is the suspect, whether the switch has failed, the cable or receiver is dropping it, or a remapping layer is swallowing it. When a new machine is what you are checking over, the Dead Pixel Test covers the screen the same way, the Typing Speed Test confirms the keyboard behaves under real speed, and the rest of the hardware testers cover the other inputs.

See it in action

Screenshot of the Keyboard Tester tool with a full on-screen keyboard waiting for input, with a legend for untested, tested, pressed-now and possibly-stuck keys, a running count of the 63 keys tested this session, and readouts for the last key pressed and the keys held right now
Keyboard Tester mid-process: a full on-screen keyboard waiting for input, with a legend for untested, tested, pressed-now and possibly-stuck keys, a running count of the 63 keys tested this session, and readouts for the last key pressed and the keys held right now.
Diagram: where the work happens on a SysFenix page that has no file input at all: the tool arrives as ordinary JavaScript inside the page, works the answer out on your own device and renders it in place, so the upload, queue and server-side record a typical online tool needs never happen
Where the work happens on a SysFenix page that has no file input at all: the tool arrives as ordinary JavaScript inside the page, works the answer out on your own device and renders it in place, so the upload, queue and server-side record a typical online tool needs never happen.

Frequently asked questions

Nothing lights up when I press a key. What is intercepting it?

Check where the caret is first. Key events are ignored while the focus sits in a text field, a select or any editable element, which includes the search box in the site header, so click on an empty part of the page and try again. Beyond that, a shortcut claimed by the operating system or by the browser itself is handled before the page ever sees it, and there is no way for a web page to observe a keypress that was never delivered to it.

My tested count went past the total. How?

By pressing keys that are not on this layout. The counter tallies every distinct physical key that has produced a press this session, including function keys, a numpad or the navigation cluster, while the total it is shown against is only the number of squares drawn on screen. So the left number can legitimately overtake the right one. The reading you actually want from that line is which squares are still grey, not the ratio itself.

Does holding a key down repeatedly restart the stuck-key timer?

It does not, which is the behaviour you want. A held key makes the browser fire repeated press events, and only the very first one is remembered as the moment the key went down; the repeats are ignored outright. The elapsed time is therefore measured from when you first pressed, not from the most recent repeat, and it is only cleared when a matching release arrives.

The layout is missing keys my keyboard has. Can I still test them?

Partly. There is no numpad, no function row, no navigation cluster and no right-hand system key on screen, because a full-size layout is a much larger thing to draw than one page needs. Press any of those anyway and the last-key panel still names them properly, and they still join the held list while you keep them down. What they lack is a square to turn green.

Should I trust a stuck-key warning?

Treat it as a prompt to look, not as a diagnosis. The warning means a key has been down for twelve seconds with no release seen, and the code genuinely cannot tell that apart from you holding a modifier while you read something. Its own text says as much. If you were not touching the keyboard when it appeared, that is when it is telling you something real.

Is what I type here recorded anywhere?

It is not. The page listens for key press and release events, keeps a set of codes in memory for as long as the tab is open, and writes nothing to storage, to a cookie or over the network. Reloading wipes the session, and so does the reset button. No characters are collected either; only the physical key identifier and the character it currently produces are read from each event.

Related tools