How Scores Are Calculated

Every metric itype reports is computed from your raw keystrokes. Here is exactly how each number is derived — no black boxes.

Metrics

WPM

Words Per Minute. Only correctly typed characters count, divided by 5 (the standard average word length).

Math.round(((correctChars + correctSpaces) * perMinute) / 5)

WPM Raw

Gross speed before any accuracy penalty. Uses the same ÷5 word divisor but includes wrong characters too.

Math.round((totalChars * perMinute) / 5)

CPM

Characters Per Minute. Raw correct-character count per minute — no word conversion (÷5).

Math.round(correctChars * perMinute)

CPM Raw

Total characters per minute regardless of correctness. Intentionally different from WPM Raw (no ÷5).

Math.round(totalChars * perMinute)

KPM

Keystrokes Per Minute, net. Backspace and delete keystrokes are filtered out of the count.

Math.round(correctKeystrokes * perMinute)

KPM Raw

Gross keystrokes per minute. Includes correct, wrong, dead, and extra keys.

Math.round(totalKeystrokes * perMinute)

Pace

Average time, in seconds, spent on each character over the whole test.

durationInSeconds / totalChars

Accuracy

The share of characters typed correctly, expressed as a percentage.

(correctChars / (correctChars + wrongChars)) * 100

Consistency

How 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[])

Keystroke Weights by Language

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.

LanguageCharacterKeystrokes
Catalanà2
CatalanÀ3
Frenchâ2
FrenchÂ3
FrenchŒ5 (Alt+0140)
Chinese / Japanesesingle charup to 10 (5× multiplier)
Germanä, ö, ü2
Czech, Danish, Dutch, Esperanto, Galician, Greekaccented chars2–3 (see engine source)
All languagesany uppercase+1 (Shift key)

Full weights are implemented in @typer/engine. When in doubt, refer to the engine source.