mrkeyoor.com_
Sun 27 Sept 03:19 UTC
Dev Toolsevaluationupdated 27 Sept 2026

qmk_firmware review

QMK is firmware for custom mechanical keyboards built around supported AVR and Arm controllers. It lets you define key layouts, layers, shortcuts, lighting, and device behavior, then compile and flash that behavior onto the keyboard itself.

Verdict

Our QMK run installed in 14 seconds, then the build failed in 1 second and pytest ended with 43 failures, 11 errors, and 1 pass. QMK remains the first project to check for a supported wired custom keyboard because its hardware tree, documentation, and firmware controls are unusually broad, but use its prescribed environment rather than a generic Python container. Pick ZMK for a wireless-first board, and do not flash until you have confirmed the exact keyboard, controller, and recovery route.

We ran it

Lab card: what happened when we ran qmk_firmwareScreenshot of qmk_firmware (qmk.fm)
Install✓ · 14s62 packages · 64 MB
Build✗ · 1s
Tests✗ · 15s1 passed · 43 failed · 11 errors of 55 (pytest)
Known vulns0(pip-audit)
Repo41795 files~10,026,165 lines of source · 1137.7 MB · 19 CI workflows · tests dir

Answers from our run

Does qmk_firmware build from source?

Dependencies installed in 14 seconds (62 packages), and the build failed. We cloned commit b1aea25 into a clean Debian container with 3 CPUs and no project-specific setup.

Do qmk_firmware's tests pass?

Not all of them: 1 of 55 passed and 43 failed when we ran the project's own test command (pytest), with 11 collection errors. Some failures need services or credentials a bare container does not have.

Does qmk_firmware have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use qmk_firmware?

Users looking for a desktop-only key remapper that requires no firmware flashing: QMK changes code running on the keyboard and requires a supported bootloader path.

What are the alternatives to qmk_firmware?

ZMK, KMK, Vial QMK. Our QMK run installed in 14 seconds, then the build failed in 1 second and pytest ended with 43 failures, 11 errors, and 1 pass.

Setup2/514-second install, but build and 54 of 55 test cases did not pass
Docs5/5Detailed setup, compile, flashing, feature, and recovery guides
Community5/520,730 stars with current pushes and active issue discussion
Maturity4/5Wide hardware support, with controller-specific bugs still surfacing

Who it’s for

Custom-keyboard owners whose exact board and controller appear in QMK's supported keyboard tree.
Keyboard designers who want firmware-level control over layers, keycodes, lighting, macros, and pointing features.
Developers comfortable using a terminal, editing C or JSON keymaps, compiling firmware, and recovering a board through its bootloader.

Who it’s NOT for

Users looking for a desktop-only key remapper that requires no firmware flashing: QMK changes code running on the keyboard and requires a supported bootloader path.
Linux users committed to a musl-based distribution: QMK's setup guide says the standard build environment does not support musl.
Builders who need a supported graphical flashing tool on Linux: QMK Toolbox is documented for Windows and macOS, while Linux users flash from the command line.
Split RP2040 builds using RGBLIGHT_SPLIT without checking the current fix status: issue 26480 reports out-of-range LED writes corrupting RAM on one such board.
Designs above 256 LEDs that cannot carry local patches: issue 24675 says 8-bit LED indexes still limit that configuration.

Setup reality

Our sandbox install succeeded in 14 seconds, adding 62 packages and 64 MB. The build failed with exit code 1 after 1 second. Tests also failed after 15 seconds: pytest reported 1 passed, 43 failed, and 11 collection or setup errors out of 55. Pip-audit found 0 known vulnerabilities.

The documented setup uses QMK CLI plus platform toolchains, Git, and the firmware checkout. Windows users are directed to QMK MSYS, macOS users need Homebrew, and Linux support favors mainstream distributions. Compiling requires an exact keyboard and keymap target; flashing also needs the board's bootloader and USB access.

The checkout was 1,137.7 MB with 41,795 files and about 10,026,165 source lines. The build log tail only shows Python invalid-escape SyntaxWarnings, not the terminating error. The test tail repeatedly says the qmk executable was missing. Those logs do not establish why either step failed.

QMK puts up to 32 layers inside the keyboard

QMK moves keyboard customization below the operating system. A keymap can define ordinary keys, layers, mouse controls, shortcuts, lighting, and code that runs on the controller. The result travels with the keyboard instead of depending on a desktop remapping app. That makes QMK a natural first stop for a supported wired custom board, especially when one layout must behave the same across several computers. It also means a change goes through a compile and flash cycle rather than a settings window.

The beginner guide allows up to 32 layers and accepts keymaps written in C or JSON. A typical flow sets a default keyboard, copies its default keymap, edits the layout, runs qmk compile, and flashes the generated .hex or .bin file. QMK can remove much of the bootloader guesswork when the keyboard definition is complete. If the board lacks a supported flash target, the user has to identify the bootloader and fall back to its specific procedure.

