Clackety Keyboards Powered by Python
Go to file
2019-03-08 19:35:55 -08:00
.circleci Remove pyboard from circle 2018-10-16 22:40:36 -07:00
docs So much documentation 2019-02-18 16:35:07 -08:00
hardware Update README.md 2018-12-04 16:44:13 -08:00
kmk Initial test 2019-03-08 19:35:55 -08:00
linux-udev Add udev rule to allow flashing STM32 devices as user 2018-09-29 16:20:43 -07:00
tests/test_data Resolves #56 by moving kmk.common.* up a level to kmk.* 2018-10-11 18:13:29 -07:00
user_keymaps Initial test 2019-03-08 19:35:55 -08:00
util Add new keyboard now on Circuitpython. 2018-10-11 12:37:06 -07:00
.dockerignore Some backports from work on #46 to greatly speed up Circle builds 2018-10-11 17:50:39 -07:00
.gitignore Added remote debugger and cleaned up several things Looks good to merge 2018-10-28 15:03:22 -07:00
boot.py Everything necessary to get this to boot finally. Planck types! 2018-12-29 06:03:31 -08:00
Dockerfile_base Some backports from work on #46 to greatly speed up Circle builds 2018-10-11 17:50:39 -07:00
LICENSE.md Remove unused kmk.string (originally from micropython-lib) 2018-12-29 15:42:56 -08:00
Makefile Everything necessary to get this to boot finally. Planck types! 2018-12-29 06:03:31 -08:00
Pipfile Disable line-length checks on user-defined keymaps 2018-09-23 00:14:30 -07:00
Pipfile.lock Disable line-length checks on user-defined keymaps 2018-09-23 00:14:30 -07:00
README.md Resolves #58: Link to new Matrix server and Discord bridge in README 2018-12-28 05:42:03 -08:00
setup.cfg OMEGA REFACTOR! Perf grind basically complete. 2018-10-16 22:21:45 -07:00

KMK: Python-based keyboard firmware for humans (and ARM microcontrollers)

CircleCICLA assistant

Join our Matrix community for chat and support!

Or, head directly to the #support channel

If you can't or won't use the Matrix infrastructure, a (possibly fragile) bridge to Discord exists here.


KMK is a firmware for (usually mechanical) keyboards, running on CircuitPython. It aims to provide a means to write complex keyboard configurations quickly, without having to learn much "real" programming, while preserving at least some of the hackability and DIY spirit of CircuitPython. Learn more about the rationale of KMK in Why KMK? below.

This project is currently written and maintained by:

With community help from:

Scott is the lead developer of the CircuitPython project itself at Adafruit. KMK, however, is not officially sponsored by Adafruit, and is an independent project.

Lastly, we'd like to make a couple of shoutouts to people not directly affiliated with the project in any way, but who have helped or inspired us along the way:

  • Jack Humbert (@jackhumbert), for writing QMK. Without QMK, I'd have never been exposed to the wonderful world of programmable keyboards. He's also just an awesometastic human in general, if you ever catch him on Discord/Reddit/etc. Jack also makes fantastic hardware - check out his store!

  • Dan Halbert (@dhalbert), for his amazing and unjudgemental support of two random dudes on Github asking all sorts of bizzare (okay... and occasionally dumb) questions on the MicroPython and CircuitPython Github projects and the Adafruit Discord. Dan, without your help and pointers (even when those pointers are "Remember you're working with a microcontroller with a few MHz of processing speed and a few KB of RAM"), this project would have never gotten off the ground. Thank you, and an extended thanks to Adafruit.

Why KMK?

A question we get from time to time is, "why bother with KMK when QMK already exists?", so here's a short bulleted list of our thoughts on the matter (in no particular order):

  • Python is awesome
  • Python is super easy to write
  • Python provides fewer footguns than C
  • KMK cut all the "tech debt" of supporting AVR controllers, and frankly even most ARM controllers with under 256KB of flash. This let us make some very user-friendly (in our biased opinions) design decisions that should make it simple for users to create even fairly complex keyboards - want a key on your board that sends a shruggie (¯\_(ツ)_/¯)? No problem - it's supported out of the box. Want a single key that can act as all 26 alphabet characters depending on the number of times it's tapped? You're insane, but our simple Tap Dance implementation has you covered (without a single line of matrix mangling or timer madness)
  • KMK supports a few small features QMK doesn't - most are probably not deal-closers, but they exist no less. Probably the most notable addition here is Leader Mode - Enter. Check out docs/leader.md for details on that.
  • KMK plans to support some fairly powerful hardware that would enable things like connecting halves (or thirds, or whatever) of a split keyboard to each other via Bluetooth. This stuff is still in very early R&D.

So how do I use it?

Since KMK is still in some state between "alpha" and "beta", flashing KMK to a board is still a process that requires a few lines of shell scripting. Check out docs/flashing.md for instructions/details, though note that for now, the instructions mostly assume Unix (Linux/MacOS/BSD) usage. You may want to check out the Windows Subsystem for Linux if you're on Windows.

Most files in this project are licensed GPLv3 - see LICENSE.md at the top of this source tree for exceptions and the full license text.

When contributing for the first time, you'll need to sign a Contributor Licensing Agreement which is based on the Free Software Foundation's CLA. The CLA is basically a two-way promise that this code is and remains yours, but will be distributed as part of a larger GPLv3 project. If you'd like to get it out of the way early, you can find said CLA here. If you forget, the bots will remind you when you open the pull request, no worries!