https://github.com/fuchskurt/keychron_q6_he_rmk
Custom RMK firmware for the Keychron Q6 HE ANSI in Rust
https://github.com/fuchskurt/keychron_q6_he_rmk
embassy firmware hall-effect hall-effect-keyboard keyboard keychron rmk rust stm32
Last synced: about 2 months ago
JSON representation
Custom RMK firmware for the Keychron Q6 HE ANSI in Rust
- Host: GitHub
- URL: https://github.com/fuchskurt/keychron_q6_he_rmk
- Owner: fuchskurt
- License: apache-2.0
- Created: 2026-01-12T06:50:54.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2026-04-01T17:41:34.000Z (3 months ago)
- Last Synced: 2026-04-03T03:30:38.291Z (3 months ago)
- Topics: embassy, firmware, hall-effect, hall-effect-keyboard, keyboard, keychron, rmk, rust, stm32
- Language: Rust
- Homepage: https://fuchskurt.github.io/keychron_q6_he_rmk/
- Size: 193 KB
- Stars: 2
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- License: LICENSE-APACHE
Awesome Lists containing this project
README
# Keychron Q6 HE - Custom RMK Firmware
[](https://fuchskurt.github.io)
[](https://github.com/fuchskurt/keychron_q6_he_rmk/releases)
[](#license)

Open-source replacement firmware in `RUST` based on [RMK](https://github.com/HaoboGu/rmk) for
the [Keychron Q6 HE](https://www.keychron.com/products/keychron-q6-he-qmk-wireless-custom-keyboard).
Compatible with [Vial](https://get.vial.today) for live keymap editing without reflashing.
Supports **ANSI**, **ISO**, and **JIS** layouts, select the right build for your board variant.
---
## Features
- **Analog actuation point**: Keys actuate at 0.8 mm by default and Rapid Trigger sensitivity starts at 0.3 mm, both
adjustable in 0.1 mm increments, with no fixed reset point.
- **Two hardware layers**: Mac and Windows base layers, switchable via the physical toggle on the side of the keyboard.
- **Vial keymap editing**: Remap any key, encoder action, or layer live from [Vial](https://get.vial.today)
or [vial.rocks](https://vial.rocks) without reflashing.
- **RGB backlight**: Full per-key RGB. Caps Lock lights red when active; Num Lock lights white when active.
- **Rotary encoder**: Volume up/down by default; remappable via Vial.
- **Automatic calibration**: Guided first-boot calibration with backlight feedback. On subsequent boots the keyboard
re-measures key resting positions automatically and refines calibration silently in the background, so drift is
corrected without any user action.
- **Thermal protection**: LED brightness is automatically reduced if the backlight driver chip gets too hot, and
restored when it cools down.
---
## Layout variants
| Layout | Feature flag | Cargo profile |
| ------ | ------------- | ---------------------------------- |
| ANSI | `ansi_layout` | `--features ansi_layout` (default) |
| ISO | `iso_layout` | `--features iso_layout` |
| JIS | `jis_layout` | `--features jis_layout` |
Exactly one layout feature must be enabled at a time. Each layout ships its own `vial.json`, LED mapping, and sensor
presence map.
---
## Flashing
### One-time setup
Install [Rust nightly](https://rustup.rs) and the required tools:
```sh
rustup toolchain install nightly
rustup target add thumbv7em-none-eabihf
rustup component add rust-src llvm-tools
cargo make install
```
### Build and flash (ANSI)
1. Enter DFU mode: hold the reset button on the underside of the keyboard, then plug it in (or press reset while
plugged in).
2. Flash:
```sh
cargo make flash
```
The keyboard reboots automatically when flashing completes.
> `cargo make flash` defaults to the ANSI layout. To flash a different layout, pass the feature flag directly:
>
> ```sh
> cargo dfu --vid 0x483 --pid 0xdf11 --release --features iso_layout
> cargo dfu --vid 0x483 --pid 0xdf11 --release --features jis_layout
> ```
### Pre-built binaries
Download the `.bin` matching your layout from
[Releases](https://github.com/fuchskurt/keychron_q6_he_rmk/releases) and flash with any STM32 DFU tool:
```sh
dfu-util -a 0 -s 0x08000000:mass-erase:force:leave \
-D keychron-q6-he-rmk--.bin \
-S
```
Replace `` with `ansi`, `iso`, or `jis`.
---
## First-boot calibration
The first time the firmware runs, or whenever saved calibration is missing or corrupt, the backlight guides you through
a two-step setup. Follow the colors:
| Backlight | What to do |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Solid amber** | Leave all keys fully released |
| **Red -> blue gradient** | Press every key all the way to the bottom and hold it for 1 second. Each key lights up **green** when accepted. The background shifts from red toward blue as more keys are accepted. |
| **Green blink × 3** | All keys accepted, you may release them now |
| **Solid green for 2 s** | Calibration saved, keyboard is ready |
> **If the backlight returns to amber** after the green blink, saving to the EEPROM failed. Power-cycle the keyboard and
> repeat calibration on the next boot.
On every subsequent boot the keyboard briefly re-measures key resting positions to compensate for temperature changes,
then starts normally.
---
## Keymap editing
Connect the keyboard and open [Vial](https://get.vial.today) (desktop app or [vial.rocks](https://vial.rocks) in a
browser). Select the keyboard, then remap keys, layers, or encoder actions. Changes take effect immediately without
reflashing.
---
## License
Licensed under either of [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) at your option.