Every metric itype reports is computed from your raw keystrokes. Here is exactly how each number is derived — no black boxes.
Words Per Minute. Only correctly typed characters count, divided by 5 (the standard average word length).
Math.round(((correctChars + correctSpaces) * perMinute) / 5)Gross speed before any accuracy penalty. Uses the same ÷5 word divisor but includes wrong characters too.
Math.round((totalChars * perMinute) / 5)Characters Per Minute. Raw correct-character count per minute — no word conversion (÷5).
Math.round(correctChars * perMinute)Total characters per minute regardless of correctness. Intentionally different from WPM Raw (no ÷5).
Math.round(totalChars * perMinute)Keystrokes Per Minute, net. Backspace and delete keystrokes are filtered out of the count.
Math.round(correctKeystrokes * perMinute)Gross keystrokes per minute. Includes correct, wrong, dead, and extra keys.
Math.round(totalKeystrokes * perMinute)Average time, in seconds, spent on each character over the whole test.
durationInSeconds / totalCharsThe share of characters typed correctly, expressed as a percentage.
(correctChars / (correctChars + wrongChars)) * 100How steady your speed was. Derived from the standard deviation of the per-second KPM samples recorded across the test — lower variation means higher consistency.
stdDev(perSecondKpm[])Some characters require modifier keys or multi-key sequences. To keep scoring fair across scripts, those count as multiple keystrokes. Every uppercase letter also costs +1 for the Shift key — so a Catalan à is 2 keystrokes, a French Œ is 5, and a single Chinese or Japanese character can count for up to 10.
| Language | Character | Keystrokes |
|---|---|---|
| Catalan | à | 2 |
| Catalan | À | 3 |
| French | â | 2 |
| French | Â | 3 |
| French | Œ | 5 (Alt+0140) |
| Chinese / Japanese | single char | up to 10 (5× multiplier) |
| German | ä, ö, ü | 2 |
| Czech, Danish, Dutch, Esperanto, Galician, Greek | accented chars | 2–3 (see engine source) |
| All languages | any uppercase | +1 (Shift key) |
Full weights are implemented in @typer/engine. When in doubt, refer to the engine source.