The brief
My keyboard setup spans two config surfaces that don't know about each other: QMK firmware on a ZSA Moonlander (what each physical key sends) and Hyprland keybinds (what the desktop does with it). Changing a hotkey meant editing C firmware, flashing, then editing hyprland.conf — and hoping the two stayed in sync. Moonkeys puts both in one tool.
How it was built
- A Moonlander-shaped GTK popup. The UI is a to-scale rendering of the physical board — every key clickable, showing its tap/double-tap/hold assignments and per-key RGB color.
- Cross-referencing is the killer feature. Every
bindline inhyprland.confis parsed and matched against the physical key that produces its keycode, so "what does this key actually do, end to end?" has one answer. - QMK, locally. Edits generate QMK keymap constructs, compile with the local toolchain, and flash from the same popup. No Oryx, no cloud configurator — the keymap is code in a repo like everything else.
- Follows the same GTK3 + GtkLayerShell popup pattern as the rest of my desktop — PID-file click-toggle, Escape closes, Andromeda glow.
Stack notes
Python 3, GTK3, GtkLayerShell, PyGObject; QMK toolchain for firmware builds. Bound to SUPER+/ and used daily.