8000
Skip to content

Latest commit

Β 

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Nix KBDs

Reproducible QMK firmware builds for my keyboards using QMix and the vial-qmk fork.

QMix provides two helper functions used here:

  • fetchQmkFirmware β€” Fetches a pinned version of a QMK firmware repo and primes it so QMK won't warn or crash during build
  • buildQmkFirmware β€” Builds firmware for a specific keyboard, injecting custom keymap source via src / srcMount

This project fetches vial-qmk (QMK fork with Vial support) at a specific commit, then builds each keymap by injecting local source into the firmware tree.


Keyboards

Corne Chocolate v2 (crkbd-choc-v2)

bc6d6406-ded2-490e-b189-96cdd792cb4a

Corne Keyboard β€” split 3x6 + 3 thumb layout based on Helix, for Kailh Choc v1/v2 switches.

  • MCU: RP2040 ProMicro (CONVERT_TO=promicro_rp2040)
  • Firmware: vial-qmk (Vial-compatible QMK fork)
  • Layout: LAYOUT_split_3x6_3 β€” 36 main keys + 3 thumb keys per half
  • Features:
    • RGB Matrix with typing heatmap, alphas mods, band pinwheel/spiral, gradient effects
    • RGB layer/color indicators per active layer
    • Caps Lock indicator (rainbow or accent color)
    • Idle dimming (fades after 60s, full off after 30min)
    • Vial combos (10 entries), key overrides (10 entries), tap dance (10 entries)
    • 10 dynamic macros
    • Leader sequences, combos, key overrides, tap dance
    • Unicode input (common + full)
    • Auto-shift, retro shift, space cadet (sticky shift/ctrl on double-tap)
    • NKRO
    • Split sync: layer state, LED state, mods, transaction mirror
    • USB auto-detect master/slave

Build:

nix build .#crkbd-choc-v2

The UF2 firmware files are at result/share/qmk/firmware/{left,right}/.

Flash (RP2040 UF2 bootloader):

# Flash left half β€” double-tap reset when prompted:
nix run nixpkgs#qmk -- flash result/share/qmk/firmware/left/*.uf2 -bl uf2-split-left

# Flash right half β€” double-tap reset when prompted:
nix run nixpkgs#qmk -- flash result/share/qmk/firmware/right/*.uf2 -bl uf2-split-right

Corne Classic v3 (crkbd-classic-v3)

0d8aa287-056a-4e8a-afaf-71d9c4e94734

Corne Keyboard β€” same split 3x6 + 3 thumb layout, for Cherry MX compatible switches.

  • MCU: AVR
  • Firmware: vial-qmk (Vial-compatible QMK fork)
  • Layout: LAYOUT_split_3x6_3 β€” 36 main keys + 3 thumb keys per half
  • Features:
    • Vial combos (4 entries), tap dance (10 entries), key overrides (4 entries)
    • 6 dynamic macros
    • NKRO
    • Split sync (layer/LED/mods)
    • USB auto-detect master/slave

Build:

nix build .#crkbd-classic-v3

The hex firmware files are at result/share/qmk/firmware/{left,right}/crkbd_rev1_classic-v3.hex.

Flash (Caterina bootloader, avrdude):

# Flash left half β€” double-tap reset when prompted:
nix run nixpkgs#qmk -- flash result/share/qmk/firmware/left/crkbd_rev1_classic-v3.hex -bl avrdude-split-left

# Flash right half β€” double-tap reset when prompted:
nix run nixpkgs#qmk -- flash result/share/qmk/firmware/right/crkbd_rev1_classic-v3.hex -bl avrdude-split-right

Corne Keymap Layouts

These keymaps are designed for the EurKey layout β€” a multilingual layout based on QWERTY that provides Western European accented characters (French, Spanish, German, Portuguese, etc.) via Alt Gr combos, while keeping the familiar QWERTY base for coding and ASCII symbols.

TapDance

TapDance keys produce different actions based on tap vs. hold timing. All slots use TD(...) in the keymap. These tap-dance keys replicate EurKey accented characters that are normally accessed via Alt Gr on the OS level.

