My qmk keymaps.
  • C 64%
  • Shell 34.5%
  • Makefile 1.5%
Find a file
2026-10-14 19:21:16 +02:00
keyboards/silakka54/keymaps/crony Add sticky shift with tap-for-oneshot and hold-for-regular behavior 2026-10-14 19:21:16 +02:00
.gitignore Initial commit: crony keymap for Silakka54 2026-07-26 09:11:17 +02:00
flash-crony Rename script references from flash_crony.sh to flash-crony 2026-09-26 17:53:01 +02:00
LICENSE feat: add readme and license. 2026-07-27 18:46:48 +02:00
qmk.json Add build target: silakka54:crony 2026-07-26 09:13:03 +02:00
README.md Update README with CHORD_TERM_SHIFT tuning docs 2026-09-26 18:02:00 +02:00

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-crony script 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) or iF< → 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_BASE exits 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:

  1. Builds the firmware.
  2. Waits for the left half's RP2040 bootloader (RPI-RP2 volume).
  3. Flashes the left half with the uf2-split-left bootloader target.
  4. Waits for the right half's bootloader.
  5. Flashes the right half with the uf2-split-right target.
  6. 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:

  1. Unplug both halves from USB.
  2. Connect the TRRS cable.
  3. 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.