┌─────────────────────┐
  │                     │
  │   C  O  D  A        │
  │                     │
  │   22 keys.          │
  │   The distilled     │
  │   form.             │
  └─────────────────────┘

CODA

22 keys. The distilled form of Cadenza.
v0.1 · Concept Colemak-DH 9 layers 39 Tap Dances QMK keymap.c SFB ~0.90% No pinky · No inner column
Coda (n.): the concluding passage — a concentrated, essential statement that brings everything together.

Coda is a 22-key split keyboard layout and the minimal sibling of Cadenza. Designed for German + English prose, shell/code work, and tiling window manager use — without pinkies, without an inner column, and with an estimated SFB rate lower than Colemak-DH.

Contents

  1. Physical Layout
  2. Design Principles
  3. Letter Placement
  4. Ergonomic Metrics
  5. Comparison
  6. Layer Architecture
  7. Layer Reference
  8. Tap Dance Reference (39)
  9. Macro Reference (16)
  10. Combo Reference (9)
  11. Hardware & Firmware
  12. Known Limitations
  13. Roadmap

Physical Layout

  Left                    Right
 ┌───┬───┬───┐            ┌───┬───┬───┐
 │ L │ G │ D │            │ H │ F │ C │   ← top row
 ├───┼───┼───┤            ├───┼───┼───┤
 │ R │ S │ T │            │ N │ E │ I │   ← home row
 ├───┼───┼───┤            ├───┼───┼───┤
 │ B │ W │ M │            │ Z │ K │ U │   ← bottom row
 └───┴───┴───┘            └───┴───┴───┘
         ┌───┬───┐    ┌───┬───┐
         │ A │Spc│    │ O │Ent│           ← thumbs
         └───┴───┘    └───┴───┘

 Fingers per half (outer→inner): Ring · Middle · Index   (no Pinky, no Inner column)
 A, Spc, O, Ent = letters (tap) + layer access (hold)

Design Principles

  1. No pinky column — by design, not constraint. The pinky is the weakest finger and primary RSI source. Removing it forces better decisions everywhere else.
  2. No inner column. Lateral index finger movement destabilises hand position. Enforced physically on Coda.
  3. Strongest finger earns highest priority. Index > Middle > Ring within every row and every layer.
  4. A and O on thumbs. These two (7.4% and 5.0%) were on pinkies in Colemak-DH. Thumbs give the highest-frequency non-home letters to the strongest fingers.
  5. Colemak-DH inner home row preserved. T·S·R / N·E·I — identical to Cadenza. Zero muscle-memory penalty.
  6. Frequency × Ergonomic quality = access key rank. A thumb earns Navigation (most-used non-alpha function) because it is the best thumb position.
  7. Bilateral access for layer triggers and Meta. Code (G/F), WM (M/U), Fn (D/C), and Meta (L/H) are each reachable from either hand. Holding the right-hand key frees the left for numpad-style input.
  8. NEIO = ← ↓ ↑ → everywhere. Arrows, WM focus switching, window movement — same spatial convention throughout.
  9. Combos replace dedicated keys. Space+Enter=Backspace. N+E=↑. Z+K=PgUp. Physical positions freed for valuable use.
  10. QMK keymap.c — not Vial. Layer-specific combos, unlimited macros, full C programmability.

Letter Placement

Letters placed by combined German + English frequency, assigned to fingers in strength order, avoiding same-column bigrams.