Slot Tap Hold/Double Term EurKey Char Description
0 KC_A RALT(KC_X) 200ms Γ‘ Tap: A Β· Hold: AltGr+X β†’ Γ‘
1 KC_E RALT(KC_G) 200ms Γ© Tap: E Β· Hold: AltGr+G β†’ Γ©
2 KC_I RALT(KC_B) 200ms Γ­ Tap: I Β· Hold: AltGr+B β†’ Γ­
3 KC_O RALT(KC_DOT) 200ms Γ³ Tap: O Β· Hold: AltGr+. β†’ Γ³
4 KC_U RALT(KC_J) 200ms ΓΊ Tap: U Β· Hold: AltGr+J β†’ ΓΊ
5 KC_N RALT(KC_N) 200ms Γ± Tap: N Β· Hold: AltGr+N β†’ Γ±
6 KC_C RALT(KC_C) 200ms Γ§ Tap: C Β· Hold: AltGr+C β†’ Γ§
7 KC_LEFT_GUI KC_LEFT_ALT 350ms β€” Tap: GUI (Win) Β· Hold: AltGr
8 KC_LEFT_SHIFT double tap β†’ KC_CAPS_LOCK 180ms β€” Tap: LShift Β· Double: CapsLock

QWERTY Layer (0)

              β”Œβ”€β”€β”                              β”Œβ”€β”€β”
          β”Œβ”€β”€β”β”‚E β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚I β”‚β”Œβ”€β”€β”
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚W β”‚β”‚  β”‚β”‚R β”‚β”‚T β”‚              β”‚Y β”‚β”‚U β”‚β”‚  β”‚β”‚O β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚βŽ‹ β”‚β”‚Q β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚P β”‚β”‚βŒ« β”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β”‚D β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚K β”‚β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚S β”‚β”‚  β”‚β”‚F β”‚β”‚G β”‚              β”‚H β”‚β”‚J β”‚β”‚  β”‚β”‚L β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚β‡₯ β”‚β”‚A β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚; β”‚β”‚βŽ β”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β”‚TDβ”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚, β”‚β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚X β”‚β”‚6 β”‚β”‚V β”‚β”‚B β”‚              β”‚TDβ”‚β”‚M β”‚β”‚  β”‚β”‚. β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚TDβ”‚β”‚Z β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚5 β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚/ β”‚β”‚' β”‚
  β”‚8 β”‚β”‚  β”‚β””β”€β”€β”˜    β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜    β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜      β”Œβ”€β”€β” β”Œβ”€β”€β”  β”Œβ”€β”€β”    β”Œβ”€β”€β”  β”Œβ”€β”€β” β”Œβ”€β”€β”      β””β”€β”€β”˜β””β”€β”€β”˜
                β”‚LβŒƒβ”‚ β”‚TDβ”‚  │␣ β”‚    │␣ β”‚  β”‚MOβ”‚ β”‚MOβ”‚
                β”‚  β”‚ β”‚7 β”‚  β”‚  β”‚    β”‚  β”‚  β”‚2 β”‚ β”‚1 β”‚
                β””β”€β”€β”˜ β””β”€β”€β”˜  β”‚  β”‚    β”‚  β”‚  β””β”€β”€β”˜ β””β”€β”€β”˜
                           β”‚  β”‚    β”‚  β”‚
                           β””β”€β”€β”˜    β””β”€β”€β”˜

Navigation Layer (1)

