A standalone Python daemon that connects a Xencelabs Quick Keys (USB VID:PID 28BD:5202) to AetherSDR over its TCI WebSocket interface (ws://localhost:50001 by default).
It reads HID reports directly from the Quick Keys — the 8-button ring, the side button, and the knob (press + rotate) — and translates them into TCI commands, so the device acts as a dedicated control surface for the radio: mode switching, VFO tuning, band up/down, PTT, MOX, mute, and volume, all mapped per-button in config.json. A handful of built-in actions (tune_up/tune_down, band_up/band_down, ptt_on/ptt_off, mox_toggle, mute_toggle, vol_up/vol_down) cover the common cases; any other button can instead be given a raw TCI command string (e.g. modulation:0,USB;). The knob's tuning step size auto-syncs to whatever step AetherSDR's RX Controls is currently using, after the first frequency change.
install.sh installs the daemon as a systemd user service (quickkeys-aethersdr.service), so it starts automatically and reconnects to both the HID device and the TCI server as needed.
This started as an in-tree plugin on a feature branch of AetherSDR (feat/quickkeys-plugin, mirroring the existing Elgato Stream Deck and Ulanzi Studio Quick Keys integrations that shipped alongside it in plugins/). While that branch was in flight, AetherSDR's maintainers removed all in-tree control-surface plugins (#5600), on the grounds that the project doesn't want to own versioning, packaging, CI, and third-party licensing for hardware SDKs it doesn't control — stated explicitly as "the direction is removal, not addition." Submitting a new in-tree plugin was no longer a realistic option, so the branch was extracted here instead, as a self-contained project with no dependency on AetherSDR's build or release tooling — it only needs AetherSDR's TCI server to be running.
No active work is planned on this. It was pulled out to preserve it rather than to develop it further. It's kept here in case a Quick Keys (or similar HID control-surface) integration with AetherSDR becomes relevant again in the future — treat this repo as a historical/reference snapshot, not a maintained project.
./install.sh
Installs Python dependencies (websocket-client, hid), copies the daemon and a default config.json to ~/.config/AetherSDR/plugins/quickkeys-aethersdr/, and registers/starts the systemd user service. Edit the installed config.json to customize button mappings — install.sh won't overwrite an existing one on a re-run.
systemctl --user status quickkeys-aethersdr
journalctl --user -u quickkeys-aethersdr -f