<divid="app"><divclass="Layout"data-v-5d98c3a5><!--[--><!--]--><!--[--><spantabindex="-1"data-v-0f60ec36></span><ahref="#VPContent"class="VPSkipLink visually-hidden"data-v-0f60ec36> Skip to content </a><!--]--><!----><headerclass="VPNav"data-v-5d98c3a5data-v-ae24b3ad><divclass="VPNavBar has-sidebar top"data-v-ae24b3addata-v-ccf7ddec><divclass="wrapper"data-v-ccf7ddec><divclass="container"data-v-ccf7ddec><divclass="title"data-v-ccf7ddec><divclass="VPNavBarTitle has-sidebar"data-v-ccf7ddecdata-v-ab179fa1><aclass="title"href="/"data-v-ab179fa1><!--[--><!--]--><!--[--><!--[--><!--[--><imgclass="VPImage dark logo"src="/badge-community-dark.svg"altdata-v-8426fc1a><!--]--><!--[--><imgclass="VPImage light logo"src="/badge-community-light.svg"altdata-v-8426fc1a><!--]--><!--]--><!--]--><!----><!--[--><!--]--></a></div></div><divclass="content"data-v-ccf7ddec><divclass="content-body"data-v-ccf7ddec><!--[--><!--]--><divclass="VPNavBarSearch search"data-v-ccf7ddec><!--[--><!----><divid="local-search"><buttontype="button"class="DocSearch DocSearch-Button"aria-label="Search"><spanclass="DocSearch-Button-Container"><spanclass="vp-icon DocSearch-Search-Icon"></span><spanclass="DocSearch-Button-Placeholder">Search</span></span><spanclass="DocSearch-Button-Keys"><kbdclass="DocSearch-Button-Key"></kbd><kbdclass="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><navaria-labelledby="main-nav-aria-label"class="VPNavBarMenu menu"data-v-ccf7ddecdata-v-7f418b0f><spanid="main-nav-aria-label"class="visually-hidden"data-v-7f418b0f>Main Navigation</span><!--[--><!--[--><aclass="VPLink link VPNavBarMenuLink"href="./"tabindex="0"data-v-7f418b0fdata-v-9c663999><!--[--><spandata-v-9c663999>Home</span><!--]--></a><!--]--><!--]--></nav><!----><divclass="VPNavBarAppearance appearance"data-v-ccf7ddecdata-v-e6aabb21><buttonclass="VPSwitch VPSwitchAppearance"type="button"role="switch"title="Switch to dark theme"aria-checked="false"data-v-e6aabb21data-v-d1f28634data-v-1d5665e3><spanclass="check"data-v-1d5665e3><spanclass="icon"data-v-1d5665e3><!--[--><spanclass="vpi-sun sun"data-v-d1f28634></span><spanclass="vpi-moon moon"data-v-d1f28634></span><!--]--></span></span></button></div><divclass="VPSocialLinks VPNavBarSocialLinks social-links"data-v-ccf7ddecdata-v-0394ad82data-v-7bc22406><!--[--><aclass="VPSocialLink no-icon"href="https://reddit.com/r/olkb"aria-labeltarget="_blank"rel="noopener"data-v-7bc22406data-v-eee4e7cb><svgxmlns="http://www.w3.org/2000/svg"viewBox="0 0 50 50"width="50px"height="50px"><pathd="M293C28.0625327.1640633.38281326.54C25.8359384.61718825.3632815.433594256.40625C24.3554698.14062524.08593810.39453124.0312513.03125C19.23437513.17968814.82031314.42187511.2812516.46875C10.21484415.468758.85546914.968757.514.96875C6.08984414.968754.67578115.5117193.5937516.59375C1.42578118.7617191.42578122.2382813.5937524.40625L3.8437524.65625C3.312526.035156327.488281329C333.5273445.56640637.5859389.562540.4375C13.55859443.28906319.007813452545C30.9921884536.44140643.28906340.437540.4375C44.43359437.5859384733.5273444729C4727.48828146.687526.03515646.1562524.65625L46.4062524.40625C48.57421922.23828148.57421918.76171946.4062516.59375C45.32421915.51171943.91015614.9687542.514.96875C41.14453114.9687539.78515615.4687538.7187516.46875C35.19531314.43359430.80078113.19140626.0312513.03125C26.0937510.54687526.3632818.4687526.8757.09375C27.1640636.31640627.5273445.75781327.8755.4375C28.2226565.11718828.5390635295C29.460938529.6835945.12530.031255.40625C30.3789065.687530.7851566.14843831.31256.6875C32.2539067.65234433.6953138.71484436.093758.9375C36.53906311.23828138.574219134113C43.75134610.75468C465.2543.753413C38.605469336.5742194.71093836.093756.96875C34.31256.79687533.5273446.10937532.755.3125C32.3007814.85156331.8867194.312531.31253.843
<spanclass="line"><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">2003</span></span></code></pre></div><p>From the whole QMK team, a major thankyou to the community for embracing QMK as your preferred keyboard firmware!</p><h2id="notable-features"tabindex="-1">Notable Features <aclass="header-anchor"href="#notable-features"aria-label="Permalink to "Notable Features {#notable-features}""></a></h2><h3id="expanded-pointing-device"tabindex="-1">Expanded Pointing Device support (<ahref="https://github.com/qmk/qmk_firmware/pull/14343"target="_blank"rel="noreferrer">#14343</a>) <aclass="header-anchor"href="#expanded-pointing-device"aria-label="Permalink to "Expanded Pointing Device support ([#14343](https://github.com/qmk/qmk_firmware/pull/14343)) {#expanded-pointing-device}""></a></h3><p>Pointing device support has been reworked and reimplemented to allow for easier integration of new peripherals.</p><p>Usages of <code>POINTING_DEVICE_ENABLE = yes</code> in <code>rules.mk</code> files now need to be accompanied by a corresponding <code>POINTING_DEVICE_DRIVER = ???</code> line, specifying which driver to use during the build. Existing keyboards have already been migrated across to the new usage pattern, so most likely no change is required by users.</p><p>QMK now has core-supplied support for the following pointing device peripherals:</p><table><thead><tr><th><code>rules.mk</code> line</th><th>Supported device</th></tr></thead><tbody><tr><td><code>POINTING_DEVICE_DRIVER = analog_joystick</code></td><td>Analog joysticks, such as PSP joysticks</td></tr><tr><td><code>POINTING_DEVICE_DRIVER = adns5050</code></td><td>ADNS 5050 sensor</td></tr><tr><td><code>POINTING_DEVICE_DRIVER = adns9800</code></td><td>ADNS 9800 laser sensor</td></tr><tr><td><code>POINTING_DEVICE_DRIVER = cirque_pinnacle_i2c</code></td><td>Cirque touchpad, I2C mode</td></tr><tr><td><code>POINTING_DEVICE_DRIVER = cirque_pinnacle_spi</code></td><td>Cirque Touchpad, SPI mode</td></tr><tr><td><code>POINTING_DEVICE_DRIVER = pimoroni_trackball</code></td><td>Pimoroni Trackball</td></tr><tr><td><code>POINTING_DEVICE_DRIVER = pmw3360</code></td><td>PMW 3360</td></tr></tbody></table><p>See the new documentation for the <ahref="./../feature_pointing_device">Pointing Device</a> feature for more information on specific configuration for each driver.</p><h3id="dynamic-tapping-term"tabindex="-1">Dynamic Tapping Term (<ahref="https://github.com/qmk/qmk_firmware/pull/11036"target="_blank"rel="noreferrer">#11036</a>) <aclass="header-anchor"href="#dynamic-tapping-term"aria-label="Permalink to "Dynamic Tapping Term ([#11036](https://github.com/qmk/qmk_firmware/pull/11036)) {#dynamic-tapping-term}""></a></h3><p>For people who are starting out with tapping keys, or for people who think tapping keys don't "feel right", it's sometimes quite difficult to determine what duration of tapping term to use to make things seem natural.</p><p>If you're in this stage of discovery, you can now add <code>DYNAMIC_TAPPING_TERM_ENABLE = yes</code> to your <code>rules.mk</code>, which enables the use of the following keycodes in your keymap:</p><table><thead><tr><th>Key</th><th>Description</th></tr></thead><tbody><tr><td><code>DT_PRNT</code></td><td>"Dynamic Tapping Term Print": Types the current tapping term, in milliseconds</td></tr><tr><td><code>DT_UP</code></td><td>"Dynamic Tapping Term Up": Increases the current tapping term by 5ms</td></tr><tr><td><code>DT_DOWN</code></td><td>"Dynamic Tapping Term Down": Decreases the current tapping term by 5ms</td></tr></tbody></table><p>Coupled with the use of <code>qmk console</code> or QMK Toolbox to show console output from your keyboard, you can tweak the tapping term dynamically in order to narrow down what "feels right" to you. Once you're happy, drop in the resulting number into your keymap's <code>config.h</code> and you're good to go!</p><h3id="macros-in-keymap-json"tabindex="-1">Macros in JSON keymaps (<
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [ </span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// first listed is QK_MACRO_0...</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>In due course, <ahref="https://config.qmk.fm/"target="_blank"rel="noreferrer">QMK Configurator</a> will pick up support for defining these in its UI, but for now the json is the only way to define macros.</p><h2id="changes-requiring-user-action"tabindex="-1">Changes Requiring User Action <aclass="header-anchor"href="#changes-requiring-user-action"aria-label="Permalink to "Changes Requiring User Action {#changes-requiring-user-action}""></a></h2><h3id="updated-keyboard-codebases"tabindex="-1">Updated Keyboard Codebases <aclass="header-anchor"href="#updated-keyboard-codebases"aria-label="Permalink to "Updated Keyboard Codebases {#updated-keyboard-codebases}""></a></h3><p>The following keyboards have had their source moved within QMK:</p><table><thead><tr><th>Old Keyboard Name</th><th>New Keyboard Name</th></tr></thead><tbody><tr><td>aozora/hotswap</td><td>aozora</td></tr><tr><td>gskt00</td><td>kapcave/gskt00</td></tr><tr><td>handwired/dtisaac01</td><td>dtisaac/dtisaac01</td></tr><tr><td>kprepublic/bm60poker</td><td>kprepublic/bm60hsrgb_poker/rev1</td></tr><tr><td>kprepublic/bm60rgb</td><td>kprepublic/bm60hsrgb/rev1</td></tr><tr><td>kprepublic/bm60rgb_iso</td><td>kprepublic/bm60hsrgb_iso/rev1</td></tr><tr><td>kprepublic/bm65iso</td><td>kprepublic/bm65hsrgb_iso</td></tr><tr><td>kprepublic/bm68rgb</td><td>kprepublic/bm68hsrgb</td></tr><tr><td>paladin64</td><td>kapcave/paladin64</td></tr><tr><td>portal_66</td><td>portal_66/soldered</td></tr><tr><td>signum/3_0/elitec</td><td>signum/3_0</td></tr><tr><td>tgr/jane</td><td>tgr/jane/v2</td></tr></tbody></table><h3id="squeezing-space-from-avr"tabindex="-1">Squeezing space out of AVR (<ahref="https://github.com/qmk/qmk_firmware/pull/15243"target="_blank"rel="noreferrer">#15243</a>) <aclass="header-anchor"href="#squeezing-space-from-avr"aria-label="Permalink to "Squeezing space out of AVR ([#15243](https://github.com/qmk/qmk_firmware/pull/15243)) {#squeezing-space-from-avr}""></a></h3><p>The AVR platform has been problematic for some time, in the sense that it is severely resource-constrained -- this makes life difficult for anyone attempting to add new functionality such as display panels to their keymap code. The illustrious Drashna has contributed some newer documentation on how to attempt to free up some space on AVR-based keyboards that are in short supply.</p><p>Of course, there are much fewer constraints with ARM chips... 😉</p><h3id="explicit-rgb-modes"tabindex="-1">Require explicit enabling of RGB Matrix modes (<ahref="https://github.com/qmk/qmk_firmware/pull/15018"target="_blank"rel="noreferrer">#15018</a>) <aclass="header-anchor"href="#explicit-rgb-modes"aria-label="Permalink to "Require explicit enabling of RGB Matrix modes ([#15018](https://github.com/qmk/qmk_firmware/pull/15018)) {#explicit-rgb-modes}""></a></h3><p>Related to the previous section -- RGB Matrix modes have now been made to be opt-in, rather than opt-out. As these animations are now opt-in, you may find that your keyboard no longer has all the RGB modes you're expecting -- you may need to configure and recompile your firmware and enable your animations of choice... with any luck they'll still fit in the space available.</p><p>Most keyboards keep their original functionality, but over time the QMK maintainers have found that removal of animations ends up being the quickest way to free up space... and some keyboards have had animations such as reactive effects disabled by default in order to still fit within the flash space available.</p><p>The full list of configurables to turn specific animations back on can be found at on the <ahref="./../feature_rgb_matrix#rgb-matrix-effects">RGB Matrix documentation</a> page.</p><h3id="oled-task-refactor"tabindex="-1">OLED task refactoring (<ahref="https://github.com/qmk/qmk_firmware/pull/14864"target="_blank"rel="noreferrer">#14864</a>) <aclass="header-anchor"h
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>Keyboard designers should now structure their keyboard-level drawing routines like the following, in order to allow for keymap overrides:</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">bool</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> oled_task_kb</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Defer to the keymap if they want to override</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><h3id="bootmagic-full-removal"tabindex="-1">Bootmagic Full Removal (<ahref="https://github.com/qmk/qmk_firmware/pull/15002"target="_blank"rel="noreferrer">#15002</a>) <aclass="header-anchor"href="#bootmagic-full-removal"aria-label="Permalink to "Bootmagic Full Removal ([#15002](https://github.com/qmk/qmk_firmware/pull/15002)) {#bootmagic-full-removal}""></a></h3><p>As noted during previous breaking changes cycles, QMK decided to deprecate the full Bootmagic feature and leave Bootmagic Lite as the only remaining option.</p><p>This removal is now complete!</p><p>This pull request changes the behavior of <code>BOOTMAGIC_ENABLE</code> such that specifying <code>lite</code> or <code>full</code> results in an error, allowing only <code>yes</code> or <code>no</code>, with <code>yes</code> mirroring historical <code>lite</code> functionality.</p><p>All use of the <code>lite</code> keyword within the repository has been migrated to <code>yes</code> -- any new submissions using <code>lite</code> will now fail to build and should be updated accordingly.</p><h4id="bootmagic-full-deprecation-schedule-complete"tabindex="-1">Bootmagic Full Deprecation Schedule: Complete! <aclass="header-anchor"href="#bootmagic-full-deprecation-schedule-complete"aria-label="Permalink to "Bootmagic Full Deprecation Schedule: Complete!""></a></h4><p>This is the historical timeline for the behavior of <code>BOOTMAGIC_ENABLE</code>:</p><ul><li>(done) From 2021 May 29, setting <code>BOOTMAGIC_ENABLE = yes</code> will enable Bootmagic Lite instead of full Bootmagic.</li><li>(done) From 2021 Aug 28, <code>BOOTMAGIC_ENABLE</code> must be either <code>yes</code>, <code>lite</code>, or <code>no</code>– setting <code>BOOTMAGIC_ENABLE = full</code> will cause compilation to fail.</li><li>(now) From 2021 Nov 27, <code>BOOTMAGIC_ENABLE</code> must be either <code>yes</code> or <code>no</code>– setting <code>BOOTMAGIC_ENABLE = lite</code> will cause compilation to fail.</li></ul><h3id="remove-qwiic"tabindex="-1">Remove QWIIC_DRIVERS (<ahref="https://github.com/qmk/qmk_firmware/pull/14174"target="_blank"rel="noreferrer">#14174</a>) <aclass="header-anchor"href="#remove-qwiic"aria-label="Permalink to "Remove QWIIC_DRIVERS ([#14174](https://github.com/qmk/qmk_firmware/pull/14174)) {#remove-qwiic}""></a></h3><p>Due to minimal QWIIC adoption and other options for similar functionality, the QWIIC drivers were removed from QMK. Existing OLED usages have been migrated across to the normal QMK OLED driver instead.</p><h2id="notable-core"tabindex="-1">Notable core changes <aclass="header-anchor"href="#notable-core"aria-label="Permalink to "Notable core changes {#notable-core}""></a></h2><h3id="new-mcu-support"tabindex="-1">New MCU Support <aclass="header-anchor"href="#new-mcu-support"aria-label="Permalink to "New MCU Support {#new-mcu-support}""></a></h3><p>QMK firmware picked up support for a handful of new MCU families, potentially making it a bit easier to source components.</p><p>QMK firmware is now no longer limited to AVR and ARM - it also picked up support for our first RISC-V chip, the GD32VF103.</p><ul><li>Add support for RISC-V builds and GD32VF103 MCU (<ahref="https://github.com/qmk/qmk_firmware/pull/12508"target="_blank"rel="noreferrer">#12508</a>)</li><li>Add HT32 support to core (<ahref="https://github.com/qmk/qmk_firmware/pull/14388"target="_blank"rel="noreferrer">#14388</a>)</li><li>Westberrytech pr (<ahref="https://github.com/qmk/qmk_firmware/pull/14422"target="_blank"rel="noreferrer">#14422</a>)</li><li>Initial pass of F405 support (<ahref="https://github.com/qmk/qmk_firmware/pull/14584"target="_blank"rel="noreferrer">#14584</a>)</li></ul><h3id="eeprom-changes"tabindex="-1">EEPROM Changes <aclass="header-anchor"href="#eeprom-changes"aria-label="Permalink to "EEPROM Changes {#eeprom-changes}""></a></h3><p>There were a few