65 / 33 / 2
English, French, Darija: how the corpus was weighted.
The Walid letters, ten ZMK layers, a trainer for my weak keys.
The method is five steps down.
65 / 33 / 2
English, French, Darija: how the corpus was weighted.
wleftarightlleftirightdleft
Walid’s Annealed Layout with International Dead-keys. The five keys sit dark on the board above, and every letter changes hand.
| Taps | e | a | u | i | o | c |
|---|---|---|---|---|---|---|
| 1 | é | à | ù | î | ô | ç |
| 2 | è | â | û | ï | ||
| 3 | ê | ü | ||||
| 4 | ë |
One Ctrl tap per accent, then the letter. The OS runs US International.
Five steps, every number from the scripts in the repository.
Every message I ever typed to an AI: the Claude Code history and the claude.ai export. Pasted text, code, URLs and logs thrown out, duplicates removed, each message tagged by its stop words. 1,677,299 characters remained.
I weighted French up to a third of the mix, because my work writing is French and none of it was in the sample.
Measured
Weighted
EnglishFrenchDarija
e13.0%t9.1%a8.0%o7.3%i7.0%n6.5%s6.5%r5.5%
The eight letters I type most, and their share of every keystroke.
The geometry is beekeeb’s own firmware file: the column stagger, the finger that owns each column, each finger’s home key. A key costs one plus its distance from home, times 1.6 under a pinky, 1.2 under a ring finger, 1.3 on the inner index columns.
Home keys cost 1. The far corners cost 3.2.
The cost of each of the thirty core keys. Darker is dearer.
Lower is better: each term is a share of my letter pairs or triples, times a weight I picked. Other weights give another board; a first run without finger caps put 16% on each ring finger. That caveat is the method.
| Term | Counts | Weight | Points |
|---|---|---|---|
| Same-finger bigrams | one finger, twice | 3.0 | 4.18 |
| Same-finger skipgrams | one letter between | 0.8 | 5.28 |
| Scissors | two rows apart | 1.5 | 0.66 |
| Lateral stretches | inner column | 1.0 | 0.51 |
| Redirects | one hand, a turn | 1.2 + 2.0 | 3.76 |
| Rolls, in and out | credited | −0.12, −0.05 | −2.47 |
| Travel | cost map, weighted | 8.0 | 13.02 |
| Load | pinky, balance, caps | 1.0, 0.5, 1.5 | 0.61 |
| Score | 25.54 |
Points = share × weight × 100: 1.39% on one finger × 3 = 4.18. They add up to the score.
Start from a random board. Swap two keys, score again. Better: keep it. Worse: keep it with a probability that falls as the run cools.
Below, seed 5’s run, 132 down to 25.5. Early, one swap in six is kept although it hurts; late, none. Eight runs scored 480,000 of the 30! boards, 2.65 × 1032.
current boardbest so far
Three seeds tied within five thousandths. Seed 1 mirrors seed 5, so the vowels went right, the convention.
Seed 0 scores 0.005 better but has r on the home key where seed 5 has n, typed a fifth more often.
Graphite was the recommendation. I wanted mine.
Left hand then right; orange, the keys that differ from the pick or, when nearer, from its mirror.
| Seed 0 | Seed 5 | |
|---|---|---|
| Score | 25.533 | 25.538 |
| Same-finger bigrams | 1.39% | 1.35% |
| Home row | 58.3% | 58.7% |
| Travel | 1.636 | 1.627 |
The corpus stays private, the scripts do not. The final run:
TAG=_v2 python3 optimize2.py free 8 60000
Same corpus, same analyzer; lower is better, except home row.
Colemak-DH wins the home row and the travel, then loses everything two letters long: half again as many same-finger bigrams, five times the lateral stretches, twice the redirects. The score is the step 3 formula, the search’s own compass, so it favours Walid by construction; the shares are the fair test.
| Layout | Same-finger bigrams | Skipgrams | Redirects | Lateral stretches | Scissors | Home row | Travel | Score |
|---|---|---|---|---|---|---|---|---|
| QWERTY | 6.63% | 7.82% | 6.93% | 7.21% | 5.38% | 31.0% | 2.129 | 79.45 |
| Colemak-DH | 2.14% | 6.42% | 6.39% | 2.54% | 0.18% | 68.0% | 1.574 | 42.53 |
| Graphite | 1.73% | 4.18% | 2.06% | 1.31% | 1.00% | 62.5% | 1.632 | 40.46 |
| Ergo-L | 1.33% | 5.89% | 6.30% | 3.32% | 0.65% | 65.4% | 1.637 | 43.63 |
| Walid | 1.35% | 4.58% | 2.80% | 0.50% | 0.43% | 58.7% | 1.627 | 25.54 |
A semicolon or slash key is counted as the punctuation it replaces.
ZMK v0.3, built with Nix.
Each key holds a confidence against the target; the lesson opens when its new keys turn green.
Letter groups from my own word lists and my slow pairs return until they stop being slow.
A serial feed from the left half lights the real key; progress follows a secret code between machines.
131 texts, 2 h 32 m, 30 wpm at best, 4 keys of 26 at target. Each dot a text, the line the last ten.