Layer 1 provides navigation keys (arrows, page up/down, home/end) and macros on the left, plus media/print keys on the right.

              β”Œβ”€β”€β”                              β”Œβ”€β”€β”
          β”Œβ”€β”€β”β”‚3 β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚*1β”‚β”Œβ”€β”€β”
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚2 β”‚β”‚  β”‚β”‚4 β”‚β”‚5 β”‚              │⏸ β”‚β”‚  β”‚β”‚  β”‚β”‚βŒ¦ β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚~ β”‚β”‚1 β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚INSβ”‚β–½ β”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β”‚M β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚β‡± β”‚β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚M β”‚β”‚2 β”‚β”‚M β”‚β”‚M β”‚              β”‚  β”‚β”‚  β”‚β”‚  β”‚β”‚β‡ž β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚β–½ β”‚β”‚M β”‚β”‚1 β”‚β””β”€β”€β”˜β”‚3 β”‚β”‚4 β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  ││↑ β”‚β”‚β‡Ÿ β”‚
  β”‚  β”‚β”‚0 β”‚β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β”‚β–½ β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚β‡² β”‚β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚β–½ β”‚β”‚  β”‚β”‚β–½ β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β”‚  ││← β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚β–½ β”‚β”‚β–½ β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  ││↓ β”‚β”‚β†’ β”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜    β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜    β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜      β”Œβ”€β”€β” β”Œβ”€β”€β”  β”Œβ”€β”€β”    β”Œβ”€β”€β”  β”Œβ”€β”€β” β”Œβ”€β”€β”      β””β”€β”€β”˜β””β”€β”€β”˜
                β”‚β–½ β”‚ β”‚MOβ”‚  β”‚β–½ β”‚    β”‚β–½ β”‚  β”‚MOβ”‚ β”‚  β”‚
                β”‚  β”‚ β”‚4 β”‚  β”‚  β”‚    β”‚  β”‚  β”‚5 β”‚ β”‚  β”‚
                β””β”€β”€β”˜ β””β”€β”€β”˜  β”‚  β”‚    β”‚  β”‚  β””β”€β”€β”˜ β””β”€β”€β”˜
                           β”‚  β”‚    β”‚  β”‚
                           β””β”€β”€β”˜    β””β”€β”€β”˜
*1 - KC_PRINT_SCREEN
Symbol Keycode Description
MO MO(4) / MO(5) Momentary layer switch to layer 4 or 5

Symbol Layer (2)

Layer 2 provides symbols via LSHIFT (left hand) and EurKey Alt Gr combos (right hand), with navigation on thumbs.

              β”Œβ”€β”€β”                              β”Œβ”€β”€β”
          β”Œβ”€β”€β”β”‚Lβ‡§β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚Lβ‡§β”‚β”Œβ”€β”€β”
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚L⇧││3 β”‚β”‚L⇧││L⇧│              β”‚L⇧││L⇧││8 β”‚β”‚Lβ‡§β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚L⇧││L⇧││2 β”‚β””β”€β”€β”˜β”‚4 β”‚β”‚5 β”‚              β”‚6 β”‚β”‚7 β”‚β””β”€β”€β”˜β”‚9 β”‚β”‚L⇧││▽ β”‚
  β”‚~ β”‚β”‚1 β”‚β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β”‚0 β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β”‚  β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚( β”‚β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚  β”‚β”‚  β”‚β”‚*1β”‚β”‚  β”‚              β”‚- β”‚β”‚= β”‚β”‚  β”‚β”‚) β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚β–½ β”‚β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚L⇧││~ β”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β”‚\ β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β”‚  β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚Lβ‡§β”‚β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚L⇧││  β”‚β”‚  β”‚β”‚  β”‚              β”‚L⇧││L⇧││( β”‚β”‚Lβ‡§β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚β–½ β”‚β”‚*2β”‚β”‚. β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚- β”‚β”‚= β”‚β””β”€β”€β”˜β”‚) β”‚β”‚\ β”‚β”‚L⇧│
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜    β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜    β””β”€β”€β”˜β”‚  β”‚β”‚~ β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜      β”Œβ”€β”€β” β”Œβ”€β”€β”  β”Œβ”€β”€β”    β”Œβ”€β”€β”  β”Œβ”€β”€β” β”Œβ”€β”€β”      β””β”€β”€β”˜β””β”€β”€β”˜
                β”‚β–½ β”‚ β”‚MOβ”‚  β”‚β–½ β”‚    β”‚β–½ β”‚  β”‚  β”‚ β”‚MOβ”‚
                β”‚  β”‚ β”‚3 β”‚  β”‚  β”‚    β”‚  β”‚  β”‚  β”‚ β”‚5 β”‚
                β””β”€β”€β”˜ β””β”€β”€β”˜  β”‚  β”‚    β”‚  β”‚  β””β”€β”€β”˜ β””β”€β”€β”˜
                           β”‚  β”‚    β”‚  β”‚
                           β””β”€β”€β”˜    β””β”€β”€β”˜
