Every property a keydown or keyup event actually carries
Pressing a key fires a real KeyboardEvent, and this tool surfaces its properties directly rather than summarizing them: key (the character or name the key represents, respecting Shift and layout — "a" vs "A"), code (the physical key's position on the keyboard, layout-independent — always the same code regardless of what character the key currently types), which and keyCode (older numeric codes, still populated by the browser but marked deprecated in the current spec), location (which physical key of several identical ones was pressed), repeat (true while a key is held down and auto-repeating), and the four modifier booleans — ctrlKey, shiftKey, altKey, metaKey. The full raw object, including timeStamp and event type, is shown as formatted JSON alongside the summarized view.
key vs. code: the distinction that trips people up
key and code answer different questions, and they are the pair developers confuse most often. code identifies the physical key — pressing the key labeled Z on a QWERTY keyboard always reports code: "KeyZ", even on a layout where that same physical key normally types a different letter. key identifies what the key means right now, including the effect of Shift and the current layout — the same physical press reports key: "z" or key: "Z" depending on Shift, and can report an entirely different character on a different layout. A game's WASD movement should read code, so it stays in the same physical position across layouts; a text shortcut like Ctrl+S should read key, so it matches what the user is actually typing.
Location: telling left from right, and either from Numpad
The location property, exposed here through a named lookup, distinguishes between otherwise-identical keys: 0 is Standard (most keys — only one physical instance exists), 1 is Left and 2 is Right (Shift, Control, Alt, and Meta each exist twice, and location tells you which side was pressed), and 3 is Numpad (a numeric-keypad key that duplicates a main-keyboard key, like Numpad 5 versus the top-row 5). Building a shortcut that should only fire from the left Ctrl, or a numpad-only input, needs this property — key and code alone cannot distinguish them.
Capture mode: observing without losing keyboard access
Capture keys, off by default, calls preventDefault on a specific set of keys — F1, F3, F5 through F8, F11, F12, Space, Tab, and any key combination held with Alt — but only while it is switched on, and Escape always releases it immediately regardless of what else is happening. That narrow, opt-in scope exists because an earlier version of this tool suppressed those keys unconditionally, which meant Tab could not move focus anywhere — a keyboard-only visitor had no way to reach the rest of the page. With capture off, every key you press is still reported in full; only the browser's own default action for that key changes.
What the visual keyboard and event history show
The on-screen keyboard highlights each key the instant its physical position is pressed, color-coded by row, and clears the instant it is released — useful for confirming a key's code visually rather than reading it from the JSON dump. Below it, the last four events are kept as a rolling history, each showing its key, code, which value, location, and any modifiers that were held, so you can compare a sequence of presses — useful for checking exactly what a combination like Ctrl+Shift+K actually reports before wiring a shortcut handler to it.