Personal QMK firmware for four keyboards:
- Kyria Rev4 (Halcyon series) - Split ergonomic with Colemak-DH
- Elora Rev2 (Halcyon series) - Split ergonomic with Colemak-DH + number row
- Keychron Q15 Max - Ortholinear with Bluetooth/2.4GHz wireless
- ZSA Planck EZ Glow - 4x12 ortholinear with Colemak-DH
Swift is the only authored source of truth for keymaps, legends, styles, firmware configuration, companion metadata, previews, and generated diagrams. The host compiler writes ignored QMK ABI artifacts before each build.
The module boundary is deliberate:
QMKKeymapKit + QMKFirmwareRuntime
↓
ObbutKeymaps
↓
KyriaFirmware / EloraFirmware / Q15Firmware / PlanckFirmware
↓
ObbutKeyboardCatalog
↓
macOS + Windows companions and Xcode previews
QMKKeymapKit has no Obbut-specific vocabulary. ObbutKeymaps owns the shared
Obbut legends, named styles, and behavior. Individual firmware modules select
board composition and hardware policy only.
See SwiftKeymaps/README.md for the authored API, result-builder keymaps, previews, custom QMK tokens, and Embedded Swift callback bridges.
The repository includes native companion apps that visualize all four firmware definitions, follow a connected keyboard's layer changes in realtime, and control supported keyboard lighting. Platform UI remains native while the protocol-v4-only model, dynamic geometry, metadata resolution, and production renderer are shared Swift code.
- Keymap Companion for macOS uses SwiftUI and its Canvas renderer.
- Keymap Companion for Windows uses native WinUI 3 and Swift 6.3.3.
Split ergonomic keyboard with asymmetric modules:
- Left half: Cirque trackpad
- Right half: Encoder module
Each half must be flashed separately:
- Enter bootloader: Fn + Esc (left) or Fn + ' (right)
- Run
./docker-build.sh flash-leftor./docker-build.sh flash-right - Or copy the
.uf2file to the mountedRPI-RP2drive
Six-layer Colemak-DH layout with per-layer RGB indicators and an automatic pointer layer.
Colemak-DH base layer with home row optimized for comfortable typing.
Navigation with arrow keys. Highlighted keys show RGB indicators (magenta).
Symbols and numpad. RGB indicators: blue for numbers, yellow for symbols.
F-keys, RGB controls, and bootloader. RGB indicators: cyan for F-keys, green for RGB controls, red for boot.
Touching or moving on the Cirque trackpad activates Pointer automatically. The layer remains available briefly after movement and stays active while a pointer action is held.
M N E I O: Browser Back, Left Click, Right Click, Middle Click, Browser ForwardL/U: Pointer sensitivity down/upY/;: Drag-scroll speed down/upH: Hold for dominant-axis scrolling,: Hold for sniper precision.: Toggle drag lock
Pointer mode uses a dim cyan RGB underlay. Drag lock changes the underlay to red and is released by another drag-lock tap, ordinary typing, or entry into Lower, Raise, or Function. Sensitivity and scroll-speed adjustments last until reboot.
The Halcyon emulator boots the same production UF2 files used for flashing the Kyria and Elora. It runs both virtual RP2040s on one deterministic timeline, connects their real PIO split transport, and models the matrix, encoder, USB host, logical RGB output, and the Kyria's Cirque SPI device. No emulator-only firmware flags or replacement firmware are used.
Run the complete suite in Docker:
./docker-build.sh test-kyria-emulator
./docker-build.sh test-elora-emulator
./docker-build.sh test-q15-emulator
./docker-build.sh test-planck-emulatorRun one versioned JSON scenario:
./docker-build.sh emulate-kyria Emulator/scenarios/02-right-key.jsonThese commands rebuild the production firmware and print its paths and SHA-256
hashes. Scenarios can drive logical keys, the encoder, Cirque input, waits, and
raw HID, then assert USB reports, layers, and logical RGB state. See
Emulator/scenarios and
Emulator/elora-scenarios for examples. Q15 Max
and Planck execute their production STM32 ELFs in Renode; see
STM32Emulator/README.md for the modeled hardware
boundaries and exhaustive lookup checks.
The emulator validates firmware logic and digital peripheral interactions. It does not validate electrical behavior, analog characteristics, or physical USB and WS2812 timing.
rp2040js is pinned and installed from npm rather than vendored. Docker builds
the official RP2040 B2 boot ROM locally and keeps both its checkout and binary
inside ignored Docker layers: CI never uploads them, release artifacts remain
the normal UF2/BIN files, and the emulator image must not be pushed to a
registry. License details and the compatibility-patch attribution are in
Emulator/THIRD_PARTY_NOTICES.md.
Split ergonomic keyboard with number row:
- Left half: No module
- Right half: Encoder module
The Elora shares the Kyria's typing layers and settings, except for the Kyria-only automatic Pointer layer and the Elora's additional number row.
Each half must be flashed separately:
- Enter bootloader: Fn + Esc (left) or Fn + ' (right)
- Run
./docker-build.sh flash-elora-leftor./docker-build.sh flash-elora-right - Or copy the
.uf2file to the mountedRPI-RP2drive
Five-layer Colemak-DH layout with number row and per-layer RGB indicators.
Colemak-DH base layer with number row (~ 1 2 3 4 5 | 6 7 8 9 0 -).
Navigation with arrow keys. Number row is transparent.
Symbols and numpad. Number row is transparent (direct access to base layer numbers).
F-keys, RGB controls, and bootloader. Number row is transparent.
Ortholinear keyboard with:
- 64 keys + 2 rotary encoders
- Bluetooth 5.1 (3 devices) + 2.4GHz wireless
The Q15 Max uses DFU mode:
- Enter DFU: Fn + Tab (or hold Esc while plugging in)
- Run
./docker-build.sh flash-q15
5-layer QWERTY layout with separate Mac/Windows base layers.
Media controls, RGB, and Bluetooth device switching.
F-keys and battery level indicator.
4x12 ortholinear keyboard with per-key RGB and 2u center spacebar. Uses ZSA's QMK fork (separate Docker image).
The Planck EZ uses DFU mode:
- Press the reset button on the bottom of the keyboard
- Run
./docker-build.sh flash-planck
Five-layer Colemak-DH layout matching the Kyria typing layers, with per-layer RGB indicators.
Colemak-DH base layer adapted from the Kyria.
Gaming layer (toggled from Function layer).
Navigation with arrow keys.
Symbols and numpad. RGB indicators: blue for numbers, yellow for symbols.
F-keys, RGB controls, and bootloader.
All firmware builds use Docker. Every board compiles the same Swift protocol-v4 runtime and its selected Swift firmware modules.
./docker-build.sh kyria-left # Build left half (Cirque trackpad)
./docker-build.sh kyria-right # Build right half (encoder)
./docker-build.sh kyria-all # Build both halves
./docker-build.sh flash-kyria-left # Build and flash left half
./docker-build.sh flash-kyria-right # Build and flash right half./docker-build.sh elora-left # Build left half (no module)
./docker-build.sh elora-right # Build right half (encoder)
./docker-build.sh elora-all # Build both halves
./docker-build.sh flash-elora-left # Build and flash left half
./docker-build.sh flash-elora-right # Build and flash right half./docker-build.sh q15 # Build Q15 Max firmware
./docker-build.sh flash-q15 # Build and flash Q15 Max./docker-build.sh planck # Build Planck EZ Glow firmware
./docker-build.sh flash-planck # Build and flash Planck EZ./docker-build.sh clean # Remove build artifacts
./draw-keymap.sh # Regenerate keymap SVGsThis repository contains files from splitkb/qmk_userspace (halcyon-qmk branch).
The following files were copied from splitkb/qmk_userspace:
| Path | Description |
|---|---|
LICENSE |
GPL v2 license |
keyboards/splitkb/halcyon/kyria/ |
Kyria Rev4 Halcyon keyboard definition |
keyboards/splitkb/halcyon/elora/ |
Elora Rev2 Halcyon keyboard definition |
users/halcyon_modules/ |
Halcyon module support code (Cirque, encoder, display) |
.github/workflows/build_binaries.yaml |
GitHub Actions build workflow |
This project is licensed under the GNU General Public License v2.0 - see the LICENSE file for details.
The Halcyon keyboard definitions and module support code are copyright splitkb.com and licensed under GPL-2.0-or-later.