RankLetterFreqPositionRationale
1E15.0%R home middleHighest frequency → best position. ER cross-hand ✓
2N8.0%R home indexStrongest right finger. EN inward roll ✓
3T7.5%L home indexStrongest left finger. TH cross-hand ✓
4A7.4%L thumbThumb solves pinky-removal gap. AN cross ✓
5I7.3%R home ringColemak home ✓. IN inward roll ✓. IE inward roll ✓
6S6.8%L home middleST inward roll ✓. Colemak home ✓
7R6.5%L home ringER cross-hand ✓. Colemak home ✓
8H5.5%R top indexTH cross-hand ✓. CH = C→H right inward roll ✓✓
9O5.0%R thumbThumb solves pinky-removal gap
10D4.7%L top indexDE cross-hand ✓ (German der/die/das)
11L3.7%L top ringEL cross-hand ✓. Hold=Meta
12U3.6%R bot ringAvoids EU same-finger (E=R-mid) and UN same-finger (N=R-idx)
13C2.8%R top ringCH inward roll ✓✓ (German most common digraph 2.4%)
14G2.5%L top middleIG cross-hand ✓ (German -ig: richtig, wenig, möglich)
15–20M W F B Z K1.0–2.5%Bottom rowsLess frequent — acceptable positions. Z on base for German "zu"
Overflow: P(0.8%) · V(0.7%) · Y(0.4%) · J(0.2%) · X(0.1%) · Q(0.05%) — combined ~3% — via Hold A+Ent

Ergonomic Metrics

MetricValueNotes
SFB rate~0.90%Estimated from column-pair bigram analysis
Home row usage (fingers)51.1%T+S+R+N+E+I frequencies
Home row usage (+ thumbs A/O)63.5%Effective home-accessible character percentage
Pinky load0%No pinky column — physically zero
Lateral index stretchZeroNo inner column — physically impossible
Hand balance~46% L / 54% RRight-heavy due to E (15%) on right middle
Heaviest single fingerR-Middle 17.9%E(15%)+F(1.9%)+K(1.0%) — all on home row (best position)

Comparison

MetricQWERTZDvorakColemak-DHCoda
SFB rate6.31%2.62%1.28%~0.90%
Home row usage34%71%68%64%
Pinky load~14%~7%~6%0%
Lateral stretchVery highModerateLowZero
German CH bigramSame-fingerCross-handCross-handInward roll
German IG bigramSame-handVariesVariesCross-hand
German EI bigramSame-handSame-handSame-handAdjacent outward roll
Hardware availabilityAnyAnyAny/remapCustom 22-key PCB
Learning curveNoneVery highHighExtreme

QWERTZ, Dvorak, Colemak-DH SFB values: documented (carpalx / Patrick Steele corpus). Coda: estimated from column-pair analysis.

vs. Cadenza

DimensionCadenza v1.0.0Coda v0.1
Keys3622
Pinky load~5%0%
Base-layer letters2620 (+6 overflow)
Layers139
Tap dances4334
Combos09 (incl. layer-specific)
FirmwareVial / QMKQMK keymap.c only
HardwareCorne Choc — availableCustom PCB — concept
StatusDaily driver · v1.0.0 stableConcept · v0.1

Layer Architecture

LayerNameAccessPurpose
L0BaseAlways active20 letters + HRM
L1-OverOverflow / InternationalHold SpcP V Y J X Q · ä ö ü · ß €
L2-SymSymbolsHold EntSymbols · Punctuation · Brackets
L3-NumNumbersHold ONumpad 1–9 · Operators
L4-NavNavigationHold AArrows · Word nav · Modifiers
L5-MouseMouseTap-then-Hold APointer · Scroll · Buttons
L6-FnFunction + MediaHold D or CF1–F12 · Media
L7-CodeCode / CLIHold G or FShell operators · Path nav · Code macros
L8-WMTiling WMHold M or UWorkspaces 1–10 · Focus · Window movement

Layer Reference

Alpha
HRM · Modifier
Layer access
Navigation
Symbol
Number
Media
Macro · Shell
Tap Dance action
F-key
WM Workspace
WM Window
Combo key
International
Inactive
L0BaseAlways active — HRM via Tap Dance

Colemak-DH inner home row preserved unchanged (R·S·T / N·E·I). A and Ent on thumbs solve the pinky-removal gap. Layer access distributed bilaterally: D/C (top corners — left index, right ring) carry Fn, G/F (top middle column) carry Code, M/U (bottom corners — left index, right ring) carry WM. L (left ring top) and H (right index top) carry Meta as a tap/hold modifier — same HRM pattern as the home row.

