<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (state </span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">&</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">UL<<</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">&&</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> state </span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">&</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">UL<<</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)) {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> layer_on</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(_ADJUST);</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // C on esc</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (state </span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">&</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">UL<<</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">&&</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> state </span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">&</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">UL<<</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)) {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> layer_on</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(_ADJUST);</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // C on esc</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Returning true allows keyboard code to execute, false will tell the keyboard code "I've already handled it".</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><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="split-transport-improvements"tabindex="-1">Split transport improvements <aclass="header-anchor"href="#split-transport-improvements"aria-label="Permalink to "Split transport improvements {#split-transport-improvements}""></a></h3><p>Split keyboards gained a significant amount of improvements during this breaking changes cycle, specifically:</p><ul><li>Extensible split data sync (<ahref="https://github.com/qmk/qmk_firmware/pull/11930"target="_blank"rel="noreferrer">#11930</a>) -- rewritten data sharing between sides, allowing for data transfer only when required, as well as enabling keyboards and keymaps to define their own shared data.</li><li>Full-duplex ARM USART split (<ahref="https://github.com/qmk/qmk_firmware/pull/13081"target="_blank"rel="noreferrer">#13081</a>) -- adds to the previous half-duplex driver and now allows for full-duplex support on ARM.</li><li>Make solo half of split keyboards (more) usable. (<ahref="https://github.com/qmk/qmk_firmware/pull/13523"target="_blank"rel="noreferrer">#13523</a>) -- allows the slave to be disconnected, enabling one-handed use.</li><li>Switch split_common to CRC subsystem (<ahref="https://github.com/qmk/qmk_firmware/pull/13418"target="_blank"rel="noreferrer">#13418</a>)</li></ul><divclass="warning custom-block"><pclass="custom-block-title">WARNING</p><p>If you're updating your split keyboard, you will need to flash both sides of the split with the your firmware.</p></div><h3id="teensy-4-x-support"tabindex="-1">Teensy 4.x support (<ahref="https://github.com/qmk/qmk_firmware/pull/13056"target="_blank"rel="noreferrer">#13056</a>, <ahref="https://github.com/qmk/qmk_firmware/pull/13076"target="_blank"rel="noreferrer">#13076</a>, <ahref="https://github.com/qmk/qmk_firmware/pull/13077"target="_blank"rel="noreferrer">#13077</a>) <aclass="header-anchor"href="#teensy-4-x-support"aria-label="Permalink to "Teensy 4.x support ([#13056](https://github.com/qmk/qmk_firmware/pull/13056), [#13076](https://github.com/qmk/qmk_firmware/pull/13076), [#13077](https://github.com/qmk/qmk_firmware/pull/13077)) {#teensy-4-x-support}""></a></h3><p>Updated ChibiOS and ChibiOS-Contrib, which brought in support for Teensy 4.x dev boards, running NXP i.MX1062.</p><h3id="data-driven-improvements-13366"tabindex="-1">Data Driven Improvements (<ahref="https://github.com/qmk/qmk_firmware/pull/13366"target="_blank"rel="noreferrer">#13366</a>) <aclass="header-anchor"href="#data-driven-improvements-13366"aria-label="Permalink to "Data Driven Improvements ([#13366](https://github.com/qmk/qmk_firmware/pull/13366))""></a></h3><p>QMK's pursuit of data-driven keyboards has progressed, allowing substantially more configurable options to be specified in <code>info.json</code>.</p><h4id="tags"tabindex="-1">Tags <aclass="header-anchor"href="#tags"aria-label="Permalink to "Tags""></a></h4><p>Tags will let you categorize your keyboard, and will be used in the future to allow browsing and sorting through keyboards in QMK. Tags are free-form text identifiers that identify attributes about your keyboard. To add tags you simply add a <code>tags</code> key to your <code>info.json</code>:</p><pre><code>"tags": ["tkl", "backlight", "encoder"]
</code></pre><h4id="dot-notation"tabindex="-1">Dot Notation <aclass="header-anchor"href="#dot-notation"aria-label="Permalink to "Dot Notation""></a></h4><p>With this release we are moving towards using JSON dot notation in more places. For example, when using <code>qmk info -f text</code>:</p><divclass="language- vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang"></span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><span>$ qmk info -f text -kb clueboard/card</span></span>
<spanclass="line"><span> width: 10</span></span></code></pre></div><h4id="new-configuration-keys"tabindex="-1">New configuration keys <aclass="header-anchor"href="#new-configuration-keys"aria-label="Permalink to "New configuration keys""></a></h4><p>We've added dozens of new keys to <code>info.json</code> so that you can configure more than ever without writing a single line of code. A quick overview of the new items you can configure:</p><ul><li><code>audio.pins</code>, <code>audio.voices</code></li><li><code>backlight.breathing</code>, <code>backlight.breathing_period</code>, <code>backlight.levels</code>, <code>backlight.pin</code>,</li><li><code>bluetooth.driver</code>, <code>bluetooth.lto</code></li><li><code>bootloader_instructions</code></li><li><code>build.debounce_type</code>, <code>build.firmware_format</code>, <code>build.lto</code></li><li><code>combo.count</code>, <code>combo.term</code></li><li><code>leader_key.timing</code>, <code>leader_key.strict_processing</code>, <code>leader_key.timeout</code></li><li><code>matrix.custom</code>, <code>matrix.custom_lite</code>, <code>matrix.ghost</code>, <code>matrix.io_delay</code></li><li><code>mouse_key.enabled</code>, <code>mouse_key.delay</code>, <code>mouse_key.interval</code>, <code>mouse_key.max_speed</code>, <code>mouse_key.time_to_max</code>, <code>mouse_key.wheel_delay</code></li><li><code>oneshot.tap_toggle</code>, <code>oneshot.timeout</code></li><li><code>rgblight.layers.blink</code>, <code>rgblight.layers.enabled</code>, <code>rgblight.layers.max</code>, <code>rgblight.layers.override_rgb</code>, <code>rgblight.rgbw</code></li><li><code>split.enabled</code>, <code>split.matrix_grid</code>, <code>split.matrix_pins</code>, <code>split.main</code>, <code>split.soft_serial_pin</code>, <code>split.soft_serial_speed</code>, <code>split.transport.protocol</code>, <code>split.transport.sync_matrix_state</code>, <code>split.transport.sync_modifiers</code>, <code>split.usb_detect</code></li><li><code>tapping.force_hold</code>, <code>tapping.force_hold_per_key</code>, <code>tapping.ignore_mod_tap_interrupt</code>, <code>tapping.ignore_mod_tap_interrupt_per_key</code>, <code>tapping.permissive_hold</code>, <code>tapping.permissive_hold_per_key</code>, <code>tapping.retro</code>, <code>tapping.retro_per_key</code>, <code>tapping.term</code>, <code>tapping.term_per_key</code>, <code>tapping.toggle</code></li><li><code>usb.force_nkro</code>, <code>usb.max_power</code>, <code>usb.no_startup_check</code>, <code>usb.polling_interval</code>, <code>usb.shared_endpoint.keyboard</code>, <code>usb.shared_endpoint.mouse</code>, <code>usb.suspend_wakeup_delay</code>, <code>usb.wait_for</code></li><li><code>qmk.keys_per_scan</code>, <code>qmk.tap_keycode_delay</code>, <code>qmk.tap_capslock_delay</code></li></ul><h3id="codebase-restructure"tabindex="-1">Codebase restructure and cleanup <aclass="header-anchor"href="#codebase-restructure"aria-label="Permalink to "Codebase restructure and cleanup {#codebase-restructure}""></a></h3><p>QMK was originally based on TMK, and has grown in size considerably since its first inception. To keep moving things forward, restructure of some of the core areas of the code is needed to support new concepts and new hardware, and progress is happening along those lines:</p><ul><li>Move RGBLight code into its own folder (<ahref="https://github.com/qmk/qmk_firmware/pull/13312"target="_blank"rel="noreferrer">#13312</a>)</li><li>Migrate platform independent code from tmk_core -> quantum (<ahref="https://github.com/qmk/qmk_firmware/pull/13673"target="_blank"rel="noreferrer">#13673</a>)</li><li>matrix_scan_x -> x_task (<ahref="https://github.com/qmk/qmk_firmware/pull/13748"target="_blank"rel="noreferrer">#13748</a>)</li><li>Move some led drivers to common folder (<ahref="https://github.com/qmk/qmk_firmware/pull/13749"target="_blank"rel="noreferrer">#13749</a>)</li><li>Move chibios board files to allow tmk_core platform migration (<ahref="https://github.com/qmk/qmk_firmware/pull/13777"target="_b