Repository navigation
Releases: rmk-rs/rmk
Releases · rmk-rs/rmk
Release list
RMK v0.9.0
Added
Connectivity
- Add BLE dongle support (
dongleCargo feature). A dongle is a USB device that relays a wireless keyboard's HID reports to the host, so the keyboard works on machines with no usable Bluetooth. The keyboard reserves a bond slot of its own for the dongle — profile cycling never reaches it — andUser(N+5)(SwitchToDongle) switches to it; holding that key for 5 seconds clears the bond and goes looking for another dongle. The dongle also relays the host protocol, so Vial and Rynk keep working through it. See examples/use_rust/nrf_dongle - Add nRF54 support (nRF54L15 and nRF54LM20)
- Add ESP32-H2 support
- Add an
nrf52820_blechip feature (#1049) - Add SiFli SF32LB52x BLE support
- Hold a BLE profile key for 5 seconds to forget that profile's bond and re-pair, so you can move a profile to a different host without wiping storage (#1045)
- Add BLE passkey handling on the initial connection, for hosts that require pairing confirmation (#756)
- Add an option to disable the BLE battery service
- Report the split peripheral's battery level to the central, and configure the peripheral's battery ADC from
keyboard.toml - Expose battery levels from configured split peripherals through standard Battery Service instances on the central's BLE GATT server, including host-readable and notifiable levels for each peripheral
- Add configurable
battery_user_descriptionvalues for the central and split peripheral Battery Level characteristics through[ble],[split.central], and[[split.peripheral]], with descriptive defaults for each battery service - Advertise the boot keyboard protocol on the primary HID interface, so the keyboard works in BIOS/UEFI and other boot-protocol-only hosts
- Add USB logging support for split peripherals (#1000)
- Add BLE connection subrating for the split link (
subratingfeature), see low power (#1008, #1077) - Stream keyboard state to the dongle over GATT: keys, modifiers, layer, WPM, sleep and battery (#1086)
- Add a builder for the USB transport
Displays and other outputs
- Add OLED display support (
displayCargo feature) with a[display]section inkeyboard.toml. Shipsoled_asyncdrivers for SH1106, SH1107, SH1108 and SSD1309, pluslcd-asyncfor color panels. Default renderers show layer, connection, and battery state, blank while the keyboard sleeps, and honour configurable render/poll intervals. Custom renderers are supported — see examples/use_rust/custom_renderer. On splits, the central forwards display state events to peripherals so both halves can show the same status - Add Plover HID stenography support (
stenoCargo feature): a steno HID descriptor and USB endpoint, anAction::Stenokeycode withSTN(key)syntax inkeyboard.toml, and a live-state reporter - Flush only the dirty rectangle in
LcdAsyncDisplay(#1070)
Behaviors
- Add
bootmagicconfig: hold a designated key during boot to drop into the chip bootloader. Works on unibody and on each half of a split independently. Particularly useful for split peripherals whose BOOTSEL button is physically inaccessible (#457). - Make
rmk::bootmodule public so user code can callboot::jump_to_bootloader()directly - Add auto mouse layer behavior: automatically activate a configured layer when X/Y cursor motion from a pointing device is detected, and deactivate it after a
timeoutof inactivity (#781) withdeactivate_on_key(withextra_mouse_keys) andreset_timeout_on_keyoptions; entry capacity is auto-derived fromkeyboard.toml, overridable via[rmk].auto_mouse_layer_max_num - Add
quick_tap_timeoutmorse profile option: re-pressing a morse/tap-hold key within the window after its last release fires the tap action immediately and keeps it held, so the OS auto-repeats the tap instead of triggering the hold action - Add one-shot sticky modifiers, with a
quick_releaseoption under[behavior.one_shot_modifiers] - Add a
prior_idle_timecooldown for combos: a combo won't fire if another key was pressed within the window, which keeps fast rolls from triggering combos accidentally - Support nested actions in tap-hold / morse configuration
- Add
PDF(n)(set default layer) tokeyboard.tomlkeymaps - Add a bilateral marker to
[layout].map, so same-hand modifiers still work whenunilateral_tapis enabled - Allow overriding
flow_tapper morse profile - Expose held modifier combinations in config (#999)
- Add conversion for space cadet keys
- Support the full extended Vial macro format (#989)
- Add
[host].insecure(renamed fromvial_insecure, which still parses) to start the host configurator unlocked - Embed a version stamp in the USB serial number, so a host can tell which firmware build it is talking to
- Shrink the in-RAM keymap by storing each tap-hold's timing profile as a
u8index into a small deduplicated morse profile table (MorsesConfig::profiles) instead of an inline 8-byteMorseProfile.KeyAction::TapHolddrops from 16 to 7 bytes, which also removes the profile's 8-byte alignment padding across everyKeyAction-sized buffer — roughly a 3 KB RAM saving on a 5×14×5 board at no flash cost. An index with no table entry falls back to the default profile. Table capacity is configurable via[rmk] morse_profile_max_num(default 16, max 255);keyboard.tomlusers keep referencing profiles by name (the macro interns them automatically)
Input devices
- Add Azoteq IQS5xx (IQS550 / IQS572 / IQS525) trackpad driver, used by Azoteq's TPS43/TPS65 modules. Supports operation with or without an
RDYpin and is configurable viakeyboard.tomlon nRF52 / RP2040; currently publishes single-finger relative cursor movement only (#29) - Add PMW3360 / PMW3389 optical mouse sensor support
- Add
report_hzoption for Pmw3610Device - Add per-layer pointing device modes (Cursor / Scroll / Sniper / Caret), so the same trackball scrolls on one layer and moves the cursor on another
- Add opt-in debounce support for rotary encoders
Experimental
- Add Rynk, RMK's native host protocol for on-the-fly configuration over USB and BLE — an alternative to Vial that covers every RMK feature (keymap, layers, encoders, combos, forks, tap-dance/morse, macros, and behavior config), plus live status (current layer, matrix tester, WPM, HID indicators, battery, connection/BLE profile) and device management (reboot, bootloader, storage reset). Enable with the
rynkCargo feature and[host] rynk_enabled = true; it is mutually exclusive with Vial. Dangerous operations (bootloader, storage reset, matrix tester, clearing a BLE bond) are gated behind a physical-presence unlock ([host].unlock_keys). Host client crates live in the newrynk/workspace (#962). Experimental: the wire protocol and host crates can change in any release, the host crates are not published to crates.io, and there is no ready-made desktop app yet. Vial stays the default - Rynk
GetBehaviorConfig/SetBehaviorConfignow carry the default morse profile and the flow-tap prior-idle window, so a Rynk host can read and edit the same behavior settings Vial exposes; flow-tap now resolves per-key profile → default profile →[behavior.morse] enable_flow_tap(#1054) - Add DFU firmware update over USB, so a board with a compatible bootloader can be reflashed without pressing BOOTSEL.
dfu_rp(RP2040) anddfu_nrf(nRF52840) pair RMK with the rmk-boot embassy-boot bootloader, which splits flash into ACTIVE and DFU slots with automatic rollback;dfu_splitforwards firmware to peripherals over a wired split link;dfu_lockgates downloads behind a physical key press. Partition offsets come from the linker symbols in thermk-memory.xthat rmk-boot generates (rename it tomemory.x) —init_flash_from_linkerscriptreads them at runtime, so no address is ever hardcoded (#1018). Experimental: enabling it repartitions flash and the layout can change in any release.dfu_splitis wired-split only; combining it with a BLE build is rejected at compile time - Add
zsa_voyager_blfor the ZSA Voyager's ignition DFU bootloader
Development
- Add a TOML scenario test framework: keyboard behavior cases are written as TOML under
rmk/tests/scenarios/and expanded into ordinary Rust tests byrun_tests!, including rotary encoder input. See the scenario README
Changed
- BREAKING:
run_rmkis replaced by explicit transports plusrun_all!. Every component — matrix, storage, input devices, processors, the keyboard, transports, the watchdog — is a runnable handed to a singlerun_all!invocation, instead of being wired throughjoin/run_devices!/EVENT_CHANNEL. Build aHostServiceonce, then attach it to aUsbTransportand/orBleTransportwith.with_host_service(&host_service) - BREAKING: input devices, input processors, and controllers are unified into one event/processor model. ...
rmk-v0.8.2
What's Changed
Added
- Add PMW3610 optical mouse sensor support for nRF and RP2040 with bit-bang SPI
- Add support for configuring static output pins
- DCDC config for nRF52840/nRF52833
- Add
encoder_mapsupport inkeyboard.toml - Add devcontainer config
- Add sitemap to rmk.rs
Changed
- Make
embedded-hal-asynca required dependency - Update default BLE connection parameters
- Increase the default number of controller channel pub
- Documentation update
Fixed
- Fix compilation error when use
Macro()in keymap config - Fix row2col matrix doesn't work issue
- Fix
lmkey is not properly released
New Contributors
- @zhuren-plbm made their first contribution in #646
- @Henvy-Mango made their first contribution in #654
- @hvuitsme made their first contribution in #657
- @kot149 made their first contribution in #660
- @aziddy made their first contribution in #639
Full Changelog: rmk-v0.8.1...rmk-v0.8.2
rmk-v0.8.1
What's Changed
Changed
- Remove unused
EnumIterinrmk-types - Improve documentation, fix typos
Fixed
- Fix storage ser/de format error
- Fix a bug of Caps Word
New Contributors
Full Changelog: rmk-v0.8.0...rmk-v0.8.1
rmk-v0.8.0
What's Changed
Added
- Add dongle support back, checkout this example
- Add
detentandpulsesettings to encoder config - Add
Controllersupport for peripheral #584 - Add Fn1(Fn3) + Fn2(Fn3) tri-layer support in Vial
- Add LED indicator and layer state sync from central to peripheral
- Add
vialandhostfeature - Add configuration of controller execution mode
- Add capsword support
- Add
default_tx_poweranduse_2m_phyconfig for BLE - Add lock and matrix tester support for Vial
- Add
[host]config section - Support changing permissive hold option at the runtime
Changed
- Bump lots of dependencies to latest version
- Refactor tap-hold, and introduced morse_actions to tap-dance to support real morse code like tap/hold patterns
- Positional and per key morse profile configuration introduced for tap hold like, morse like keys
- Rename chordal tap to unilateral tap
- Rewrite led indicator, use controller system
- Rename
RapidDebouncertoFastDebouncer - Remove
col2row,bidirectionalandrapid_debouncerfeatures - Use postcard for serialization/deserialization of storage data
- Change central sleep timeout to be in seconds
- Migrate documentation site to rspress
Fixed
- Fix invalid macro key
- Fix wrong peripheral number setting in Rust split examples
- Fix modifier activation in lm
- Fix combo reorder issue
- Fix key stuck when one shot key rolling with tap hold
- Fix flow-tap misorder
- Fix peripheral message loss
New Contributors
- @patricios-space made their first contribution in #522
- @Taym95 made their first contribution in #538
- @linrongbin16 made their first contribution in #544
- @archnode made their first contribution in #541
- @willpuckett made their first contribution in #553
- @hdwong made their first contribution in #579
- @thealtofwar made their first contribution in #615
Full Changelog: rmk-v0.7.8...rmk-v0.8.0
rmk-v0.7.8
What's Changed
Added
- Hold-on-other-key-press mode for tap-hold
- Add missing keycode to docs
Changed
- Change
OneShotas a variant ofAction
Fixed
- Permissive hold key rolling error
- Chordal hold triggers tap unexpectly
New Contributors
Full Changelog: rmk-v0.7.7...rmk-v0.7.8
rmk-v0.7.7
What's Changed
Added
- TapDance support
- Extra delay when executing macros
Changed
- CI bloat workflow can comment on PR now
- Report battery percentage instead of adc value, and do the report instantly after boot
- Report battery level via BLE only when there's a key action recently
Fixed
- USB remote wakeup failure
- Overflow in
PollingController
Full Changelog: rmk-v0.7.6...rmk-v0.7.7
rmk-v0.7.6
What's Changed
Changed
- Move encoder events processing to
Keyboard - Use bitfield_struct's native defmt formatting
- Use device id as the serial number for nRF
- Move
KeyAction::WithModifiertoAction::KeyWithModifier - Reset the sidebar style in user documentation
Added
- Add ESP32 heterogeneous example, which uses ESP32C6 as central and ESP32C3 as peripheral
- Add mouse acceleration support
- Add consts for single-bit structs
Fixed
- Repeat message from periphral for serial split
- Crash when the host returns empty data
- Key trigger issue when combo is used with one-shot key
- Key trigger issue when there's overlapped combo
- Don't send battery notification according to control point value from host
- Update addr stored in peripheral after re-pairing
- Repeat mouse key when multiple mouse keys are pressed
New Contributors
- @Suya1671 made their first contribution in #471
- @alex-tdrn made their first contribution in #464
Full Changelog: rmk-v0.7.5...rmk-v0.7.6
rmk-v0.7.5
What's Changed
Fixed
- "No" key with tailing whitespace cannot be parsed
- Key processing error when using tap-hold keys in combo
Full Changelog: rmk-v0.7.4...rmk-v0.7.5
rmk-v0.7.4
What's Changed
Added
- Add sleep mode for split central after connected to the host
Updated
- Refactor key processing, fix tap-hold issues
- Only the valid macro data is stored in the storage now. Clearing storage is required to update
Fixed
- Light service is wrongly disabled
- Correctly update connection parameters after connected to the host
- Remove need for quotes on OSM
Full Changelog: rmk-v0.7.3...rmk-v0.7.4
rmk-v0.7.3
What's Changed
Added
- Logging via USB
- Events for controllers #413
Changed
- Update to TrouBLE v0.2.0
Fixed
- Fixed sdc build error
- Fixed cloud build script for ESP32
Full Changelog: rmk-v0.7.2...rmk-v0.7.3