LMeta
GCLI
DFn
RAlt
SCtrl
TShift
B
W
MWM
Atap · Nav
Spctap · Ovfl
HMeta
FCLI
CFn
NShift
ECtrl
IAltGr
Z
K
UWM
Otap · Num
Enttap · Sym
L1-OverOverflow / InternationalHold Spc

P/V/Y on left home (strongest fingers, most frequent overflow letters). J/X/Q on left top. Umlauts placed at their base-letter positions for muscle-memory consistency: ä on A, ö on O, ü on U. ß on Z (AltGr+S) · € on K (AltGr+5).

QL
XG
JD
YR
VS
PT
B
W
M
äA
★ heldSpc
H
F
C
N
E
I
ßZ·AltGr
K·AltGr
üU
öO
EntEnt
L2-SymSymbolsHold Ent

Frequency+Strength: = (rank 1) on T (strongest left finger). . , : on right home — most common prose punctuation. Bracket pairs as Tap Dance: tap=open, hold=close. ( ) on H · [ ] on F · < > on C · { } on U. *|@ on Spc (TD_STAR_AT). L falls through to base (Meta hold).

MetaL
#G
!D
/R
-S
=T·rank1
\B
|W
&M
_A·rank4
*|@Spc·TD
(|)H·TD
[|]F·TD
<|>C·TD
.N
,E
:I
?Z
`K·TD
{|}U·TD
%O
★ heldEnt
L3-NumNumbersHold O

Numpad layout on left hand — ring=1/4/7 · middle=2/5/8 · index=3/6/9. Same spatial positions as L8-WM workspace keys. 0 on A-thumb. € via AltGr+5 (direct keycode, same as Cadenza).

7L·rng
8G·mid
9D·idx
4R·rng
5S·mid
6T·idx
1B·rng
2W·mid
3M·idx
0A-thumb
.Spc·dec
.H·idx
/F·mid
=C·rng
(N·idx
,E·mid
*I·rng
-Z·idx
K·AltGr
U·rng
★ heldO
EntEnt
L4-NavNavigationHold A

All 4 arrows on right side: ← ↓ → on home row (N·E·I), ↑ on F (above ↓ for inverted-T cluster). Home/PgDn/End on right bottom. PgUp via Z+K combo. Word-skip on C (Ctrl+←) and H. Del on Enter thumb. Modifiers on left for Shift+arrows (selection).

CapsL
G
MetaD
AltR
CtrlS
ShiftT
PasteB
CopyW
UndoM
★ heldA
CutSpc
Ctrl+←H·word
F
Ctrl+←C·word
N·idx
E·mid
I·rng
HomeZ·idx
PgDnK·mid
EndU·rng
Scrl↑O
DelEnt
L5-MouseMouseTap-then-Hold A

Tap A, then hold — different tap-dance state from plain Hold-A (Nav). Mouse movement on right (N=← E=↓ I=→ H=↑). Scroll on right middle column. Modifiers on left for Shift-click, Ctrl-click. Buttons on right thumbs.

L
G
MetaD
AltR
CtrlS
ShiftT
B
W
M
★ heldA
SpcSpc
M↑H
Scrl↑F
C
M←N
M↓E
M→I
Z
Scrl↓K
U
Btn1O
Btn2Ent
L6-FnFunction + MediaHold D or C (bilateral)

F1–F9 on left in numpad positions (same spatial shape as L3-Num — muscle memory transfers). F10–F12 on right home. Media controls on right. Hold C (right) frees the left for the F-key numpad. ⚠ When holding D (left, index top), F9 is occupied by the trigger — use the right-hand C-hold for full F-key numpad access.

F7L
F8G
★ heldD
F4R
F5S
F6T
F1B
F2W
F3M
Vol-A
Vol+Spc
PrevH
PrtScF
★ heldC
F10N
F11E
F12I
MuteZ
PlayK
StopU
OO
EntEnt
L7-CodeCode / CLIHold G or F (bilateral)

Bilateral middle-finger top access — hold the right G/F to free the left for code typing, or vice versa. Left home row: T= |  · S=&& · R=||. Right home: N=TD(/ ~/hold ../dbl) · E=TD($()/${}) · I=TD(!= ==) · H=TD(=> ->). $? and 2>&1 on right bottom. Mirrors Cadenza L9.

L
★ heldG
D
||R·M16
&&S·M15
| T·M13
B
W
M
A
SpcSpc
=>|->H·TD
★ heldF
C
/|~/N·TD
$()|${}E·TD
!=|==I·TD
$?Z·M14
2>&1K·M12
U
OO
EntEnt
L8-WMTiling WM — WS 1–10Hold M or U (bilateral)

Numpad positions: ring=WS1/4/7 · mid=WS2/5/8 · idx=WS3/6/9 · A-thumb=WS10. Tap=⊞+N (go) · Hold=⊞⇧+N (move window). Hold U (right) frees the left hand for the workspace numpad. ⚠ When holding M (left, index bot), WS3 is occupied by the trigger — use the right-hand U-hold for full numpad access.

WS7L·TD
WS8G·TD
WS9D·TD
WS4R·TD
WS5S·TD
WS6T·TD
WS1B·TD
WS2W·TD
★ heldM
WS10A·TD
SpcSpc
⊞+→H·focus
FullF·⊞F
FloatC·⊞Spc
⊞+←N·focus
⊞+↓E·focus
⊞+↑I·focus
⊞⇧+←Z·win
⊞⇧+↓K·win
★ heldU
OO
KillEnt·⊞⇧Q

Tap Dance Reference

39 tap dances. QMK keymap.c — no slot limit. Tipping terms: index/middle = 200 ms · ring = 250 ms.

Thumb Layer Access (4)
TDKeyTapHoldTap-then-Holdms
TD_AA (L thumb · below B)aMO(Nav)MO(Mouse)200
TD_SPCSpace (L thumb · in gap)SpaceMO(Overflow)200
TD_OO (R thumb · in gap)oMO(Num)200
TD_ENTEnter (R thumb · below Z)EnterMO(Sym)200
Bilateral Finger Layer Access (6)
TDKeyTapHoldms
TD_DD (L idx top)dMO(Fn)200
TD_CC (R rng top)cMO(Fn)250
TD_GG (L mid top)gMO(Code)200
TD_FF (R mid top)fMO(Code)200
TD_MM (L idx bot)mMO(WM)200
TD_UU (R rng bot)uMO(WM)250
Meta Modifier (2)
TDKeyTapHoldms
TD_LL (L rng top)lKC_LGUI · Meta250
TD_HH (R idx top)hKC_LGUI · Meta200
Home Row Mods / HRM (6)
TDKeyTapHoldms
TD_TTtShift200
TD_SSsCtrl200
TD_RRrAlt250
TD_NNnShift200
TD_EEeCtrl200
TD_IIiAltGr250
Symbol Pairs — Sym Layer (7)
TDTapHoldDoubleUsage
TD_PAREN()Sym layer H
TD_SQBR[]Sym layer F
TD_CURL{}Sym layer U
TD_ANGLE<>Sym layer C
TD_STAR_AT*@Sym layer Spc
TD_QUOTE" dead key" literal (M9)German umlauts via dead key + vowel
TD_BTICK` dead key` literal (M10)``` (M11)Sym layer K
Code Actions — Code Layer (4)
TDTapHoldDoubleKey / Layer
TD_SLASH/~/ (M1)../ (M2)Code N — path navigation
TD_EXP$() + ← (M3)${} + ← (M4)Code E — shell expansion, cursor inside
TD_CMP!= (M5)== (M6)Code I — comparison operators
TD_ARR=> (M7)-> (M8)Code H — arrow operators
Workspace Tap/Hold — WM Layer (10)
TDTapHoldKey position
TD_WS1⊞+1 (go to WS1)⊞⇧+1 (move window to WS1)B · L-bot-ring
TD_WS2⊞+2⊞⇧+2W · L-bot-mid
TD_WS3⊞+3⊞⇧+3M · L-bot-idx
TD_WS4⊞+4⊞⇧+4R · L-hom-ring
TD_WS5⊞+5⊞⇧+5S · L-hom-mid
TD_WS6⊞+6⊞⇧+6T · L-hom-idx
TD_WS7⊞+7⊞⇧+7L · L-top-ring
TD_WS8⊞+8⊞⇧+8G · L-top-mid
TD_WS9⊞+9⊞⇧+9D · L-top-idx
TD_WS10⊞+0⊞⇧+0A · L-thumb

