QMK Logo QMK Firmware

The goal of the QMK software project is to develop a completely customizable, powerful, and enjoyable firmware experience for any project - keyboard or otherwise - and to provide helpful, encouraging, and kind support and feedback for people with any software development experience.

View on GitHub

Download Zip Download Tar

Current Version Build Status Discord Docs Status GitHub contributors GitHub forks


This project is maintained by QMK collaborators and contributors like you!

Hosted on GitHub Pages — Theme by orderedlist


All recent changes in QMK

Layouts: Sharing keymaps between keyboards

With the merging of #1609, we’ve added the layouts/ folder - it contains collections of keymaps sorted by physical key layouts that different keyboards can use, and is organised like this:

Making from root and no more Makefiles

After merging in the implementation of #1659, the only way to compile QMK is in the root directory, with the full command:

Support for Levinson added

With #1723 merged, support for Levinson has been added - a split ortho board similar to the Let’s Split.

Support for DZ60 added

With the merging of #1734, we’ve added support for the DZ60 PCB! This is used in a couple different keyboards - if you know of one that isn’t in the readme, please consider adding it!

Support for Viterbi added

We’ve added support for the Viterbi!

Make arguments redo, subprojects eliminated

Make arguments

Add Iris Keyboard

We’ve added support for the Iris from Keebio!

Creates a userspace for keymaps

Added Userspace so you can share common code between different keyboards.


Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term.

QMK DFU bootloader generation

THe QMK DFU bootloader is a fork of the LUFA DFU bootloader that allows for some additional functionality, such as LED and Audio indication.

Allow multiple process_record() calls per scan

This is particularly relevant for, e.g., the ergodox EZ and other keyboards with slow scan rates. Without changing the API or behavior of individual process_record() calls, we allow a configuration flag to make multiple calls in a single scan.

Updates bootloader settings, adds file size check

We’ve improved the Bootloader handling. Not only does it handling jumping to bootloader better, but makes configuration of the settings handled by the compiler, rather than having to set everything.

Fix up the ARM audio support

Update ChibiOS to 17.6.3

Updates ChibiOS to 17.6.3

Add the ability to disable Music Mode completely

We’ve added the option to disable Music Mode when Audio is enabled. This saves a great deal of space for the firmware.

Fix EE HANDS on splits losing handedness if RGB is enabled

Fixes EE HANDS on splits losing handedness if RGB is enabled

add support for encoders to core

Adds support for rotary encoders to core code.

Keyboard: 5291 firmware to replace the existing soarers controller firmware

We’ve added support for the IBM 5291 (aka “Bigfoot”) converter!

added ep/96 as a supported keyboard

We’ve added support for EP 96 keyboard!

Remap msys2 usb, fix USB port detection

Adds better support for Pro Micro (Caterina Bootloader) flashing.

Add Faux Clicking as subset of Audio feature

Add Faux Clicky to the Audio feature

Adds IS31FL3731 RGB Matrix Implementation

Adds initial support for per key RGB lighting (RGB Matrix) powered by the IS31FL3731 controller. See the RGB Matrix Feature Page for details about this feature.

Add and fix _noeeprom functions to many of the RGB Underglow functions

And and fix _noeeprom functions to many of the RGB Underglow functions

Split Common

This adds the split keyboard code to the core code, and adds it as a feature. This way, all of the code can be maintained in one place, rather than individually, per board.

Rgb matrix arm

We’ve added ARM support for the RGB Matrix.

ISSI31FL3733 driver

Adds the ISSI31FL3733 comtoller support for RGB Matrix. Only supports 1 driver, at this time.

ISSI31FL3733 driver

We’ve added support for Massdrop’s CTRL and ALT keyboards. Additionally support for ATSAM ARM has been added, as well.

STM32 EEPROM Emulation

We’ve added support for STM32 EEPROM Emulation! Mostly supports STM32F3xx MCUs. More support can be added later.

