Most keyboard test tools are either bloated 600MB Electron trash heaps or web pages that lie to your face about browser event latency. Keyism exists because humans are incapable of writing lightweight desktop software.
Built on Tauri 2 and vanilla TypeScript. Keys are intercepted directly via Win32 Raw Input (WM_INPUT) with RIDEV_INPUTSINK. No low-level global hooks (WH_KEYBOARD_LL). Keyism continues tracking keypresses, timing, and chatter metrics seamlessly in the background while you type or game in other applications.
Stop guessing whether your custom build is broken. Here is actual physical reality:
| Metric | What it exposes |
|---|---|
LAST |
Legend of the last physical key event. |
CODE |
Virtual key code and Set 1 scan code, complete with E0 / E1 prefix inspection. |
HOLD |
True make-to-break duration of the last released switch. |
GAP |
Delta between the last two switch activations. |
UI |
Native event callback to paint pipeline latency. Not fake hardware marketing claims. |
NKRO |
Live depressed keys vs. your maximum session rollover peak. |
CHATTER |
Makes within 15 ms of break, or orphan makes. Proof that your switch leaf is failing. |
ANSI (104) and ISO (105) progress tracking counts unique caps pressed this session. Test every single switch before you blame your video game losses on latency.
Opt-in typing analytics. Off until you turn it on, and it never leaves your machine — no account, no telemetry endpoint, no "anonymised" upload that isn't. Keyism has no networking code at all.
Hit Analytics in the title bar for nine tabs of it: overview, speed, words, keys, accuracy, timing, heatmaps, fun, and records. Session, today, 7 days, 30 days, lifetime.
Counters and frequency tables in %APPDATA%\com.keyism.app\stats.json. That is the entire storage layer.
| Stored | Never stored |
|---|---|
| Counters: keystrokes, characters, words, backspaces, active time. | Raw text. Not a sentence, not a line, not a paste. |
| Single words, lowercased, with a count and a typing duration. | Anything longer than a three-word combination. |
| Two- and three-word combinations, for the phrases you actually repeat. | Window titles, URLs, file paths, clipboard contents. |
| Per-character and per-key-id frequencies, hold times, transitions. | Which application any individual keystroke came from. |
| Per-hour and per-day rollups so the graphs have an x-axis. | Timestamps of individual keystrokes. |
Three-word combinations are the deepest text-shaped thing in the file, they are capped, and Clear history deletes the file outright.
Letters land in a buffer no longer than 64 characters. A space, punctuation mark, Enter, or Tab confirms it: the token increments its counters and the buffer is cleared on the same line. Caret movement, an idle pause, an application switch, or anything oversized clears the buffer without counting it.
Nothing survives a boundary. There is no code path that appends one confirmed token to another, which is why a fourth consecutive word cannot appear in the file no matter what you type. The test suite asserts exactly that.
Keyism cannot tell that you are typing into a password field. Raw Input reports scan codes from a device; it has no idea which control has focus. Any tool claiming otherwise on Windows is either wrong or dragging in UI Automation, and we are not doing that to your CPU.
So there is no field-level exclusion and no per-website exclusion. What you get instead:
- Per-application exclusion, enforced in Rust on the keystroke path. Excluded applications never produce a character in the first place — the filter runs before translation, not before display. Nine credential managers are blocklisted by default.
- Pause, from the tray or the dashboard. Pausing also forgets the in-flight session.
- Analytics off, which is the state you start in.
Read that as: this is a good typing-habits tool and a bad secret keeper. Exclude your password manager, pause before you log into your bank, and do not pretend a keystroke counter is a security product.
Closing the window hides it to the system tray so background tracking survives, because a typing tracker that stops when you close the window is a screenshot. The tray tooltip states which of the three states you are actually in — tracking, paused, or analytics off — so "is it recording?" is never a guess.
Left-click the tray icon to bring the window back. Quit Keyism in the tray menu flushes to disk and exits for real. Optional autostart writes one HKCU\...\CurrentVersion\Run value and is off by default.
We kept this idiot-proof because history proves you need it.
# install dependencies
npm install
# launch the lab
npm run tauri devSet KEYISM_TRACE=1 if you want every raw input event dumped to your console.
Run the test suite. If it fails on your machine, the problem is between your chair and your keyboard.
npm test # session model & board geometry
cargo test --manifest-path src-tauri/Cargo.toml # scan code matrix