Numpad positions: ring=WS1/4/7 · middle=WS2/5/8 · index=WS3/6/9 (same spatial memory as L3-Num)

Macro Reference

16 macros. In QMK keymap.c these are C functions with no slot limit.

IDOutputFunctionTriggered by
M1~/Home directoryTD_SLASH hold
M2../Parent directoryTD_SLASH double
M3$() + ←Shell expansion, cursor insideTD_EXP tap
M4${} + ←Variable expansion, cursor insideTD_EXP hold
M5!=Not equalTD_CMP tap
M6==EqualTD_CMP hold
M7=>Fat arrow (Python, JS, Rust)TD_ARR tap
M8->Thin arrow / pointerTD_ARR hold
M9" + SpaceLiteral quote (US Intl dead-key bypass)TD_QUOTE hold
M10` + SpaceLiteral backtick (US Intl dead-key bypass)TD_BTICK hold
M11```Markdown code fenceTD_BTICK double
M122>&1Stderr redirect with spacesCode K
M13 | Pipe with surrounding spacesCode T
M14$?Last exit codeCode Z
M15&&And-chainCode S
M16||Or-chainCode R

Combo Reference

9 combos — 7 global (any layer), 2 Nav-layer-specific.

Global combos

KeysTypeOutputNotes
Space + EntertapBackspace ★Cross-hand, unambiguous, most critical
A + OtapEscapeCross-hand
A + EntertapTabCross-hand diagonal
Space + OtapDeleteCross-hand diagonal