Keyboard: add Keyboardio Model 01

We’ve added support for the Keyboardio Model01 keyboard!


This changes the default behavior of QMK to use the PREVENT_STUCK_MODIFIERS behavior by default. This way, modifiers are remembered correctly.

RGB Matrix refactoring to open up for new drivers

Refactors the RGB matrix code to generalize it more, to make it easier to add new drivers.

Add Function level EECONFIG code for EEPROM

This adds support for keyboard and keymaps to be able to use EEPROM, as well as resetting those settings.

Keyboard: Add HS60 V2

We’ve added support for the HS60 v2 keyboard, using the STM32F303CC ARM controller!

Add Bootmagic Lite to QMK

Adds a lightweight implementation of Bootmagic that only resets the keyboard, so that users are not prone to accidentally activating unwanted features.

Keyboard: add support for kbd19x

We’ve added support for KBDFans’ KBD19x keyboard!

Keyboard: add ep40 qmk support

We’ve added support for the ep40 keyboard!

Keyboard: adding Espectro

We’ve added support for MECHKEYS’s Espectro keyboard!

Add EEPROM_RESET keycode to core code

Adds a keycode to reset the EEPROM on the keyboard (to reset persistant settings back to their default settings).

IDOBO Keyboard Support (75Keys Aluminum Keyboard)

We’ve added support for Massdrop’s 75Key Keyboard keyboard!

KBDFans KBD67 Support

We’ve added support for KBDFans’ KBD67 keyboard!

Keyboard: Initial 25 port

We’ve added support for 40percent.club’s 25 keyboard!

Use a single endpoint for HID reports

Unify multiple HID interfaces into a single Endpoint.

Fix UCIS code

Reverts move declaration of “i” variable in the proces_ucis function that was moved previously.

Fix diffutils Arch Linux package name

Uses the correct name for diffutils for Archlinux. Now everything should install and compile properly.

fixed misplaced paranthesis in arm usb mouse send function

This fixes the send mouse function in ChibiOS and should no longer drop mouse events.

Puck Macropad

We’ve added support for OkKeebs.com’s Puck Macropad!

Update MSYS’ AVR-GCC to use the 5.4.0 toolchain

We’ve updated the MSYS install script to grab the newer toolchain version AVR-GCC for Windows (version 5.4.0).

Added Rick Roll to song lists

We’ve added the Rich Ashley Never Gonna Give You Up song to our song list!

Keyboard: add newgame40

We’ve added support for the NEWGAME40 keyboard!

New Keyboard: Cyclops

We’ve added support for the Cyclops keyboard, a 66% Alps keyboard!

Add support for S7 Elephant

We’ve added support for the S7 Elephant keyboard!

Fix up RGB Matrix code

This commit fixes up some of the code, and expands the functionality of the RGB Matrix code. Including adding support for running RGB Light and RGB Matrix at the same time.

Make ARM Audio max volume configurable

This allows you to set the max volume used by the ARM Audio feature. This is useful if you (shock!) find the audio to be way too loud.

Increasing square wave buffer to max volume

This changes the ARM Audio code so that the volume is much louder (more closely matching the AVR Audio).

adding Hadron v3 keyboard, QWIIC devices support, haptic feedback support

This commit adds support for DDRV2605L haptic motor, support for the QWIIC powered “Joystiic” and Micro OLED, as well as support for the Hadron revision 2, that uses all of these features.

Keyboard: Add new keyboard Sol from RGBKB

We’ve added support for the Sol keyboard from RGBKB!

Keyboard: Initial nori port

We’ve added support for 40percentclub’s Nori keyboard!

Only try to read the report ID from SetReport when the keyboard is part of the shared EP