*1 - RALT(KC_5)
*2 - L⇧,,
Symbol Keycode Description
L⇧ KC_LSFT Left Shift (for symbol access)
MO MO(3) / MO(5) Momentary layer switch to layer 3 or 5
*1 RALT(KC_5) AltGr + 5 β†’ €
*2 KC_LSFT(KC_COMMA) Left Shift + comma β†’ <

F-keys / Number Layer (3)

Layer 3 provides F1-F12 on the left hand and a numpad-like layout on the right.

              β”Œβ”€β”€β”                              β”Œβ”€β”€β”
          β”Œβ”€β”€β”β”‚F3β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚8 β”‚β”Œβ”€β”€β”
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚F2β”‚β”‚  β”‚β”‚F4β”‚β”‚F5β”‚              β”‚K*β”‚β”‚7 β”‚β”‚  β”‚β”‚9 β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚β–½ β”‚β”‚F1β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚β”‚β–½ β”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β”‚F8β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚5 β”‚β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚F7β”‚β”‚  β”‚β”‚F9β”‚β”‚F β”‚              β”‚K+β”‚β”‚4 β”‚β”‚  β”‚β”‚6 β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚  β”‚β”‚F6β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚10β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚K=β”‚β”‚KβŽβ”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β”‚  β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚2 β”‚β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚F β”‚β”‚  β”‚β”‚  β”‚β”‚  β”‚              β”‚K-β”‚β”‚1 β”‚β”‚  β”‚β”‚3 β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚  β”‚β”‚F β”‚β”‚12β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚/ β”‚β”‚  β”‚
  β”‚  β”‚β”‚11β”‚β””β”€β”€β”˜    β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜    β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜      β”Œβ”€β”€β” β”Œβ”€β”€β”  β”Œβ”€β”€β”    β”Œβ”€β”€β”  β”Œβ”€β”€β” β”Œβ”€β”€β”      β””β”€β”€β”˜β””β”€β”€β”˜
                β”‚  β”‚ β”‚  β”‚  β”‚  β”‚    β”‚0 β”‚  β”‚. β”‚ β”‚, β”‚
                β”‚  β”‚ β”‚  β”‚  β”‚  β”‚    β”‚  β”‚  β”‚  β”‚ β”‚  β”‚
                β””β”€β”€β”˜ β””β”€β”€β”˜  β”‚  β”‚    β”‚  β”‚  β””β”€β”€β”˜ β””β”€β”€β”˜
                           β”‚  β”‚    β”‚  β”‚
                           β””β”€β”€β”˜    β””β”€β”€β”˜

Alt-F / Extended Symbols Layer (4)

Layer 4 maps to Alt+F (left hand) and Alt+Number (right hand) for media/number shortcuts.

              β”Œβ”€β”€β”                              β”Œβ”€β”€β”
          β”Œβ”€β”€β”β”‚*1β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚*2β”‚β”Œβ”€β”€β”
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚*3β”‚β”‚  β”‚β”‚*4β”‚β”‚*7β”‚              β”‚*8β”‚β”‚*5β”‚β”‚  β”‚β”‚*6β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚β–½ β”‚β”‚*9β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚*10β”‚β–½ β”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β”‚*11β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚*12β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚*13β”‚  β”‚β”‚*14β”‚*17              β”‚*18β”‚*15β”‚  β”‚β”‚*16β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚β–½ β”‚β”‚*19β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚*20β”‚β–½ β”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β”‚  β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚  β”‚β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚*21β”‚  β”‚β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β”‚  β”‚β”‚  β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚β–½ β”‚β”‚*22β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚β”‚  β”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜    β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜    β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜      β”Œβ”€β”€β” β”Œβ”€β”€β”  β”Œβ”€β”€β”    β”Œβ”€β”€β”  β”Œβ”€β”€β” β”Œβ”€β”€β”      β””β”€β”€β”˜β””β”€β”€β”˜
                β”‚β–½ β”‚ β”‚β–½ β”‚  β”‚β–½ β”‚    β”‚β–½ β”‚  β”‚  β”‚ β”‚  β”‚
                β”‚  β”‚ β”‚  β”‚  β”‚  β”‚    β”‚  β”‚  β”‚  β”‚ β”‚  β”‚
                β””β”€β”€β”˜ β””β”€β”€β”˜  β”‚  β”‚    β”‚  β”‚  β””β”€β”€β”˜ β””β”€β”€β”˜
                           β”‚  β”‚    β”‚  β”‚
                           β””β”€β”€β”˜    β””β”€β”€β”˜
