- C 64%
- Shell 34.5%
- Makefile 1.5%
| keyboards/silakka54/keymaps/crony | ||
| .gitignore | ||
| flash-crony | ||
| LICENSE | ||
| qmk.json | ||
| README.md | ||
crony keymap — QMK layout for Silakka54
A personal QMK keymap overlay for the Silakka54 split ergonomic keyboard. Built around home-row mods with a uniform chord-timing rule and custom layers for navigation, mouse control, and Croatian diacritics.
Keyboard: Silakka54 — a 54-key column-staggered split keyboard (RP2040 Zero controllers, EE_HANDS).
QMK:
silakka54:crony
Features
- Home-row mods — eight Mod-Tap keys on the home row for Shift, Ctrl, Alt, and GUI. No dedicated modifier keys needed.
- Chord discrimination — a uniform, Achordion-style timing rule replaces
hand-position heuristics: a key pressed within
CHORD_TERM(150 ms) of a home-row mod is a typing roll (tap; 110 ms for Shift keys); pressed later, it's a deliberate chord (hold). No exception lists — same-hand and cross-hand shortcuts work alike, in any language. - Gaming layer — home-row keys become plain letters during play, with a dedicated toggle. No accidental mods during gameplay.
- Navigation layer — arrow keys and Page Up/Down on the right hand, activated by holding Escape.
- Mouse layer — mouse movement, scrolling, and clicks on the right hand, activated by holding Space.
- Function layer — F1–F12 and media controls, activated by holding Enter.
- Croatian layer — five diacritic letters (š, đ, č, ć, ž) on the right
side, activated by holding Backspace. Works with the standard Croatian
hr(us)keyboard layout (AltGr-based dead keys). - TRRS hot-plug warnings — the
flash-cronyscript prints prominent safety instructions to prevent controller damage when connecting/disconnecting the split halves.
Chord discrimination
Home-row mods don't use QMK's stock opposite-hands rule. Every home-row
mod-tap key uses the same discriminator: how long the mod was held before
the other key arrived. Implemented in get_chordal_hold() in keymap.c.
- Other key pressed within
CHORD_TERM(150 ms) of the mod going down → typing roll → tap. Protects fast typing on either hand, in any language ("da", "dva", "država", "kako", "first", "slon" …). - Other key pressed after
CHORD_TERM→ deliberate → hold. Works for same-hand and cross-hand chords: hold D a beat then C → Ctrl+C; hold F a beat then E → capital E.
Shift home-row keys (F/J) use a shorter term, CHORD_TERM_SHIFT
(110 ms): deliberate Shift rolls (quotes, capitals, parens) are fast and get
eaten at the full 150 ms term — a stray f/j lands before the character.
Layer-tap thumb keys (LT(_MOUSE/NAV/FUNC/CRO)) are exempt and keep the
default chordal-hold rule (hold whenever chorded), so fluent layer use
(Esc + arrows, Space + mouse) stays instant.
Tuning (in config.h):
CHORD_TERM— accidental hotkeys while typing casually → raise (170–180); hotkeys need an uncomfortably long hold → lower (120–130).CHORD_TERM_SHIFT— stray capitals (fOr) oriF<→ raise toward 130; quotes/capitals still eaten → lower toward 90 (90 was clean before).
Layer overview
Base layer (_BASE)
┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐
│ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ │ 6 │ 7 │ 8 │ 9 │ 0 │ - │
├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
│Tab │ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │ \ │
├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
│ = │A_GU│S_AL│D_CT│F_SH│ G │ │ H │J_SH│K_CT│L_AL│;GUI│ ' │
├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
│ [ │ Z │ X │ C │ V │ B │ │ N │ M │ , │ . │ / │ ] │
└────┴────┴────┴────┴────┴────┤ ├────┴────┴────┴────┴────┴────┘
┌────┬────┬────┐ ┌────┬────┬────┐
│TG │S→M │E→N│ │E→F │B→HR│Del │
└────┴────┴────┘ └────┴────┴────┘
Home-row mods:
| Key | Tap | Hold |
|---|---|---|
A |
a | GUI (Win) |
S |
s | Alt |
D |
d | Ctrl |
F |
f | Shift |
J |
j | Shift |
K |
k | Ctrl |
L |
l | Alt |
; |
; | GUI (Win) |
Thumb cluster (left→right):
| Key | Tap | Hold |
|---|---|---|
TG(_GAMING) |
— | toggle gaming on |
LT(_MOUSE) |
Space | mouse layer |
LT(_NAV) |
Esc | navigation layer |
LT(_FUNC) |
Enter | function layer |
LT(_CRO) |
Bksp | Croatian layer |
| Del | Del | — |
Gaming layer (_GAMING)
┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │
├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
│ │ │ │ │ │ │ │ │ │ │ │ │ │
├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
│F→E │ A │ S │ D │ F │ │ │ │ J │ K │ L │ ; │ │
├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
│LSft│ │ │ │ │ │ │ │ │ │ │ │ │
└────┴────┴────┴────┴────┴────┤ ├────┴────┴────┴────┴────┴────┘
┌────┬────┬────┐ ┌────┬────┬────┐
│L_CT│Spc │Esc │ │ │ │Base│
└────┴────┴────┘ └────┴────┴────┘
- WASD are plain keys (no mod-tap distractions).
- Left Ctrl is on the thumb for crouch-jump.
L_BASEexits back to the base layer.- Enter (
L_FUNCTIONS) is on the leftmost pinky spot — some games use it for chat/menu.
Mouse layer (_MOUSE)
Left half: nothing (or transparent)
Right half:
WHEEL UP
┌─────────┐
│ │
│ ← ↓ ↑ →│ mouse movement
│ │
└─────────┘
BTN1 BTN2 BTN3 left/middle/right click
Activated by holding Space.
Navigation layer (_NAV)
Right half:
PG UP
┌────────┐
│ │
│ ← ↓ ↑ →│ arrow keys
│ │
└────────┘
PG DN
Activated by holding Escape.
Function layer (_FUNC)
Left half: Right half:
┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐
│ F1 │ F2 │ F3 │ F4 │ │ │ │ │ │
├────┼────┼────┼────┤ ├────┼────┼────┼────┤
│ F5 │ F6 │ F7 │ F8 │ │ │ │ │Mply│
├────┼────┼────┼────┤ ├────┼────┼────┼────┤
│ F9 │F10 │F11 │F12 │ │Prv │Vol-│Vol+│Nxt │
├────┼────┼────┼────┤ ├────┼────┼────┼────┤
│LSft│ │ │ │ │Mute│ │ │RSft│
└────┴────┴────┴────┘ └────┴────┴────┴────┘
Activated by holding Enter.
Croatian layer (_CRO)
Sends RALT(keycode) combos for the standard Croatian hr(us) keyboard
layout:
| Combo | Result |
|---|---|
RALT([) |
š / Š |
RALT(]) |
đ / Đ |
RALT(;) |
č / Č |
RALT(') |
ć / Ć |
RALT(\) |
ž / Ž |
The diacritics are placed on the right pinky column, mirroring the physical key positions that produce them in the OS layout.
Activated by holding Backspace.
Requirements
- QMK CLI (
python3 -m pip install qmk) - QMK firmware checked out locally with your keyboards directory configured
- A Silakka54 keyboard (or other compatible split with RP2040 controllers)
Building
qmk compile -kb silakka54 -km crony
Or use the included flash script:
./flash-crony # compile + flash both halves
./flash-crony compile # compile only
./flash-crony left # flash left half only
./flash-crony right # flash right half only
Flashing
The Silakka54 uses EE_HANDS — each half must be flashed with a
handedness-specific UF2 file. The -bl uf2-split-left / -bl uf2-split-right
flags write the hand identifier to EEPROM during flashing.
The flash-crony script handles the full workflow:
- Builds the firmware.
- Waits for the left half's RP2040 bootloader (RPI-RP2 volume).
- Flashes the left half with the
uf2-split-leftbootloader target. - Waits for the right half's bootloader.
- Flashes the right half with the
uf2-split-righttarget. - Prints detailed reconnect instructions (USB power → TRRS → power on).
❗ TRRS safety
The Silakka54 has no ESD/short protection on the TRRS jack. Always follow this sequence:
- Unplug both halves from USB.
- Connect the TRRS cable.
- Plug in the left half to USB (it powers both halves).
To disconnect: unplug USB first, then disconnect TRRS.
Firmware configuration
Key settings in config.h:
| Setting | Value | Notes |
|---|---|---|
TAPPING_TERM |
190ms | Flat base mod-tap timeout |
CHORD_TERM |
150ms | Max gap for a chord to be a tap |
CHORD_TERM_SHIFT |
110ms | Same, for Shift keys (F/J) |
QUICK_TAP_TERM |
0 | Double-tap always = character |
CHORDAL_HOLD |
on | Uniform timing rule (custom logic) |
HOLD_ON_OTHER_KEY_PRESS |
on | Deliberate chords settle at press |
RETRO_TAPPING |
on | No dropped keys on slow releases |
SPECULATIVE_HOLD |
on | Early hold decision when possible |
Removed during tuning: PERMISSIVE_HOLD, FLOW_TAP_TERM, and the per-key
GUI tap-term bump — get_tapping_term() returns a flat 190 ms for everything.
Project structure
├── keyboards/
│ └── silakka54/
│ └── keymaps/
│ └── crony/
│ ├── keymap.c # layer definitions, home-row mods, logic
│ ├── config.h # QMK config, mod-tap tuning
│ └── rules.mk # build rules (MOUSEKEY_ENABLE)
├── flash-crony # compile + flash script
├── .gitignore
├── LICENSE # GPLv3
└── README.md # this file
License
This keymap is released under the GNU General Public License v3.0. See LICENSE for the full text.
This is a personal keymap overlay for QMK firmware. QMK itself is licensed under GPL-2.0-or-later.