The evaluated unit
Committed text is normalized to Unicode NFC. Line endings are normalized to LF. Intl.Segmenter separates the text into grapheme clusters for the selected language. Spaces, punctuation, case, and meaningful diacritics count. We do not remove accents, fold case, or replace distinct punctuation.
Committed insertion attempts
An evaluated attempt is a grapheme inserted or replaced after input-method composition finishes. Unchanged text is not scored again. Deletion does not add an attempt. Re-entering a deleted unit adds a new attempt. Partially composed IME candidates and blocked paste operations add no attempts.
Gross speed and CPM
Gross WPM = evaluated insertion attempts ÷ 5 ÷ elapsed minutes. CPM is evaluated insertion attempts divided by elapsed minutes. Five units form a normalized word; this is not a count of linguistic words. The timer uses monotonic elapsed time rather than counting interval callbacks.
Net speed and accuracy
Net WPM = max(0, gross WPM − uncorrected units ÷ elapsed minutes). Accuracy = correct insertion attempts ÷ evaluated insertion attempts × 100. Before any input, accuracy displays 100% and speed displays zero.
What corrections mean
Incorrect characters are the cumulative attempts that did not match their expected positions. Corrected errors count incorrect units removed or replaced before a passage advances; replacing one wrong unit with another records a correction and a new error. Uncorrected errors are incorrect units still retained, including completed passages. Correct characters are currently retained correct units across passages. Earlier attempts remain in the gross-speed and accuracy denominators.
A worked example
In 60 seconds, 300 insertion attempts include 294 correct attempts and six errors. Four errors are removed, leaving two. Gross WPM is 60; net WPM is 58; CPM is 300; accuracy is 98%. Corrected errors are four and uncorrected errors are two. Editing the same unchanged text never adds attempts.
Timing and passage changes
The first committed nonempty input starts the clock. Returning from a background tab recalculates remaining time before accepting more input. No input is accepted after the deadline. Reaching the end of a passage advances immediately and locks that passage; even a wrong final unit advances. The timer and accumulated scoring continue. Only practice mode permits an explicit pause.
Passage selection
The queue uses the selected language, difficulty, and topic. It broadens the topic first, then difficulty only when no exact match exists, with a visible notice. Within the filtered pool, each passage is used once before reshuffling; an immediate repeat is avoided where possible. Small topic pools therefore cycle during long tests.
Charts and consistency
Charts use genuine cumulative speed and accuracy samples collected roughly once per second. Consistency is max(0, 100 − standard deviation of sampled WPM ÷ mean sampled WPM × 100). It is descriptive, not a comparison to other people. Early samples can be volatile.
Further reading
MDN: Intl.Segmenter explains browser grapheme segmentation. MDN: compositionend explains committed input-method composition. Official examinations may apply different definitions and penalties.