Ref Keycode Description
*1 LALT(KC_F3) AltGr + F3
*2 RALT(KC_3) AltGr + 3
*3 LALT(KC_F2) AltGr + F2
*4 LALT(KC_F4) AltGr + F4
*5 RALT(KC_2) AltGr + 2
*6 RALT(KC_4) AltGr + 4
*7 LALT(KC_F5) AltGr + F5
*8 RALT(KC_1) AltGr + 1
*9 LALT(KC_F1) AltGr + F1
*10 RALT(KC_5) AltGr + 5
*11 LALT(KC_F8) AltGr + F8
*12 RALT(KC_8) AltGr + 8
*13 LALT(KC_F7) AltGr + F7
*14 LALT(KC_F9) AltGr + F9
*15 RALT(KC_7) AltGr + 7
*16 RALT(KC_9) AltGr + 9
*17 LALT(KC_F10) AltGr + F10
*18 RALT(KC_6) AltGr + 6
*19 LALT(KC_F6) AltGr + F6
*20 RALT(KC_0) AltGr + 0
*21 LALT(KC_F12) AltGr + F12
*22 LALT(KC_F11) AltGr + F11

Media / System (5)

Layer 5 provides media controls (volume, playback) on the left hand and system/magic keys on the right.

              β”Œβ”€β”€β”                              β”Œβ”€β”€β”
          β”Œβ”€β”€β”β”‚  β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚  β”‚β”Œβ”€β”€β”
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚V+β”‚β”‚  β”‚β”‚  β”‚β”‚  β”‚              β”‚*2β”‚β”‚*1β”‚β”‚  β”‚β”‚  β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚  β”‚β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚β”‚*3β”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β”‚>>β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚  β”‚β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚V-β”‚β”‚  β”‚β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β”‚  β”‚β”‚  β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚  β”‚β”‚<<β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚β”‚  β”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜β”Œβ”€β”€β”β”‚  β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”              β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚  β”‚β”Œβ”€β”€β”β””β”€β”€β”˜β””β”€β”€β”˜
  β”Œβ”€β”€β”β”Œβ”€β”€β”β”‚  β”‚β”‚  β”‚β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β”‚  β”‚β”‚  β”‚β”Œβ”€β”€β”β”Œβ”€β”€β”
  β”‚  β”‚β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚              β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚β”‚  β”‚
  β”‚  β”‚β”‚  β”‚β””β”€β”€β”˜    β””β”€β”€β”˜β””β”€β”€β”˜              β””β”€β”€β”˜β””β”€β”€β”˜    β””β”€β”€β”˜β”‚  β”‚β”‚  β”‚
  β””β”€β”€β”˜β””β”€β”€β”˜      β”Œβ”€β”€β” β”Œβ”€β”€β”  β”Œβ”€β”€β”    β”Œβ”€β”€β”  β”Œβ”€β”€β” β”Œβ”€β”€β”      β””β”€β”€β”˜β””β”€β”€β”˜
                β”‚  β”‚ β”‚  β”‚  │⏯ β”‚    β”‚Mut  β”‚  β”‚ β”‚  β”‚
                β”‚  β”‚ β”‚  β”‚  β”‚  β”‚    β”‚  β”‚  β”‚  β”‚ β”‚  β”‚
                β””β”€β”€β”˜ β””β”€β”€β”˜  β”‚  β”‚    β”‚  β”‚  β””β”€β”€β”˜ β””β”€β”€β”˜
                           β”‚  β”‚    β”‚  β”‚
                           β””β”€β”€β”˜    β””β”€β”€β”˜
