Personal QMK firmware configurations for multiple keyboards, managed via a Nix flake for reproducible builds.
Split columnar keyboard with hotswap switches. Uses the ZSA QMK fork.
Three keymap variants:
pers -- Primary layout. Home row mods (GACS), caps word (both shifts), symbol layer, nav/media layer with RGB controls.ball -- Trackball-enabled variant. Adds Navigator trackball driver with hi-res scroll, auto mouse layer, drag scroll toggle, CPI adjustment, and a numpad layer on hold-B.mod -- Modifier-focused variant. Similar to pers but with tap dance undo (double-tap U for Ctrl+Shift+-), combo caps word (D+K), numpad on hold-E, and a transparent toggle layer for GUI+N override.All three share: QWERTY base, home row mods, symbol layer (braces/parens/operators), settings layer (RGB, nav arrows, boot), and caps word.
39-key split keyboard with integrated trackball. Uses the Holykeebs QMK fork.
Keymap: init
Split ergodox-style keyboard with integrated trackball (RP2040/Splinky). Uses the BastardKB QMK fork.
Keymap: init
Standalone trackball with 5 buttons. Uses upstream QMK.
Keymap: pers
PLOOPY_DRAGSCROLL_INVERT)nix build .#<keyboard-name>
Available targets:
| Nix target | Keyboard | Keymap | QMK Fork |
|---|---|---|---|
voyager-pers |
zsa/voyager |
pers |
ZSA |
voyager-ball |
zsa/voyager |
ball |
ZSA |
voyager-mod |
zsa/voyager |
mod |
ZSA |
keyball39-init |
keyball/keyball39 |
init |
Holykeebs |
charybdis-init |
bastardkb/charybdis/4x6 |
init |
BastardKB |
ploopyco-trackball-rev1_005-pers |
ploopyco/trackball/rev1_005 |
pers |
Upstream |
ploopyco-trackball-rev1_007-pers |
ploopyco/trackball/rev1_007 |
pers |
Upstream |
nix build .#all
Firmware files (.bin, .hex, .uf2) will be in ./result/.
nix develop
Drops into a shell with all QMK toolchains (AVR + ARM), Python dependencies, and flashing utilities pre-configured.
nix run .#flash-voyager
This uses wally-cli to flash the voyager-pers firmware. To flash manually or use a different keymap, build the target and flash the .bin from ./result/ using Wally or wally-cli.
nix build .#keyball39-init or nix build .#charybdis-init.uf2 file from ./result/ to the USB mass storage device that appearsnix build .#ploopyco-trackball-rev1_005-pers.hex file:
avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U flash:w:result/*.hex
The flake manages four separate QMK firmware sources as inputs, one per fork:
qmk-firmware -- Upstream QMK (Ploopyco)zsa-qmk-firmware -- ZSA fork (Voyager)keyball-qmk-firmware -- Holykeebs fork (Keyball39)bastardkb-qmk-firmware -- BastardKB fork (Charybdis)Each build target specifies which fork to use. The setupUserspace helper copies the fork's source tree, then overlays the keyboards, users, and layouts directories from this userspace repo on top. This lets custom keymaps coexist with the fork's built-in keyboard definitions.
Pin updates are managed through flake.lock -- run nix flake update to pull the latest from all forks.