shiner.app

Moonkeys

Keyboard and hotkey customizer for Hyprland + the ZSA Moonlander, in one Moonlander-shaped popup.

  • Python
  • GTK3
  • QMK

Features

  • To-scale Moonlander UI — every key clickable
  • Tap / double-tap / hold editing per key
  • Per-key RGB control
  • Local QMK compile + flash, no cloud configurator
  • Cross-references every hyprland.conf bind to its physical key
  • Click opens, Escape closes

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 bind line in hyprland.conf is 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.