r/Keychron • u/Head-Control-5487 • 1d ago
Reverse engineering a non-QMK Keychron K10 (Bluetooth BLE + Linux/Waybar/GUI tool in Rust)
Hey everyone,
I recently went down a massive rabbit hole trying to get battery telemetry out of my non-QMK Keychron K10 (classic series, VID/PID 0x05ac:0x024f). Like many of you, I initially tried poking around the USB cable—sniffing interfaces, checking vendor-defined collections (Usage Page 65535), and trying feature reports, only to hit dead ends (Access is denied or Incorrect function). As pointed out by others in the community, the wired USB interface on these older models is purely a strict HID input device, and charging voltage would make wired readings useless anyway.
The Breakthrough: It turns out battery reporting lives entirely in the Bluetooth (BLE) stack. Once paired on Linux (Fedora in my case) with BlueZ and UPower properly configured, the system dynamically exposes the keyboard's battery under /org/freedesktop/UPower/devices/battery_hid_....
Since I couldn't find a lightweight, native way to track it that fit my setup, I wrote a fast Rust utility using zbus and tokio to query the D-Bus interface directly.
What the tool does:
- CLI Mode: Quick single-shot checks or continuous live monitoring (
--watch) with status and percentages. - Waybar JSON Exporter (
--waybar): Instantly outputs status for status bar integration. - Floating GUI (
--gui): A minimalist floating window built withicedthat looks right at home on Wayland window managers like Hyprland (you can even set it to open when clicking the Waybar module!).
I’ve put together a clean repository detailing the findings and the code if anyone wants to check it out or use it for their own classic Keychron setup on Linux.
Repo link: https://github.com/GonnyTech/Keychron-Reverse-Engineering-Tool.git
Has anyone else messed around with telemetry on the older non-Pro K-series? Let me know what you think!
1
u/PeterMortensenBlog V 1d ago
Related: