The problem
Corsair iCUE and Logitech G Hub switch keyboard profiles when you change games; Keychron's QMK keyboards had nothing like it. Their configuration tools save one keymap and one lighting setup to the keyboard, and that is it. I wanted my remaps, macros and lighting to follow whatever program is in front.
What I built
A Tauri 2 desktop app with a Rust core and a React interface. It watches the focused window, picks the most specific matching profile (file name, path, folder or window title) and sends it to the keyboard. To make that possible I wrote a small firmware module in C that plugs into Keychron's QMK firmware and accepts remaps, macros and per-key colours over Raw HID, held in RAM only. The app draws the exact keyboard model, edits every layer and the knob, records macros with or without timing, layers lighting like an image editor, and includes a key tester. One click installs a ready-made firmware for your model; an advanced mode gives you a keymap editor that builds and flashes your own.
Technical challenges
- A wire protocol of my own. App and keyboard speak a versioned protocol, so the app can tell when the keyboard runs an older module and say so.
- Flashing safely. Before every flash the app reads the current firmware into a backup, and a flash interrupted halfway can always be retried from the chip's read-only bootloader.
- Lighting that stays put. Keychron's firmware reloads its saved colours when the effect changes or the lighting wakes; the module restores each profile's colour and speed instead.
- Testing without hardware. The firmware module has host-side C tests, and the interface runs in a browser against a pretend keyboard.
Outcome
Version 1.1.0 is released on GitHub under GPL-3.0, with signed auto-updates. It has been tested on a Keychron V6 8K ISO; the other 270 models are mapped and waiting for testers.


