A Walkthrough of ThaiTyper's Practice Modes
ThaiTyper's main learning path is the Skills track: a sequence of focused skills you unlock in order, each building on the last. Around it sit the Words, Sentences, Daily, and Free modes for building fluency. The track is not a suggestion. It is twelve atoms in lib/skills/atoms.ts, each with named prerequisites, and SKILL_PASS at 90% accuracy before the next one opens. Here is what each mode is for and how to move through them without getting stuck on a failing atom.
The trainer maps KeyboardEvent.code through CHARS.kedmanee (or CHARS.pattachote if you flip the board). You can complete home-consonants with the OS still on ENG. That is a feature for week one and a trap the day you paste into Docs: the OS has to match. This walkthrough assumes Kedmanee, because the lesson prose names ด on F and ่ on J. If you type Pattachote, set the in-app board to Pattachote and ignore those names.
The Skills track
The Skills track starts with the home-row consonants and works outward — reaches to the other rows, the vowels, the pre-posed vowel order, the tone marks, the Shift layer, and finally whole syllable clusters. Each skill unlocks the next once you reach 90% accuracy (SKILL_PASS in lib/skills/mastery.ts). 85–89% is labelled almost, not a pass. 98% is mastered. The gate exists so you always practise at the edge of what you can already do rather than drowning in everything at once.
Unlock order is the declaration order of SKILL_ATOMS, which is also the topological order of prereqs. home-consonants has none. reaches and trailing-vowels both wait on home-consonants. stacked-vowels waits on trailing-vowels. preposed-order and tone-marks wait on stacked-vowels. tone-stacking waits on tone-marks. shift-layer waits on reaches. specials waits on stacked-vowels and shift-layer. syllable-clusters waits on preposed-order and tone-stacking. words waits on syllable-clusters. rare-clusters waits on reaches and syllable-clusters. You cannot skip to ไม่ on day one without stacking three atoms that are not automatic yet.
If a later drill feels chaotic, name the missing atom. กเ instead of เก is preposed-order. KeyH and KeyJ both hot is tone-marks. ด instead of โ is shift-layer (dropped Shift on F). ิ/ี swaps are stacked-vowels (B versus U). Running Sentences over those failures practises the mistake. Open the atom, slow the finger, pass 90, then go back.
Home consonants first
You start where your fingers rest. Learning the home-row consonants first gives you an anchor for everything that follows, and they are the fastest group to make automatic because your hands never leave them. On Kedmanee that anchor already includes ก on D, ด on F, ส on L, ว on semicolon, and ง on quote, so early progress feels real: กด, สด, ดาว, งาน are all in reach once า on K is allowed to join from trailing-vowels.
home-consonants drills the resting consonants and leaves G H J K (เ ้ ่ า) for later atoms. That split is deliberate. A beginner who types the whole home row at once mixes three keystroke orders in one session: consonants, a pre-posed vowel on G, and tone marks on H and J. Find the F bump (ด) and the J bump (่) by touch before the first character of every session, even review sessions. If those two are wrong, every other key is one column off.
The neighbour trap on this atom is ก on D versus ด on F. Both mid-class, both home, both frequent. A heatmap that lights KeyD and KeyF is this pair. Slow that left-hand pair until กด and ดก feel different, then let trailing-vowels add า on K. Do not add น on O until this row returns by itself. O is a reach; it belongs to the next atom.
- F bump ด, J bump ่, every session, before the first character.
- home-consonants is ฟหกดสวง. G H J K wait.
- KeyD+KeyF hot: ก versus ด. Slow that pair before adding า.
- กา ดา หา สา วา as the proof the row is a rest, not a hunt.
Vowels, the pre-posed order, and tone marks
Thai's pre-posed vowels (เ แ โ ใ ไ) are typed before the consonant they attach to, even though they are written to the left of it. The track drills that keystroke order in preposed-order, after stacked-vowels, because โ is Shift+F and the combining marks on B U Y N Digit6 should already be visits, not mysteries. เ is G, แ is C, ไ is W, ใ is period, โ is right Shift plus F. เก is G then D. กเ means you typed the consonant first; Backspace will not merge it.
trailing-vowels is า on K, ะ on T, ำ on E — the three that follow the consonant on the line. stacked-vowels is ิ ี ึ ื ั ุ ู. tone-marks is ่ on J and ้ on H. tone-stacking adds ๊ on Shift+U and ๋ on Shift+J. All four marks are the right index. The lesson for ่ ้ is not “tones.” It is J versus H, returning to the J bump after every ้. ข้าว is minus, H, K, semicolon. ขาว is the same without H.
specials (ำ ั ์ ํ) sits later because ์ is Shift+N and ํ is Shift+Y. ำ is also in trailing-vowels as E; meeting it twice is intentional. If you assemble ำ from ะ plus ม, you spelled a different syllable. The vowel guide in this library names the keystroke order in one place; this walkthrough’s job is to say which atom owns which piece so you stop running mixed text over a hole.
- เก = G D. กเ means consonant first. Open preposed-order.
- ไม่ = W comma J. ใจ = period Digit0. ไ versus ใ is spelling plus keys.
- ่ J, ้ H, ๊ Shift+U, ๋ Shift+J. One finger. tone-marks then tone-stacking.
- ำ is E. If you built it from ะ+ม, that is the wrong syllable.
The Shift layer
The rarer tone marks and the less frequent consonants live on the Shift layer. It is the skill most people are tempted to skip — don't. Drilling it directly is far easier than meeting โ, ๊, ฎ, ศ, and the Thai digits cold inside real words later, and you build the opposite-hand Shift habit while the keys are still isolated. โ is right Shift plus F; the base of that key is ด. ๊ is left Shift plus U; the base is ี. A dropped Shift is a named wrong letter, not a mystery.
shift-layer waits on reaches, not on tones. You can be in the middle of tone-marks and already have Shift unlocked if you passed the top and bottom rows. Use that. Ten โ, ten ็ (Shift+H, the shortener in เด็ก, not a tone), ten ๐ (Shift+Q). Same-hand Shift is the mistakes-guide failure: left Shift plus F is how โ never appears. Park the left pinky on A (ฟ) when the letter is on the left hand’s neighbour, and use the right Shift.
Syllable clusters
The later skills assemble whole syllable clusters — consonant, vowel, and tone together in the correct keystroke order. syllable-clusters waits on preposed-order and tone-stacking, so แก้ว (แ C, ก D, ้ H, ว semicolon) should not be your first task. When it is automatic, isolated แ and isolated ้ were finished earlier. words waits on that atom. rare-clusters (ฎ ฏ ฐ ฆ ฌ and the Backslash pair ฃ ฅ) waits on reaches and syllable-clusters so you are not hunting Shift+E for ฎ before ก on D is a rest.
lib/typing/clusters.ts is what the prompt uses to box a syllable: pre-posed vowel swallows the next base, combining marks stack, trailing ะ า ำ follow. Backspace deletes a code point from the end, not “the mark you are looking at.” If cluster drills feel like the engine is deleting the wrong piece, that is this rule, and the input-order article in the library explains the editing side. The skill track’s job is to make the emit order automatic so you stop thinking about it mid-word.
The twelve atoms, in order
Declaration order from SKILL_ATOMS, with the Kedmanee keys that make each one fail in isolation. This is the curriculum. Modes other than Skills do not teach it; they spend it.
- home-consonants: ฟหกดสวง on A S D F L semicolon quote. F bump ด, J bump is ่ but ่ waits.
- reaches: น on O, ข on minus, ป on X, ท on M, ย on P, and the rest of the base consonants off home.
- trailing-vowels: า K, ะ T, ำ E. stacked-vowels: ิ B, ี U, ั Y, ุ Digit6, ื N, ึ Digit7.
- preposed-order: เ G, แ C, ไ W, ใ period, โ Shift+F. tone-marks: ่ J, ้ H. tone-stacking: ๊ Shift+U, ๋ Shift+J.
- shift-layer, then specials (์ Shift+N, ํ Shift+Y). syllable-clusters, words, rare-clusters.
Pass means 90 on that atom, not a high WPM on mixed sentences. almost (85–89) is a stop sign. If you bounce between almost and 91, the neighbour pair inside the atom is still live — ก/ด, ่/้, ิ/ี. Isolate it for a minute, then rerun the atom. Mastered at 98 is optional polish; it is not the unlock.
The Learn hub lessons (content/learn/lessons.ts) are one page per atom, slug equal to skillId. They name the same keys. If the lesson says ด on F and your board is Pattachote, the lesson is describing Kedmanee. The engine will still remap; the prose will not. That is documented in the kedmanee-vs-pattachote guide. Stay on one layout.
The heatmap, hints, and finger guide
While you type, the on-screen keyboard glows the next key, the finger guide colours each zone from FINGER_BY_CODE, and an error heatmap records which keys you miss most. Together they turn vague struggle into a specific to-do list: the heatmap shows you the three keys worth a minute of slow, deliberate drilling before your next run. Lean on the hints early, then turn them off to test what has actually stuck.
Read the heatmap as a finger, then as an atom. KeyO hot is น, right ring, reaches. KeyMinus hot is ข, right pinky, reaches. KeyH+KeyJ hot is ่/้, tone-marks. KeyD+KeyF hot is ก/ด, home-consonants. Digit6 hot is ุ, stacked-vowels, or ู if you are missing Shift. Quote hot is ง, still the home-consonants pinky. A stripe of one colour is one finger’s column, not five unrelated letters.
The glow is a substitute for looking down. If you still peek, you are usually hunting O, minus, or X. Drill that reach as press-and-return ten times, then put the word back. Caps Lock must be off; a look-down that also hits Caps Lock wrecks Shift-layer letters for the rest of the line. Turn the finger-guide colours off after you pass an atom, and back on when that zone goes dark in a mixed mode.
- Glow on for new atoms. Off for a pass check.
- Heatmap top three keys: one minute each, reach and return, before mixed text.
- KeyH+KeyJ → tone-marks, not “more sentences.”
- If D types ง, stop. That is Pattachote in the OS, not a heatmap problem.
Choosing a mode
Use the Skills track to learn the keys. Words is for accuracy on real vocabulary after syllable-clusters has passed. Sentences trains the flow of connected text. The Daily passage is a fresh piece of real Thai each day, date-seeded from the sentence pool — the same pool the /challenge page must build identically, because the daily pick is seeded off the pool’s contents and order. Free type is a low-pressure sandbox. Reading mode is a long passage, not a substitute for the atoms.
Do not use Daily or Sentences as a speed hack while an atom is in the almost band. Those modes mix pre-posed vowels, tones, and Shift digits on one line, so you cannot tell which rule produced the Backspace. A 40 wpm sentence run at 78% is slower practice than a 15 wpm tone-marks drill at 93%. Clear 90 on the atom the heatmap names, then go back to sentences and watch those keys stop costing a delete.
Words before Sentences. A word is one cluster chain; a sentence is a handoff problem. If การ is clean and จะไม่ is not, the missing piece is ไ on W plus ่ on J in sequence, which is preposed-order plus tone-marks, not “I need more sentences.” Free type is for เด็กๆ (then ๆ on Q) and for whatever the heatmap named, without a timer. It is not a curriculum.
- Skills until the current atom is a pass, not almost.
- Two minutes on the heatmap’s hottest key, as a round trip.
- Words once syllable-clusters has passed.
- Sentences and Daily after Words is no longer a pile of Backspaces.
- Free type for ๆ, ฿, and the one reach you came to practise.
Watching the curve bend
Once the keys feel natural, your progress, heatmap, and best speeds are saved to your account, so you can see the curve bend upward over weeks instead of guessing. That long view is what keeps practice motivating after the fast early gains level off. Guest progress in localStorage migrates into the account on first sign-in; do not grind a second heatmap on a new login thinking the first one vanished. Sign in before you care about the curve.
What to watch is not peak WPM. Watch the almost band disappearing from the atoms you have already opened, and watch KeyO and KeyMinus cooling. น and ข are Kedmanee’s famous reaches; they stay hot if every session is new content. A twelve-minute shape that works: two minutes home row (กา ดา หา), two minutes ่ ้, two minutes the current atom, two minutes the hottest heatmap key, four minutes Words or the Daily if clusters have passed. Miss a day: repeat yesterday’s atom at the same length. Do not double tomorrow.
The Daily passage is where the content pipeline shows up: the sentence pool is the thin one, grown on purpose, and it is what the trainer randomizes. You do not need to think about that to practise. You do need to treat Daily as connected Thai, not as a replacement for home-consonants. If the Daily wrecks your accuracy, the missing atom is still on the Skills track. Open it. The curve will bend when ก stays on D and ่ stays on J without a glance, including on the day the passage is long.
- Sign in if you want the curve. Guest heatmaps do not survive a device switch until they migrate.
- Track almost versus pass per atom, not a single WPM number.
- Daily is a reward after clusters, not a shortcut around them.
- Four-key test whenever accuracy falls overnight: D ก, F ด, J ่, G เ.
Related guides

A practical guide to understanding why near-identical Thai words can feel very different on the Kedmanee keyboard. Learn how keystroke count, hand alternation, row jumps, and pre-posed-vowel order affect typing difficulty.

The habits that hold Thai typists back — looking down, chasing speed, the wrong vowel order, mixing up ่ and ้ — with a practical fix for each.

A step-by-step roadmap for learning to touch-type Thai — from the home row to full sentences — with a sample practice week and the metrics that actually matter.