ITT (Indirect Touch Typing) - A spatial method for learning touch typing
Qwerty
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
│Esc│F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│ Del │
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
│ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │Bkspc│
│ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬────┤
│ Tab │ q │ w │ e │ r │ t │ y │ u │ i │ o │ p │ { │ } │ | │
│ │x11│x12│x13│x14│y11│y12│z11│z12│z13│z14│ [ │ ] │ \ │
├──────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴────┤
│ Caps │ a │ s │ d │ f │ g │ h │ j │ k │ l │ ; │ " │ Enter │
│ Lock │x21│x22│x23│x24│y21│y22│z21│z22│z23│z24│ ' │ │
├───────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───────┤
│ Shift │ z │ x │ c │ v │ b │ n │ m │ , │ . │ / │ Shift │
│ │x31│x32│x33│x34│y31│y32│z31│z32│z33│z34│ │
├────┬───┼───┼───┼───┴───┴───┴───┴──┬┴──┬┴───┼───┴┬────┬────┤
│Ctrl│Fn │Win│Alt│ Space │Alt│Ctrl│ ← │ ↑↓ │ → │
└────┴───┴───┴───┴──────────────────┴───┴────┴────┴────┴────┘
Dvorak
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
│Esc│F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│ Del │
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
│ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ { │ } │Bkspc│
│ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ [ │ ] │ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬────┤
│ Tab │ ' │ , │ . │ p │ y │ f │ g │ c │ r │ l │ ? │ + │ | │
│ │x11│x12│x13│x14│y11│y12│z11│z12│z13│z14│ / │ = │ \ │
├──────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴────┤
│ Caps │ a │ o │ e │ u │ i │ d │ h │ t │ n │ s │ _ │ Enter │
│ Lock │x21│x22│x23│x24│y21│y22│z21│z22│z23│z24│ - │ │
├───────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───────┤
│ Shift │ ; │ q │ j │ k │ x │ b │ m │ w │ v │ z │ Shift │
│ │x31│x32│x33│x34│y31│y32│z31│z32│z33│z34│ │
├────┬───┼───┼───┼───┴───┴───┴───┴──┬┴──┬┴───┼───┴┬────┬────┤
│Ctrl│Fn │Win│Alt│ Space │Alt│Ctrl│ ← │ ↑↓ │ → │
└────┴───┴───┴───┴──────────────────┴───┴────┴────┴────┴────┘
Ytsuken
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
│Esc│F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│ Del │
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
│ ~ │ ! │ " │ № │ ; │ % │ : │ ? │ * │ ( │ ) │ _ │ + │Bkspc│
│ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬────┤
│ Tab │ й │ ц │ у │ к │ е │ н │ г │ ш │ щ │ з │ х │ ъ │ / │
│ │l11│l12│l13│l14│c11│c12│r11│r12│r13│r14│ │ │ \ │
├──────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴────┤
│ Caps │ ф │ ы │ в │ а │ п │ р │ о │ л │ д │ ж │ э │ Enter │
│ Lock │l21│l22│l23│l24│c21│c22│r21│r22│r23│r24│ │ │
├───────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───────┤
│ Shift │ я │ ч │ с │ м │ и │ т │ ь │ б │ ю │ . │ Shift │
│ │l31│l32│l33│l34│c31│c32│r31│r32│r33│r34│ │
├────┬───┼───┼───┼───┴───┴───┴───┴──┬┴──┬┴───┼───┴┬────┬────┤
│Ctrl│Fn │Win│Alt│ Space │Alt│Ctrl│ ← │ ↑↓ │ → │
└────┴───┴───┴───┴──────────────────┴───┴────┴────┴────┴────┘
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
│Esc│F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│ Del │
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
│ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │- _│= +│Bkspc│
│ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │[ {│] }│ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬────┤
│ Tab │ q │ w │ e │ r │ t │ y │ u │ i │ o │ p │[ {│] }│ | │
│ │' "│, <│. >│ p │ y │ f │ g │ c │ r │ l │/ ?│= +│ \ │
├──────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴────┤
│ Caps │ a │ s │ d │ f │ g │ h │ j │ k │ l │; :│' "│ Enter │
│ Lock │ a │ o │ e │ u │ i │ d │ h │ t │ n │ s │- _│ │
├───────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───────┤
│ Shift │ z │ x │ c │ v │ b │ n │ m │, <│. >│/ ?│ Shift │
│ │; :│ q │ j │ k │ x │ b │ m │ w │ v │ z │ │
├────┬───┼───┼───┼───┴───┴───┴───┴──┬┴──┬┴───┼───┴┬────┬────┤
│Ctrl│Fn │Win│Alt│ Space │Alt│Ctrl│ ← │ ↑↓ │ → │
└────┴───┴───┴───┴──────────────────┴───┴────┴────┴────┴────┘
The keys A and M form a cognitive bridge between
QWERTY and Dvorak layouts. To mitigate cognitive load and
prevent muscle memory interference during layout switching,
ITT leverages these magic keys as stable anchor points.
They share the same physical position (masks x21 and z31)
across both layouts. This provides a consistent reference for
your spatial memory, making the transition between layouts
safer and more intuitive by preventing a complete perceptual
breakdown.
Core Concept: For each key group (defined by its mask and symbols), a primary universal association (abbr. assoc) is provided, along with a set of alternative associations for different contexts or preferences. The goal is to create a chain of associative links that together form a coherent mnemonic context.
<combo_id>:<mask chain><mask>(<key group>)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
- ...
- MNEMONIC CONTEXT:
<assoc chain>
Where
-
<combo_id>:combo_<zone><start_row>-<end_row><column> -
<mask>: A spatial key group identifier (e.g.,xij,yij) -
<key group>: The physical symbols on the key(s) for the layout(s) -
<mask chain>:<mask_1>→<mask_2>→ ... →<mask_n> -
<assoc chain>:<assoc_1>→<assoc_2>→ ... →<assoc_n> -
combo_x1-31
x11(Qsingle quote)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
x21(AA)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
x31(Zsemicolon)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
- MNEMONIC CONTEXT:
<assoc chain>
-
combo_x1-32
x12(Wcomma)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
x22(SO)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
x32(XQ)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
- MNEMONIC CONTEXT:
<assoc chain>
-
combo_x1-33
x13(Edot)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
x23(DE)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
x33(CJ)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
- MNEMONIC CONTEXT:
<assoc chain>
-
combo_x1-34
x14(RP)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
x24(FU)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
x34(VK)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
- MNEMONIC CONTEXT:
<assoc chain>
-
combo_y1-31
y11(TY)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
y21(GI)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
y31(BX)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
- MNEMONIC CONTEXT:
<assoc chain>
-
combo_y1-32
y12(YF)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
y22(HD)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
y32(NB)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
- MNEMONIC CONTEXT:
<assoc chain>
-
combo_z1-31
z11(UG)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
z21(JH)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
z31(MM)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
- MNEMONIC CONTEXT:
<assoc chain>
-
combo_z1-32
z12(IC)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
z22(KT)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
z32(commaW)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
- MNEMONIC CONTEXT:
<assoc chain>
-
combo_z1-33
z13(OR)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
z23(LN)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
z33(dotV)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
- MNEMONIC CONTEXT:
<assoc chain>
-
combo_z1-34
z14(PL)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
z24(semicolonS)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
z34(slashZ)- Primary:
<primary assoc> - Alternatives: [
<alternative assoc_1>, ...]
- Primary:
- MNEMONIC CONTEXT:
<assoc chain>
-
Multi-Row Patterns
Patterns that cover multiple rows (support all traversals):
full: The entire keyboard matrix.zone_x: Keys in the left zone (coordinatesx11tox34). E.g.,Q A Zcolumn.zone_y: Keys in the home/center zone (coordinatesy11toy32). E.g.,T G Bcolumn.zone_z: Keys in the right zone (coordinatesz11toz34). E.g.,P ; /column.zone_xy: Combined left and home zones (zone_x+zone_y).zone_xz: Combined left and right zones (zone_x+zone_z).zone_yz: Combined home and right zones (zone_y+zone_z).
-
Single-Row Patterns
Patterns for a single row (support only
lineartraversals):home_row: The home row keys (A S D F G H J K L ;for QWERTY).top_row: The top letter row (Q W E R T Y U I O P).bottom_row: The bottom letter row (Z X C V B N M , . /).number_row: The number row (1 2 3 4 5 6 7 8 9 0 - =).
-
Athematic Patterns
Patterns grouped by meaning, not location (support only the
randomtraversals):vowels: Vowel keys (A E I O U).consonants: Consonant keys (all letter keys exceptA E I O U).common_bigrams: Frequent letter pairs (e.g.,TH HE IN ER AN RE ES ON ST NT).common_trigrams: Frequent 3-letter sequences (e.g.,THE AND ING HER ERE ENT THA NTH WAS ETH).problematic_keys: A user-defined set of keys that require extra practice.
Naming Conventions
linear→lisnake→snspiral_in→si(Spiral In)spiral_out→so(Spiral Out)round→rd
For direction-based strategies (Linear):
<type>_<direction>
Where
<type>:li<direction>is a combination:lr_tb(left-right, top-bottom)lr_bt(left-right, bottom-top)rl_tb(right-left, top-bottom)rl_bt(right-left, bottom-top)tb_lr(top-bottom, left-right)tb_rl(top-bottom, right-left)bt_lr(bottom-top, left-right)bt_rl(bottom-top, right-left)
Example: li_lr_tb, li_tb_lr
For start-point-based strategies (Snake, Spiral, Round):
<type>_<direction>_<start>
Where
<type>:snsi,sord
<direction>:lr(left-right)rl(right-left)tb(top-bottom)bt(bottom-top)cw(clockwise)ccw(counter-clockwise)
<start>:tlm(top leftmost)trm(top rightmost)blm(bottom leftmost)brm(bottom rightmost)hlm(home leftmost)hrm(home rightmost)
For rd (round) traversals only, <start> can also be any specific key
(e.g., E for zone_x, O for zone_z) to define a custom starting point
on the perimeter.
Example: sn_tb_tlm, si_cw_trm, rd_cw_e, rd_ccw_o
-
Linear Traversals
Strategies that follow a predefined linear sequence:
-
li_lr_tb(Left-Right, Top-Bottom): Traverse each row left to right, move to next row top to bottom.Example (QWERTY, Multi-Row, full):
Q → ... → P → A → ... → ; → Z → ... → /Example (QWERTY, Single-Row, full):
A → S → D → F → G → H → J → K → L → ; -
li_lr_bt(Left-Right, Bottom-Top): Traverse each row left to right, move to next row bottom to top.Example (QWERTY, full):
Z → ... → / → A → ... → ; → Q → ... → P -
li_rl_tb(Right-Left, Top-Bottom): Traverse each row right to left, move to next row top to bottom.Example (QWERTY, Multi-Row, full):
P → ... → Q → ; → ... → A → / → ... → ZExample (QWERTY, Single-Row, full):
; → L → K → J → H → G → F → D → S → A -
li_rl_bt(Right-Left, Bottom-Top): Traverse each row right to left, move to next row bottom to top.Example (QWERTY, full):
/ → ... → Z → ; → ... → A → P → ... → Q -
li_tb_lr(Top-Bottom, Left-Right): Traverse each column top to bottom, move to next column left to right.Example (QWERTY, full):
Q → A → Z → W → S → X → ... → P → ; → / -
li_tb_rl(Top-Bottom, Right-Left): Traverse each column top to bottom, move to next column right to left.Example (QWERTY, full):
P → ; → / → O → L → . → ... → Q → A → Z -
li_bt_lr(Bottom-Top, Left-Right): Traverse each column bottom to top, move to next column left to right.Example (QWERTY, full):
Z → A → Q → X → S → W → ... → / → ; → P -
li_bt_rl(Bottom-Top, Right-Left): Traverse each column bottom to top, move to next column right to left.Example (QWERTY, full):
/ → ; → P → . → L → O → ... → Z → A → Q
Note: For Single-Row patterns, the
li_lr_tbandli_rl_tbtraversals are simplified to linear left-right and right-left movement (the_tbpart is ignored). -
-
Snake Traversals
Strategies that traverse keys in a snake (zigzag) pattern, row by row or column by column:
-
sn_tb_tlm(Snake, Top-Bottom, Top-Left): Snake top to bottom, starting from top-left.Example (QWERTY, full):
Q → ... → P → ; → ... → A → Z → ... → / -
sn_tb_trm(Snake, Top-Bottom, Top-Right): Snake top to bottom, starting from top-right.Example (QWERTY, full):
P → ... → Q → A → ... → ; → / → ... → Z -
sn_bt_blm(Snake, Bottom-Top, Bottom-Left): Snake bottom to top, starting from bottom-left.Example (QWERTY, full):
Z → ... → / → ; → ... → A → Q → ... → P -
sn_bt_brm(Snake, Bottom-Top, Bottom-Right): Snake bottom to top, starting from bottom-right.Example (QWERTY, full):
/ → ... → Z → A → ... → ; → P → ... → Q -
sn_lr_tlm(Snake, Left-Right, Top-Left): Snake left to right, starting from top-left.Example (QWERTY, full):
Q → A → Z → X → S → W → ... → / → ; → P -
sn_lr_blm(Snake, Left-Right, Bottom-Left): Snake left to right, starting from bottom-left.Example (QWERTY, full):
Z → A → Q → W → S → X → ... → P → ; → / -
sn_rl_trm(Snake, Right-Left, Top-Right): Snake right to left, starting from top-right.Example (QWERTY, full):
P → ; → / → . → L → O → ... → Z → A → Q -
sn_rl_brm(Snake, Right-Left, Bottom-Right): Snake right to left, starting from bottom-right.Example (QWERTY, full):
/ → ; → P → O → L → . → ... → Q → A → Z
-
-
Spiral Traversals
Strategies that traverse keys in a continuous spiral motion, inward or outward:
-
si_cw_tlm(Spiral In, Clockwise, Top-Left): Spiral inward clockwise, starting from top-left.Example (QWERTY, full):
Q → ... → P → ; → / → ... → Z → A → ... → L -
si_cw_brm(Spiral In, Clockwise, Bottom-Right): Spiral inward clockwise, starting from bottom-right.Example (QWERTY, full):
/ → ... → Z → A → Q → ... → P → ; → ... → S -
si_ccw_trm(Spiral In, Counter-Clockwise, Top-Right): Spiral inward counter-clockwise, starting from top-right.Example (QWERTY, full):
P → ... → Q → A → Z → ... → / → ; → ... → S -
si_ccw_blm(Spiral In, Counter-Clockwise, Bottom-Left): Spiral inward counter-clockwise, starting from bottom-left.Example (QWERTY, full):
Z → ... → / → ; → P → ... → Q → A → ... → L -
so_cw_hrm(Spiral Out, Clockwise, Home-Right): Spiral outward clockwise, starting from home-right.Example (QWERTY, full):
L → ... → A → Q → ... → P → ; → / → ... → Z -
so_ccw_hlm(Spiral Out, Counter-Clockwise, Home-Left): Spiral outward counter-clockwise, starting from home-left.Example (QWERTY, full):
S → ... → ; → P → ... → Q → A → Z → ... → /
-
-
Round Traversals
Strategies that traverse keys along the perimeter of a pattern in a round motion:
-
rd_cw_tlm(Round Clockwise, Top-Left): Traverse the perimeter clockwise, starting from the top-left key of the zone.Example (QWERTY, zone_x):
Q → ... → R → F → V → ... → Z → A → Q -
rd_ccw_o(Round Counter-Clockwise, Special KeyO): Traverse the perimeter counter-clockwise, starting from the special keyOof the zone.Example (QWERTY, zone_z):
O → I → U → J → M → ... → / → ; → P → O
Note: The combination of pattern types and start points allows for a wide variety of round traversals. For example, the perimeter of the
zone_xpattern includes keysq, w, e, r, f, v, c, x, z, a. This allows for 10 unique starting points, each with two directions (cw,ccw), resulting in 20 variations for just one zone. -
-
Random Traversals
random: Keys are selected randomly from the pattern. Repetition is possible.
itt --help
ITT - Indirect Touch Typing
Usage:
itt -k <name> -m <name> -p <name> -t <name> -c <sec>
itt --keyboard-layout <name> --mask <name> --pattern <name> \
--traversal <name> --countdown-timer <sec>
itt -h | --help
itt -v | --version
Arguments:
-k, --keyboard-layout <name> Keyboard layout (qwerty, dvorak, ytsuken, mix)
-m, --mask <name> Mask template (xyz, lcr) for target display
-p, --pattern <name> Practice pattern (full, home_row, vowels, etc.)
-t, --traversal <name> Traversal strategy (lr_tb, random, etc.)
-c, --countdown-timer <sec> Max time allowed to press each key (seconds)
-s, --stats Show statistics from the last session
-h, --help Show this help message
-v, --version Show version information
Examples:
itt -k mix -m xyz -p full -t random -c 10
itt -k ytsuken -m lcr -p home_row -t li_lr_tb -c 5
itt --stats[Qwerty/xyz] Pattern: home_row > Traversal: li_lr_tb
Target: x21 (A) > Input: ... > Time: 4.3s[Mix/xyz] Pattern: zone_x > Traversal: random
Target: [dv] x13 > Input: ... > Time: 7.0sitt was created by Denis Khorkin. It is licensed under the terms
of the BSD-3-Clause license.
- Denis Khorkin
