← Back to Blog

The Debounce Dilemma: How Firmware Settings Quietly Skew WPM—and How to Standardize Your Tests

The Debounce Dilemma: How Firmware Settings Quietly Skew WPM—and How to Standardize Your Tests

Why your keyboard’s firmware can change your WPM

Typing tests typically treat a keystroke as an instantaneous, unambiguous event. Firmware engineers know it’s anything but. Between switch bounce, matrix scan timing, and host polling, “when” a press becomes real can move by several milliseconds. Over hundreds of presses, that small shift can inflate or deflate your words per minute (WPM) and even nudge accuracy. For a 100 WPM typist (roughly 120 ms per character), shaving 3–5 ms off each press is already 2–4% of the per‑key budget.

This piece audits how common firmware defaults—especially in QMK and ZMK—affect measured speed/accuracy, then proposes a practical way to normalize results across boards and settings.

Debounce 101 (and why “eager” changes everything)

Mechanical switch contacts don’t settle cleanly; they chatter for a few milliseconds. Debouncing filters that chatter so one physical press becomes one logical event. QMK ships a Debounce API with several algorithms and a default debounce time of 5 ms; if a keyboard doesn’t pick a specific algorithm, QMK uses a global, defer‑style method (`sym_defer_g`). In defer algorithms, the firmware waits until the input is stable for the debounce window before reporting the change. That’s robust, but it adds up to the full debounce time to your first report on press. (docs.qmk.fm)

QMK also offers “eager” variants (per‑key or per‑row). Eager on press reports immediately, then ignores further input for the debounce window. It reduces perceived latency but is less resistant to noise. The choice (eager vs. defer, global vs. per‑key) is explicit in the QMK docs and materially changes timing. (docs.qmk.fm)

ZMK’s default is also 5 ms for both press and release, and it exposes an explicit “eager‑like” configuration by setting press debounce to 0 ms and keeping release at a nonzero value—functionally similar to QMK’s asymmetric eager‑on‑press, defer‑on‑release approach. ZMK documents that eager behavior “eliminates latency” on press but is “not noise‑resistant,” and it also calls out that its debounce scan period defaults to 1 ms—important because timers are rounded up to the next scan tick. (zmk.dev)

Bottom line: with defaults alone, a QMK board that stays defer‑on‑press can wait ~5 ms before a website even receives a keydown, whereas an eager‑press configuration can report immediately.

Scan rate vs. USB/Bluetooth polling (and why transport still matters)

Two independent clocks gate when keystrokes reach your typing test:

Academic measurements show clearly how polling frames shape latency distributions; forcing 1000 Hz shifts keyboard latency down versus 125 Hz (8 ms frames). That frame time stacks on top of whatever delay your firmware introduces through scanning and debouncing. (epub.uni-regensburg.de)

How much can this skew your WPM and accuracy?

What common defaults actually are (QMK/ZMK quick audit)

These aren’t small implementation details—they directly influence when the very first “keydown” reaches your browser.

A proposal: a fairness harness + disclosure standard for typing sites

Here’s a pragmatic two‑part plan typing sites can adopt without forcing users to flash firmware.

1) Pre‑test “conditions check” (software‑only)

2) Optional “verified” mode (helper utility)

3) Display a Conditions Capsule with every score

Even without perfect introspection, this standard makes comparisons honest. Two 120 WPM scores mean different things if one was on Bluetooth with defer‑on‑press and the other on eager‑press USB.

Actionable tips for typists (aiming for apples‑to‑apples)

What we’ll adopt on our site

We’re not forcing anyone to flash firmware—just surfacing the hidden timing knobs that quietly move your WPM.

The takeaway

Debounce algorithms, scan periods, and host polling are invisible to most users, yet they change when each letter lands. QMK/ZMK defaults cluster around 5 ms windows; eager vs. defer flips whether you pay that cost up front on press; and transport can tack on anything from ~1 ms (USB 1 kHz) to ~10 ms (BT/125 Hz). Put those together, and you have a recipe for score drift. A lightweight harness and clear disclosure closes the loop—so your WPM reflects fingers, not firmware. (docs.qmk.fm)

The Debounce Dilemma: How Firmware Settings Quietly Skew WPM—and How to Standardize Your Tests - article illustration

Ready to improve your typing speed?

Start a Free Typing Test