Skip to content

Releases: rmk-rs/rmk

RMK v0.9.0

Choose a tag to compare

@github-actions github-actions released this 29 Aug 07:22
986017d

Added

Connectivity

  • Add BLE dongle support (dongle Cargo 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 — and User(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_ble chip 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_description values 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 (subrating feature), 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 (display Cargo feature) with a [display] section in keyboard.toml. Ships oled_async drivers for SH1106, SH1107, SH1108 and SSD1309, plus lcd-async for 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 (steno Cargo feature): a steno HID descriptor and USB endpoint, an Action::Steno keycode with STN(key) syntax in keyboard.toml, and a live-state reporter
  • Flush only the dirty rectangle in LcdAsyncDisplay (#1070)

Behaviors

  • Add bootmagic config: 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::boot module public so user code can call boot::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 timeout of inactivity (#781) with deactivate_on_key (with extra_mouse_keys) and reset_timeout_on_key options; entry capacity is auto-derived from keyboard.toml, overridable via [rmk].auto_mouse_layer_max_num
  • Add quick_tap_timeout morse 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_release option under [behavior.one_shot_modifiers]
  • Add a prior_idle_time cooldown 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) to keyboard.toml keymaps
  • Add a bilateral marker to [layout].map, so same-hand modifiers still work when unilateral_tap is enabled
  • Allow overriding flow_tap per 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 from vial_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 u8 index into a small deduplicated morse profile table (MorsesConfig::profiles) instead of an inline 8-byte MorseProfile. KeyAction::TapHold drops from 16 to 7 bytes, which also removes the profile's 8-byte alignment padding across every KeyAction-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.toml users 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 RDY pin and is configurable via keyboard.toml on nRF52 / RP2040; currently publishes single-finger relative cursor movement only (#29)
  • Add PMW3360 / PMW3389 optical mouse sensor support
  • Add report_hz option 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 rynk Cargo 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 new rynk/ 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/SetBehaviorConfig now 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) and dfu_nrf (nRF52840) pair RMK with the rmk-boot embassy-boot bootloader, which splits flash into ACTIVE and DFU slots with automatic rollback; dfu_split forwards firmware to peripherals over a wired split link; dfu_lock gates downloads behind a physical key press. Partition offsets come from the linker symbols in the rmk-memory.x that rmk-boot generates (rename it to memory.x) — init_flash_from_linkerscript reads them at runtime, so no address is ever hardcoded (#1018). Experimental: enabling it repartitions flash and the layout can change in any release. dfu_split is wired-split only; combining it with a BLE build is rejected at compile time
  • Add zsa_voyager_bl for 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 by run_tests!, including rotary encoder input. See the scenario README

Changed

  • BREAKING: run_rmk is replaced by explicit transports plus run_all!. Every component — matrix, storage, input devices, processors, the keyboard, transports, the watchdog — is a runnable handed to a single run_all! invocation, instead of being wired through join/run_devices!/EVENT_CHANNEL. Build a HostService once, then attach it to a UsbTransport and/or BleTransport with .with_host_service(&host_service)
  • BREAKING: input devices, input processors, and controllers are unified into one event/processor model. ...
Read more

rmk-v0.8.2

Choose a tag to compare

@HaoboGu HaoboGu released this 18 Dec 12:34
bffed9a

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_map support in keyboard.toml
  • Add devcontainer config
  • Add sitemap to rmk.rs

Changed

  • Make embedded-hal-async a 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 lm key is not properly released

New Contributors

Full Changelog: rmk-v0.8.1...rmk-v0.8.2

rmk-v0.8.1

Choose a tag to compare

@HaoboGu HaoboGu released this 28 Nov 16:14

What's Changed

Changed

  • Remove unused EnumIter in rmk-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

Choose a tag to compare

@HaoboGu HaoboGu released this 25 Nov 14:32

What's Changed

Added

  • Add dongle support back, checkout this example
  • Add detent and pulse settings to encoder config
  • Add Controller support 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 vial and host feature
  • Add configuration of controller execution mode
  • Add capsword support
  • Add default_tx_power and use_2m_phy config 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 RapidDebouncer to FastDebouncer
  • Remove col2row, bidirectional and rapid_debouncer features
  • 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

Full Changelog: rmk-v0.7.8...rmk-v0.8.0

rmk-v0.7.8

Choose a tag to compare

@HaoboGu HaoboGu released this 23 Jul 14:45
be098fb

What's Changed

Added

  • Hold-on-other-key-press mode for tap-hold
  • Add missing keycode to docs

Changed

  • Change OneShot as a variant of Action

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

Choose a tag to compare

@HaoboGu HaoboGu released this 21 Jul 14:27
888404a

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

Choose a tag to compare

@HaoboGu HaoboGu released this 15 Jul 13:56
b499090

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::WithModifier to Action::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

Full Changelog: rmk-v0.7.5...rmk-v0.7.6

rmk-v0.7.5

Choose a tag to compare

@HaoboGu HaoboGu released this 06 Jul 04:48
5cdb8b3

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

Choose a tag to compare

@HaoboGu HaoboGu released this 03 Jul 06:11
a281dcc

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

Choose a tag to compare

@HaoboGu HaoboGu released this 18 Jun 08:31

What's Changed

Added

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