If the keyboard has media keys or NKRO on, SHARED_EP_ENABLE is automatically enabled to merge them into a single endpoint (see #3951). The different interfaces are then identified by a unique report ID. However, the keyboard interface is by default not part of that shared endpoint unless KEYBOARD_SHARED_EP = yes in your rules.mk, and so it does not need a report ID.

Keyboard: Initial i75 port

We’ve added support for the 40percent.club’s i75 keyboard!

Keyboard: Palm serial keyboard USB converter

We’ve added support for the Palm serial keyboard converter!

Add support for PR and Issue templates to QMK_firmware GitHub

We’ve added templates for both PRs and Issues for the QMK Firmware repo, to help streamline things.

Make quantum/split_common/serial.[ch] configurable

This changees the Split Keyboard (aka Split Common) code to allow a configurable pin for Serial communication, that can be defined per board.

Refactor quantum/split_common/i2c.c, quantum/split_common/serial.c

This PR allows for both i2c and serial support for Split Keyboards (aka Split Common code) to be enabled at the same time, without causing any overlap/issues.

Per Key Leader Timing Option

This adds a “per key” timing option to the Leader Key function.

Overhaul Unicode Common functionality

This is a significant overhaul to the core (“common”) Unicode code.

Replace serial.c of quantum/split_common/

This PR marks the finishing of updating of the Split Keyboard (aka “Split Common”) serial code, to bring it in line with all of the awesome improvements that mtei has made for the Helix split keyboard.

Keep pressed keys on layer state change

This allows pressed keys to stay pressed when a layer change occurs.

Change rgblight_get_mode & rgb_matrix_get_mode’s return type to uint8_t

rgblight_get_mode()’s return type right now is uint32_t, but upon inspection of its implementation, it’s actually returning rgblight_config_t.mode, which is an uint8_t. The return type should match rgblight_config_t.mode’s.

Convert split_common to use generic GPIO api

This is a small but important step to converting the Split Keyboard code to be ARM compatible, by using hardware agnostic functions (instead of the AVR specific addresses).

Remove redundant, language-specific aliases for KC_ALGR

Removes redundant, language-specific aliases for KC_ALGR, since that keycode is standard now.

Improve consistency in UNICODEMAP code and docs, update docs/understanding_qmk

Rename some constants and functions pertaining to UNICODEMAP so they’re consistent with the rest of the system. Also update the documentation accordingly. See below for details.

Update to arm_atsam wait and timer routines

This update is to get the arm_atsam branch timer and wait functions aligned with common QMK functions. It also includes a much simpler, rewritten method to microsecond delays to tighten timings. This update affects Massdrop’s CTRL and ALT keyboards, and they have both been thoroughly tested.

Adds Proton C Conversion

If a board currently supported in QMK uses a Pro Micro (or compatible board) and you want to use the Proton C, you can generate the firmware by appending CONVERT_TO_PROTON_C=yes (or CTPC=yes) to your make argument, like this:

Fix Caps Lock LEDs once and for all

The status LEDs don’t light up/light up incorrectly on Linux in certain circumstances. This is because, if NKRO is enabled it will send two LED states, one for the 6KRO interface, and one for the NKRO interface. QMK interprets the NKRO report ID as the LED state and turn on the num lock and scroll lock LEDs.

Simplify split_common significantly

Split_common no longer has a separate main loop for the slave, it reuses the keyboard_task main loop like ergodox infinity. This eliminates a lot of the code and makes it a bit easier to reason about. It also means that the slave will behave slightly differently depending on what flags are enabled - many of the options lie outside the is_keyboard_master gate in keyboard_task, and I expect that will have to change as they’re tested.

[Keyboard] Initial support for TKC Candybar

We’ve added support for the TKC Candybar keyboard!

[Keyboard] Tmo50 initial commit

We’ve added support for the TMO50 keyboad!

[Keyboard] Added TGR Alice keyboard support

We’ve added support for the TGR Alice keyboard!

[Keyboard] Add BDN9

We’ve added support for the Keebio BDN9 macropad!

[Keyboard] Add KBD67 Hotswap Support

We’ve added support for the

Add MOD_MASK_* macros to core code

This adds the Mod MASK ans pre-existing defines in the core code, so you can easily reference them without having to manually define them.

Fix OSM(mod) problem

This fixes an issue with One Shot Mods not properly respecting the Magic ALT-GUI Swap setting.


This fixxes the RGBLIGHT_SLEEP option, so that the lights properly maintain the previous setting in all cases.

[Keyboard] Adding support for Gergo

We’ve added support for the Gergo keyboard from g Heavy Industries!

[Keyboard] Add support for THE50

We’ve added support for the THE50 keyboard!

[Keyboard] Add bthlabs/geekpad

We’ve added support for the BTHLabs GeekPad macropad!

Adds a default value for IS_COMMAND for COMMAND feature

This adds a default value for IS_COMMAND to the core code. This is so that each keyboard doesn’t have to define it locally. It only has to define it, if it is not the default.

Update Preonic’s MCU configuration to use the built-ins

This updates the Preonic keyboard configuration to use the built ARM MCU code.

Fix Command feature: use get_mods() instead of keyboard_report->mods

This replaces keyboard_report->mods with get_mods() instead, for the IS_COMMAND call, since it was broken due to issues with the Endpoint Consolidation commit.

Add Lunar Keyboard

We’ve added support for the Lunar keyboard from Switchplate Peripherals!

[Keyboard] Add Southpole keyboard

We’ve added support for the Southpole Keyboard!

[Keyboard] UniGo66 keyboard added

We’ve added support for the UniGo66 keyboard!

[Keyboard] Gray Studio Space 65 Support

We’ve added support for the Gray Studio’s Space 65 keyboard!

[Keyboard] Add 1upkeyboards 1up80hte (Tsangan style PCB)

We’ve added support for the 1UP Keyboards’s 1up80hte keyboard!

New Keyboard: Sentraq Number Pad RGB DIY Kit

We’ve added support for the Sentraq Nunber Pad RGB Kit!

[Keyboard] Create KBDFans directory

We’ve added a folder for KBDFans keyboards! Now, they can be grouped in the QMK Configurator.

[Keyboard] New Macropad: 1upkeyboards super16

We’ve added support for the 1UP Keyboards Super 16 Macropad!

Add distclean target instead

We’ve added the distclean command, so you can clear the build folder and compiled firmware! Just run make distclean to do so.

Add One Shot Key callbacks

Add support for hooks for the One Shot Key feature!

Add Scarlet Bandana Version IV mark.2

Add support for the Scarlet Bandana from WoodKeys.click!

[Keyboard] Add support for jj4x4 numpad/macropad by Kprepublic

We’ve added support for KPRepublic’s JJ4x4 macropad!

[Keyboard] Initial commit of Laptreus Keyboard

We’ve added support for the Laptreus Keyboard!

Regroup all Exclusive keyboard in one directory

We’ve added a folder for Exclusive keyboards! Now, they can be grouped in the QMK Configurator.

Keyboard Initial Support For Tkc M0lly

layout: qmk-title title: “[Keyboard] Initial support for TKC M0LLY” date: 2019-02-10 00:00:00 -0500 category: keyboards commit: 6ba3968 pr: 5087

LED Matrix Support

We’ve added support for LED Matrices. These are non-RGB (single color), per key addressable backlighting.

Added WT75-A, refactor wilba.tech PCBs

We’ve added support for the WT75-A keyboard from [Wilba.tech](https://wilba.tech/!

[Keyboard] Added aeboards/aegis

We’ve added support for the aeboards AEGIS keyboard!

[Keyboard] Move Keebio boards to own folder

We’ve added a folder for Keebio keyboards! Now, they can be grouped in the QMK Configurator.

Add Satisfaction75 to QMK, Enable EEPROM on stm32f072

We’ve added support for the Satisfaction75 keyboard!

Add Satisfaction75 to QMK, Enable EEPROM on stm32f072

We’ve added EEPROM support for the STM32F072 MCU!

[Keyboard] New Keyboard: Doro67 Regular PCB

We’ve added support for the Doro67 Keyboard!

Add kb and user level keyboard initialization functions

We’ve added new hooks for keyboard initialization!

Debounce refactor / API

We’ve refactored the Debounce code that allows for different debouncing methods.

Fix ARM Audio issues and its EEPROM persistence

Added EEPROM support for Audio on ARM!

Added APA102 support

We’ve added support for APA102 RGB LED’s!

[Keyboard] Winkeyless Directory

We’ve added a folder for Winkeyless keyboards! Now, they can be grouped in the QMK Configurator.

[Keyboard] Alf X1.1 QMK Support

We’ve added support for the Alf X1.1 Keyboard!

Velocikey: Match RGB animation speed to typing speed

Velocikey feature for RGB Light has been added!

Fix Tx Bolt ghosting second character on key press

Fixes an issue with the TX Bolt method for Steno that was causing ghosting issues.

[Keyboard] Add Boardwalk Keyboard

We’ve added support for the Boardwalk keyboard from PANC Interactive!

[Keyboard] Add HotDox keyboard

We’ve added support for the HotDox keyboard from Alpaca Keyboards!

Next set of split_common changes

This updates a number of parts for the Split Keyboard code, to get it more ready for ARM Support (no, not here yet).

Add support for THE60

We’ve added support for the Lazy Designer’s THE60 keyboard!

We’ve added support for the gboards.ca’s Georgi keyboard!

rgblight.c: add remap feature

This commit adds the ability to remap where the LEDs are located, so that animations and other functions are more intuitive.

Add support for RGB LEDs wired directly to each half’s controller

This adds support for controller the RGB Light stripes wired to the different controllers on Split Keyboards.

Add 3 speed mousekey movement option

This commit adds an optional Constant speed movement option for Mousekeys.

[Keyboard] Added RAMA KOYU

We’ve added support for the RAMA WORKS KOYU Keyboard!

RGB Matrix Overhaul

This is a massive overhaul to the RGB Matrix code.

Added encoder support to split common code

This adds support for using Encoders on both sides of Split Keyboards!

RGB Matrix support for Massdrop CTRL/ALT

Converts the Massdrop CTRL and ALT keyboards to use the QMK Firmware’s core RGB Matrix feature!

Custom Tapping Term per key

This adds the ability to specify a custom Tapping Term for dual action keys (such as Mod-Tap and Layer-Tap keys).

Update ps2avrgb template to use standard matrix/i2c code

Update ps2avrgb template to use standard matrix/i2c code.

Adds the Planck EZ, 3737 RGB, fixes out-of-tune notes

We’ve added support for the Planck EZ keyboard!

Switch process_combo to using global register and timer

This commit fixes various issues and optimizes the Combo feature.

Port DIRECT_PINS from split_common/matrix.c to matrix.c

Adds support for Direct Pin connection keyboards (e.g. no matrix, no diodes, just connected to the controller).

Add AltGr/RALT support to Send String

Adds support for AltGR, allowing for non-US keycodes in SEND_STRING.

Fix ATSAM’s USB HID descriptor to support higher heycodes

This allows EXTRAKEYS (media keys and OS Keys) to work on ATSAM keyboards (Massdrop CTRL and ALT keyboards).

Features/ws2812 matrix driver

This allows you to use WS2812 strips for the RGB Matrix feature.

Add function to support split-keyboard in rgblight.[ch].

This commit adds the ability to sync the RGB light settings between halves of Split Keyboards.

Change split_common to use RGBLIGHT_SPLIT

This adds supports the RGB_SPLIT feature for RGB Light.

OLED Driver Feature

This adds a new OLED driver to QMK Firmware.

Define RGB colors

This commit adds defines that you can use to quickly set RGB or HSV values.

RGB Matrix Animations: Three/six new reactive effects (wide, cross, nexus)

Adds three new animation modes to the RGB Matrix feature.