# QMK Breaking Changes - 2026 August 30 Changelog

## Notable Changes {#notable-changes}

### Community Modules `1.1.3` ([#26201](https://github.com/qmk/qmk_firmware/pull/26201)) {#community-modules}

Version 1.1.3 adds support for persistent data in community modules. Modules can now store and restore their own state across restarts, enabling more stateful behavior without relying on keyboard-level EEPROM handling. A reference example can be located at [modules/qmk/nvm_test](https://github.com/qmk/qmk_firmware/tree/develop/modules/qmk/nvm_test).

See the [Community Modules documentation](../features/community_modules) for more information, including the full list of available hooks.

### Steno Feature Updates ([#26273](https://github.com/qmk/qmk_firmware/pull/26273), [#26018](https://github.com/qmk/qmk_firmware/pull/26018)) {#steno}

The steno feature has been reworked around a clearer integration, including a more consistent keycode naming scheme.
Users should migrate old `STN_*` and legacy mode names to the new `QK_STENO_*`/`ST_*` naming scheme.

::: warning
Keycode aliases have been put in place in most cases to cater for "old names" being mapped to "new names" -- the documentation already reflects all the new naming of keys.
:::

<details>
    <summary>Full list of updated keycodes</summary>

| Old Keycode          | New Keycode            | Aliases            |
|----------------------|------------------------|--------------------|
| `STN_FN`             | `QK_STENO_FUNCTION`    | `ST_FN`            |
| `STN_N1`/`STN_NUM`   | `QK_STENO_N1`          | `ST_N1`/`ST_NUM`   |
| `STN_N2`             | `QK_STENO_N2`          | `ST_N2`            |
| `STN_N3`             | `QK_STENO_N3`          | `ST_N3`            |
| `STN_N4`             | `QK_STENO_N4`          | `ST_N4`            |
| `STN_N5`             | `QK_STENO_N5`          | `ST_N5`            |
| `STN_N6`             | `QK_STENO_N6`          | `ST_N6`            |
| `STN_S1`/`STN_SL`    | `QK_STENO_S1`          | `ST_S1`/`ST_SL`    |
| `STN_S2`             | `QK_STENO_S2`          | `ST_S2`            |
| `STN_TL`             | `QK_STENO_TL`          | `ST_TL`            |
| `STN_KL`             | `QK_STENO_KL`          | `ST_KL`            |
| `STN_PL`             | `QK_STENO_PL`          | `ST_PL`            |
| `STN_WL`             | `QK_STENO_WL`          | `ST_WL`            |
| `STN_HL`             | `QK_STENO_HL`          | `ST_HL`            |
| `STN_RL`             | `QK_STENO_RL`          | `ST_RL`            |
| `STN_A`              | `QK_STENO_A`           | `ST_A`             |
| `STN_O`              | `QK_STENO_O`           | `ST_O`             |
| `STN_ST1`/`STN_STR`  | `QK_STENO_ST1`         | `ST_ST1`/`ST_STR`  |
| `STN_ST2`            | `QK_STENO_ST2`         | `ST_ST2`           |
| `STN_RE1`/`STN_RES1` | `QK_STENO_RESET1`      | `ST_RES1`/`ST_RE1` |
| `STN_RE2`/`STN_RES2` | `QK_STENO_RESET2`      | `ST_RES2`/`ST_RE2` |
| `STN_PWR`            | `QK_STENO_POWER`       | `ST_PWR`           |
| `STN_ST3`            | `QK_STENO_ST3`         | `ST_ST3`           |
| `STN_ST4`            | `QK_STENO_ST4`         | `ST_ST4`           |
| `STN_E`              | `QK_STENO_E`           | `ST_E`             |
| `STN_U`              | `QK_STENO_U`           | `ST_U`             |
| `STN_FR`             | `QK_STENO_FR`          | `ST_FR`            |
| `STN_RR`             | `QK_STENO_RR`          | `ST_RR`            |
| `STN_PR`             | `QK_STENO_PR`          | `ST_PR`            |
| `STN_BR`             | `QK_STENO_BR`          | `ST_BR`            |
| `STN_LR`             | `QK_STENO_LR`          | `ST_LR`            |
| `STN_GR`             | `QK_STENO_GR`          | `ST_GR`            |
| `STN_TR`             | `QK_STENO_TR`          | `ST_TR`            |
| `STN_SR`             | `QK_STENO_SR`          | `ST_SR`            |
| `STN_DR`             | `QK_STENO_DR`          | `ST_DR`            |
| `STN_N7`             | `QK_STENO_N7`          | `ST_N7`            |
| `STN_N8`             | `QK_STENO_N8`          | `ST_N8`            |
| `STN_N9`             | `QK_STENO_N9`          | `ST_N9`            |
| `STN_NA`             | `QK_STENO_NA`          | `ST_NA`            |
| `STN_NB`             | `QK_STENO_NB`          | `ST_NB`            |
| `STN_NC`             | `QK_STENO_NC`          | `ST_NC`            |
| `STN_ZR`             | `QK_STENO_ZR`          | `ST_ZR`            |
| `STN_SL`             | `QK_STENO_S1`          | `ST_S1`            |
| `STN_STR`            | `QK_STENO_ST1`         | `ST_ST1`           |
| `STN_S3`             | `QK_STENO_S3`          | `ST_S3`            |
| `STN_TKL`            | `QK_STENO_TKL`         | `ST_TKL`           |
| `STN_PWL`            | `QK_STENO_PWL`         | `ST_PWL`           |
| `STN_HRL`            | `QK_STENO_HRL`         | `ST_HRL`           |
| `STN_FRR`            | `QK_STENO_FRR`         | `ST_FRR`           |
| `STN_PBR`            | `QK_STENO_PBR`         | `ST_PBR`           |
| `STN_LGR`            | `QK_STENO_LGR`         | `ST_LGR`           |
| `STN_TSR`            | `QK_STENO_TSR`         | `ST_TSR`           |
| `STN_DZR`            | `QK_STENO_DZR`         | `ST_DZR`           |
| `STN_AO`             | `QK_STENO_AO`          | `ST_AO`            |
| `STN_EU`             | `QK_STENO_EU`          | `ST_EU`            |
| `QK_STENO_BOLT`      | `QK_STENO_MODE_BOLT`   | `ST_BOLT`          |
| `QK_STENO_GEMINI`    | `QK_STENO_MODE_GEMINI` | `ST_GEMI`          |

</details>

Support for the [Plover custom HID protocol](https://github.com/opensteno/plover/releases/tag/v5.1.0) has also been integrated. This provides an alternative to the COM port based Gemini and Bolt protocols, and extends steno support to VUSB based devices.

::: info Note
A tighter integration of the Plover HID protocol into the steno feature is planned for a future release.
:::

See the [Stenography Feature](../features/stenography) documentation for more information.

### Remove pin ordering restriction in RP2040 ps2 driver ([#26256](https://github.com/qmk/qmk_firmware/pull/26256)) {#rp2040-ps2}

The RP2040 PS/2 driver no longer requires a strict clock/data pin ordering. This removes an unnecessary wiring restriction for RP2040-based keyboards and allows more valid PS/2 layouts to work without needing to match a specific pin sequence.

### Restrict the EXTRAKEY_ENABLE System Control HID usage range. ([#26295](https://github.com/qmk/qmk_firmware/pull/26295)) {#extrakey-gamepad}

QMK now limits the default System Control HID range exposed by `EXTRAKEY_ENABLE` to the safe subset it actually uses. This prevents issues where some hosts to misidentify the device as a gamepad.

To widen the range to the old behavior, the following can be added to a `config.h`:

```c
#define SYSTEM_CONTROL_USAGE_MINIMUM 0x0001
#define SYSTEM_CONTROL_USAGE_MAXIMUM 0x00B7
```

::: warning
Only widen it if you need the extra usages and know your host handles them.
:::

### Updated Keyboard Codebases {#updated-keyboard-codebases}

| Old Keyboard Name   | New Keyboard Name        |
|---------------------|--------------------------|
| ducky/one2sf/1967st | ducky/one2sf/1967st/ansi |

## Deprecation Notices

In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.

### VIA Feature Migration ([#26315](https://github.com/qmk/qmk_firmware/pull/26315)) {#via-module}

As part of long-term goal to progressively reduce the maintenance burden on the project, upkeep of the VIA integration will transition to the VIA team.

This allows the VIA team to support many more custom keyboard configurations, as well as reduces the turnaround time for any changes to the VIA protocol they wish to make.

Backwards compatibility will remain for a transition period and in a future release, the old VIA feature-based implementation is expected to be removed.

## Full changelist

Core:
* Custom plover HID report type ([#26018](https://github.com/qmk/qmk_firmware/pull/26018))
* Enable modules to persist data ([#26201](https://github.com/qmk/qmk_firmware/pull/26201))
* Preserve Azoteq mouse buttons ([#26248](https://github.com/qmk/qmk_firmware/pull/26248))
* Remove pin ordering restriction in RP2040 ps2 driver ([#26256](https://github.com/qmk/qmk_firmware/pull/26256))
* Plover HID cleanup. ([#26262](https://github.com/qmk/qmk_firmware/pull/26262))
* repeat_key.c: add implementation for get_last_record ([#26263](https://github.com/qmk/qmk_firmware/pull/26263))
* Implement Plover HID for VUSB ([#26267](https://github.com/qmk/qmk_firmware/pull/26267))
* process_key_lock: clear entire key state in cancel_key_lock() ([#26269](https://github.com/qmk/qmk_firmware/pull/26269))
* Initial rework of steno feature ([#26273](https://github.com/qmk/qmk_firmware/pull/26273))
* qp_lvgl: always signal flush ready even with no display ([#26275](https://github.com/qmk/qmk_firmware/pull/26275))
* Consistently handle datablock init ([#26282](https://github.com/qmk/qmk_firmware/pull/26282))
* Make framebuffer effects honour `rgb_matrix_map_row_column_to_led` ([#26294](https://github.com/qmk/qmk_firmware/pull/26294))
* Restrict the EXTRAKEY_ENABLE System Control HID usage range. ([#26295](https://github.com/qmk/qmk_firmware/pull/26295))
* Port typing_heatmap animation to LED Matrix ([#26300](https://github.com/qmk/qmk_firmware/pull/26300))
* Add `_noeeprom` variants of backlight enable/disable. ([#26328](https://github.com/qmk/qmk_firmware/pull/26328))
* Add STM32_USB_USE_OTG2 to USB_ENDPOINTS_ARE_REORDERABLE ([#26369](https://github.com/qmk/qmk_firmware/pull/26369))
* Change preprocessor directive for random solenoid firing ([#26377](https://github.com/qmk/qmk_firmware/pull/26377))
* Rework Plover HID to use Steno keycodes ([#26421](https://github.com/qmk/qmk_firmware/pull/26421))

CLI:
* Require `--keyboard` for some CLI subcommands ([#26308](https://github.com/qmk/qmk_firmware/pull/26308))
* Be lazier in loading keyboard schema for new-keyboard ([#26340](https://github.com/qmk/qmk_firmware/pull/26340))

Keyboards:
* Addition of the Ymdk Oni Tsangan/HHKB-like pcb ([#25230](https://github.com/qmk/qmk_firmware/pull/25230))
* Add converter/thinkpad_t6x/pico_t61 keyboard ([#26266](https://github.com/qmk/qmk_firmware/pull/26266))
* Add additional layouts for `mkh_studio/bully` ([#26271](https://github.com/qmk/qmk_firmware/pull/26271))
* Split `ducky/one2sf/1967st` into `ansi`/`iso` variants ([#26277](https://github.com/qmk/qmk_firmware/pull/26277))
* Automatically handle duplicate matrix LED mappings ([#26278](https://github.com/qmk/qmk_firmware/pull/26278))
* Tidy sawnsprojects/satxri6key ([#26317](https://github.com/qmk/qmk_firmware/pull/26317))
* Update satisfaction75 to only use keyboard datablock ([#26320](https://github.com/qmk/qmk_firmware/pull/26320))
* Migrate remaining `VIA_EEPROM_CUSTOM_CONFIG_SIZE` to `EECONFIG_KB_DATA_SIZE` ([#26321](https://github.com/qmk/qmk_firmware/pull/26321))
* Use core `spi_init` implementation for gmmk/gmmk2/p96 ([#26344](https://github.com/qmk/qmk_firmware/pull/26344))
* Convert `novelkeys/nk87` to use RGB Matrix ([#26349](https://github.com/qmk/qmk_firmware/pull/26349))
* Update magic_force/mf17 to WS2812 PWM driver ([#26384](https://github.com/qmk/qmk_firmware/pull/26384))
* Keycult TKL Updates ([#26385](https://github.com/qmk/qmk_firmware/pull/26385))
* Update keyboards to implement `led_update_kb` instead of `led_set` ([#26388](https://github.com/qmk/qmk_firmware/pull/26388))

Keyboard fixes:
* Fix nifty_numpad issues ([#26283](https://github.com/qmk/qmk_firmware/pull/26283))
* Fix use of `via.h` ([#26316](https://github.com/qmk/qmk_firmware/pull/26316))

Others:
* Update RGB Matrix documentation to include JSON config ([#26187](https://github.com/qmk/qmk_firmware/pull/26187))
* Update encoder documents for json config ([#26188](https://github.com/qmk/qmk_firmware/pull/26188))
* Update LED Matrix documentation to include JSON config ([#26425](https://github.com/qmk/qmk_firmware/pull/26425))

Bugs:
* First pass of ruff check fixes ([#26257](https://github.com/qmk/qmk_firmware/pull/26257))
* Use `memmove` for overlapping copies in RGB/LED matrix last-hit tracker ([#26306](https://github.com/qmk/qmk_firmware/pull/26306))
* Fix to make Repeat Key QK_REP work with Key Overrides. ([#26312](https://github.com/qmk/qmk_firmware/pull/26312))
* Fix SEQUENCER_ENABLE so the sequencer feature builds again ([#26322](https://github.com/qmk/qmk_firmware/pull/26322))
* Fix ChibiOS virtual serial short packet receive ([#26356](https://github.com/qmk/qmk_firmware/pull/26356))
* Resolve recursive keyboard aliases when locating userspace keymaps ([#26402](https://github.com/qmk/qmk_firmware/pull/26402))
* Fix `EECONFIG_MODULE_DATA_SIZE` for modules with zero provisioned eeconfig ([#26414](https://github.com/qmk/qmk_firmware/pull/26414))
* Align USB endpoint buffers to fix RP2040 Plover HID issues ([#26417](https://github.com/qmk/qmk_firmware/pull/26417))
* Fix 'qmk generate-develop-pr-list' for ghapi v2 ([#26428](https://github.com/qmk/qmk_firmware/pull/26428))