The 1,137.7 MB checkout is a hardware catalog as well as code

Our measured clone contained 41,795 files, about 10,026,165 lines of source, and occupied 1,137.7 MB before the installed Python environment. Much of QMK's practical value sits in that scale: the repository holds definitions and default keymaps for many community keyboards alongside shared firmware code and bundled libraries. You should search the keyboards tree for the exact model and revision, not assume that a familiar product name means every PCB revision shares a target.

The setup guide also draws firm platform lines. Windows users get QMK MSYS, macOS users install through Homebrew, and Linux users are steered toward Debian-family, Fedora-family, or Arch-family systems. The standard environment does not support musl-based Linux distributions. QMK Toolbox provides graphical flashing and debugging on Windows and macOS, while Linux users follow the command-line route. The toolchain is part of the product here because AVR, Arm, bootloader, and USB permissions all meet at flash time.

What happened when we ran it

Our sandbox installed 62 packages in 14 seconds and used 64 MB for them. The build failed with exit code 1 after 1 second. Its final lines show invalid-escape SyntaxWarnings in LVGL release scripts and a Pico SDK workflow generator. The tail does not show the final error that made the command exit, so blaming those warnings would be speculation. The useful result is that commit b1aea25 did not build through our generic Python 3.12 Debian path.

Pytest also exited 1 after 15 seconds. It reported 1 passed, 43 failed, and 11 collection or setup errors out of 55. The visible failures repeatedly raise FileNotFoundError for an executable named qmk while testing CLI commands such as rules-file generation, JSON formatting, and keyboard search. The log proves that executable was unavailable to those tests; it does not tell us whether the cause was packaging, PATH configuration, or a missing setup step.

Pip-audit found 0 known vulnerabilities among the installed Python packages. The repository had 19 CI workflow files and a tests directory, but no Dockerfile. Those facts do not turn the failed local run into a pass. They point to the next attempt: use QMK's documented installer or maintained platform environment, run qmk doctor, then compile one known default keymap before modifying or flashing any hardware.

Flashing starts with the exact bootloader, not a generic USB command

The flashing guide lists several ways a keyboard may enter bootloader mode, from a key chord to a physical reset button or shorting reset and ground pins. It warns against unplugging the board while firmware is being written. QMK Toolbox can recognize some devices and choose the flasher, while qmk flash uses bootloader information from the keyboard definition. A missing or incorrect definition moves the recovery burden back to you, so save the known-good firmware and learn the reset path before changing the map.

Hardware-specific behavior deserves the same caution. Issue 26480 reports that split RGB lighting on one RP2040 Sofle build wrote LED colors outside the allocated array and corrupted the emulated EEPROM cache. The reporter tied the changing bytes to 4 LEDs and stopped the corruption with a bounds check. Issue 24675 discusses a different limit: code paths using 8-bit LED indexes cannot represent a 324-LED design without patches. Both reports concern unusual configurations, but firmware bugs can alter device state rather than merely crash a desktop process.

September 2026 activity matters more than the missing release page

GitHub recorded 20,730 stars, 548 open issues and pull requests, and a last push on September 26, 2026. The repository's latest-release API returned no GitHub release, so there is no current release page to cite. That absence is not evidence of abandonment. The push date and September issue discussions show current work, including a detailed report about combo timing and another about split-keyboard RGB memory writes.

QMK earns its place by supporting the messy reality of custom keyboards: many controllers, board revisions, bootloaders, and user-defined layouts in one tree. The cost is equally concrete. Our ordinary Python container could install its packages but could not build the checkout or run the CLI tests successfully. Start with QMK when your exact wired board is listed and you want firmware-level control. Start elsewhere when wireless power use, CircuitPython editing, or runtime remapping is the design's main constraint.

Alternatives

ProjectWhat it isPick it when
ZMKKeyboard firmware built around Zephyr, with a strong focus on wireless split boards.pick this instead when Bluetooth Low Energy and battery-powered split keyboards are the main design constraints.
KMKCircuitPython keyboard firmware that favors readable Python configuration and rapid iteration.pick this instead when your supported microcontroller runs CircuitPython and editability matters more than QMK's hardware catalog.
Vial QMKA QMK fork that adds Vial's runtime keyboard configuration features.pick this instead when changing layouts without recompiling is central and your keyboard supports the Vial path.

What people are saying

  1. [velocity-scout] qmk/qmk_firmware

Sources

  1. QMK Firmware repository
  2. QMK README
  3. QMK environment setup guide
  4. QMK flashing guide
  5. Split RGB out-of-range write report
  6. More than 256 LEDs discussion

More dev tools reviews

fx · foundry · terminal-browser · fearless_simd · devops-exercises · scriptc · the whole board →