How Is CPM Measured? — Measurement Disclosure
We don't hide our measurements. The formula and test suite are public, and you can verify them right on this page.
1. CPM Formula (Jamo Decomposition)
Korean syllables are converted to the actual Dubeolsik key input units (jamo). A syllable without a final consonant is 2 keystrokes (initial + vowel), one with a final consonant is 3 by default, and complex vowels and double final consonants add their constituent jamo count.
English letters, numbers, punctuation, and spaces each count as 1 keystroke.
- 가ㄱ + ㅏ2keys
- 값ㄱ + ㅏ + ㅂ + ㅅ4keys
- 관ㄱ + ㅗ + ㅏ + ㄴ4keys
- 안녕ㅇ+ㅏ+ㄴ · ㄴ+ㅕ+ㅇ6keys
- 닭ㄷ + ㅏ + ㄹ + ㄱ4keys
CPM = total keystrokes of correctly completed characters / elapsed time (min). Timer starts on first input; pause time is excluded. Accuracy = correct / confirmed characters x 100 (final confirmed basis).
2. Public Test Suite Runner
Run jamo conversion cases and IME composition edge cases instantly in this browser. No server needed -- verified right here on this page.
Public Test Suite Runner
- Jamo conversion…
- IME composition edge cases…
Running…
Data Contract
- Write source = client only (no server write path).
- Storage = this browser's localStorage only, 0 server transmissions.
- Only nickname & score are sent when registering for ranking (raw IP not stored).
- "Reset all records" deletes all keys starting with wg_typing_.
- Card PNGs are downloaded immediately and not stored.
3. Ad Placement Disclosure
Ads are placed only where they do not cover the play screen.
- Side rails (desktop, outside practice area) — 2 vertical ads
- Result modal bottom — 1 horizontal ad
- Hub & article mid-content — 1 in-article ad
- This disclosure page bottom — 1 in-article ad separated from content
No auto-ads. All slots have fixed heights, so there is no layout shift (CLS).
5. Copyright Policy
Literature included in Long Text and Copywork modes uses only works whose copyright has expired (70+ years after the author's death). Each entry notes the author, death year (or era), and source. Translations and authors with unclear or disputed death years are excluded. Expired works are included in full without restriction.
Measurement in more detail · A worked example and data handling
Working through a real sentence
The short-text proverb 가는 말이 고와야 오는 말이 곱다. is 19 characters including five spaces and the full stop, and 38 strokes once broken into letter parts. The open syllables 가, 이, 고, 야, 오 and 다 are 2 strokes each; 는, 말 and 곱 are 3; 와, with its compound vowel, is ㅇ+ㅗ+ㅏ for 3; and each space and the full stop are 1.
Finish it without a mistake in 9.5 seconds and you get 38 ÷ (9.5 ÷ 60) = 240 strokes per minute. Finish in the same time with 곱 left wrong and that character's 3 strokes drop out, leaving 35 strokes, or 221 per minute, with accuracy of 18 out of 19 characters, 95%.
Shift is not counted separately. ㄲ·ㄸ·ㅃ·ㅆ·ㅉ and ㅒ·ㅖ count as one key, one stroke, even with Shift held, and a tense final consonant, as in 밖, is also a single stroke.
When the clock runs and what gets judged
- The timer starts the moment you press the first letter part. Time spent reading the sentence with the page open is not included.
- In every mode except position drills you can pause with Esc; paused time is removed from the elapsed time, and input is ignored while paused.
- Measurement ends the moment the last character is committed, and later input is not counted. Anything typed beyond the length of the text is cut off before judging.
- Confirming Quit produces a result from the characters committed and the time elapsed up to that point.
- Characters still being composed are not judged. Seeing 오 briefly while typing 왜, or 달 while typing 닭, is not a typo; right or wrong is decided once, when the syllable is committed.
- Accuracy and gross errors are different. Accuracy uses your final input, so a corrected character counts as correct, while gross errors keep counting every character that was ever committed wrongly.
What data is kept, and where
- Practice records are stored in this browser's localStorage as a single bundle called wg_typing_store. It holds your 400 most recent sessions (date, mode, speed, accuracy), your best per mode, your best grade, the days you practised, typo counts per letter part, your total strokes, your 400 most recent transcriptions and the last nickname you used.
- Theme and sound settings live in separate keys with the same wg_typing_ prefix, so "Reset All Records" returns those settings to their defaults as well.
- Only when you register for the leaderboard are your nickname, speed, accuracy and a key identifying the text (including its date) sent to the server. The server adds the registration time and a SHA-256 hash of your IP address combined with a secret salt, and does not keep the original IP. The hash is used to block more than 10 registrations in 10 minutes from the same place.
- The server rejects speeds outside 0–1200, accuracy outside 0–100, and any run below 80% accuracy.
- "Export Records" downloads the bundle as typing_records.json, and "Import Records" replaces your current records entirely with the chosen file. The two are not merged, so export your current records before importing.
- Site-wide visit statistics and ad serving are separate from this measurement and are described on the privacy policy page.
Common questions about the measurement
- My speed here is higher (or lower) than on other typing sites.
- Services count in different units. QuizLab breaks each correctly typed syllable into the letter parts actually pressed. Counting one syllable as one stroke, counting Shift separately, or including wrong characters all give different numbers for the same skill. Comparisons are most meaningful within QuizLab, mode against mode.
- What does the public test suite check?
- The 110 letter-part cases check that each syllable breaks into the expected parts and counts as that many strokes. The 30 IME cases check that correct characters, committed characters, gross errors and completion match the expected values in situations such as half-composed syllables, typos fixed with backspace, and input mixing spaces and punctuation. The runner works once when the page opens and again each time you press Run Again, computing everything in this browser without asking the server, and the same cases are used in the automated tests during development.
Written and reviewed by the QuizLab team · Last updated 2026-10-10