*1 - QK_MAGIC_EE_HANDS_RIGHT
*2 - QK_MAGIC_EE_HANDS_LEFT
*3 - QK_BOOTLOADER
Symbol Keycode Description
V+ KC_VOLUME_UP Volume up
V- KC_VOLUME_DOWN Volume down
<< KC_PREVIOUS Previous track
>> KC_NEXT Next track
⏯ KC_PLAY_PAUSE Play/pause toggle
Mut KC_MUTE Mute audio
*1 QK_MAGIC_EE_HANDS_RIGHT Magic: sync EEPROM to right hand
*2 QK_MAGIC_EE_HANDS_LEFT Magic: sync EEPROM to left hand
*3 QK_BOOTLOADER Reboot into bootloader (for flashing)

Usage

Build firmware

# Corne Chocolate v2 (RP2040, UF2)
nix build .#crkbd-choc-v2

# Corne Classic v3 (AVR, hex)
nix build .#crkbd-classic-v3

The compiled firmware is in result/share/qmk/firmware/{left,right}/.

Flash firmware

The -bl avrdude-split-left / -bl uf2-split-left bootloaders wait interactively for you to double-tap reset, then flash and set EEPROM handedness.

Corne Classic v3 (AVR):

nix run nixpkgs#qmk -- flash result/share/qmk/firmware/left/crkbd_rev1_classic-v3.hex -bl avrdude-split-left
nix run nixpkgs#qmk -- flash result/share/qmk/firmware/right/crkbd_rev1_classic-v3.hex -bl avrdude-split-right

Corne Chocolate v2 (RP2040):

nix run nixpkgs#qmk -- flash result/share/qmk/firmware/left/*.uf2 -bl uf2-split-left
nix run nixpkgs#qmk -- flash result/share/qmk/firmware/right/*.uf2 -bl uf2-split-right

Display layout

Render the keyboard layout from a connected keyboard:

nix run path:.#vitaly -- layers -n <layer-number>

How it works

  1. fetchQmkFirmware fetches vial-qmk at a pinned commit and primes the repo
  2. buildQmkFirmware injects local keymap source (src) into the firmware tree at the mount path (srcMount), then runs the QMK build
  3. Each keymap is a separate package, built independently

See the QMix docs for full details on fetchQmkFirmware and buildQmkFirmware.

Updating vial-qmk

To update the vial-qmk source, change rev and hash in flake.nix:

vialQmkFirmware = pkgs.fetchQmkFirmware {
  url = "https://github.com/vial-kb/vial-qmk.git";
  origin = "https://github.com/vial-kb/vial-qmk.git";
  rev = "...";          # new commit hash
  hash = "sha256-...";  # compute with `nix-prefetch-git` or let nix suggest it
};

Adding a new keymap

  1. Create a directory under keyboards/crkbd/keymaps/<name>/
  2. Add keymap.c, config.h, rules.mk, and vial.json
  3. Add a package entry in flake.nix:
my-keymap = pkgs.buildQmkFirmware {
  keyboard = "crkbd";
  keymap = "my-keymap";
  split = true;
  src = ./keyboards/crkbd/keymaps/my-keymap;
  srcMount = "keyboards/crkbd/keymaps/my-keymap";
  qmkFirmware = vialQmkFirmware;
};

Stack

  • Nix β€” Reproducible builds
  • QMix β€” fetchQmkFirmware / buildQmkFirmware
  • vial-qmk β€” QMK fork with Vial support
  • Vial β€” Cross-platform keymap editor

About

Nix configs for building QMK/Vial firmwares for my corne keyboards

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Contributors

Languages

0