Nav-layer combos COMBO_ONLY_FROM_LAYER

KeysOutputPhysical motion
N + E↑ up arrowRight index + middle simultaneously — adjacent, comfortable
Z + KPage UpRight index + middle, bottom row
Nav combos use COMBO_ONLY_FROM_LAYER in QMK — active only when Nav layer is on. This feature requires QMK keymap.c and is unavailable in Vial.

Hardware & Firmware

Hardware

BoardKeysGap from Coda target
Ferris Sweep / Bling34Has pinkies + inner column
Absolem46Too many keys
Custom PCB22Target — to be designed

Firmware

#define TAP_DANCE_ENTRIES    34
#define COMBO_COUNT          9
#define TAPPING_TERM         200    // overridden per-key for ring (250ms)
#define PERMISSIVE_HOLD             // helps HRM in fast typing
#define HOLD_ON_OTHER_KEY_PRESS     // for layer-access thumbs

// OS layout: US International
// ß = RALT(KC_S) · € = RALT(KC_5) · dead " for ä/ö/ü

Known Limitations

LimitationSeverityWorkaround
Custom hardware doesn't existCriticalUse Ferris Sweep (34 keys) as approximation
Backspace is a comboHighMuscle memory adapts in 1–2 weeks
P, V on overflow layerMedium~1.5% of characters — acceptable
Extreme learning curveExpectedNew hardware + new paradigm

Roadmap

VersionFocusStatus
v0.1Complete design — all layers, TDs, macros, combos, comparison✓ Done
v0.2Custom 22-key PCB design + QMK firmwarePlanned
v0.330-day daily use · real SFB measurement · tipping term tuningPlanned
v1.0Hardware open-sourced · firmware published · stable releasePlanned

Coda v0.1 · Concept · April 2026 · one7two99 · MIT · github.com/one7two99/coda
Sibling of Cadenza · Based on Colemak-DH