A live keymap visualization tool for ZMK keyboards.
Project description
ZMK Buddy
A live keymap visualization tool for ZMK keyboards, built on top of keymap-drawer.
Features
- Live visualization of keyboard key presses
- Overlay display with configurable transparency
- Support for ZMK keymap YAML files
- Global keyboard monitoring (requires appropriate permissions)
- Learning Mode: Tracks your typing accuracy to help you learn touch typing
Learning Mode
ZMK Buddy includes a learning feature to help you master touch typing without looking at the keyboard:
- Accuracy Tracking: Monitors each keypress and guesses at errors (i.e. it saw you press backspace after a key)
- Progress Persistence: Statistics are saved to your local data directory and persist between sessions
- Visual Feedback: Keys you've mastered are significantly dimmed, encouraging you to rely on muscle memory
- Progress Summary: Shows your overall learning progress at startup
How It Works
- Each key starts with a score of 0%
- Each time you type a key, it's tracked as "pending"
- If you press another key (not backspace), the pending key is marked as correct (+1% to score)
- If you press backspace, the pending key is marked as incorrect (-5% to score)
- Once a key's score exceeds 80%, it's considered "learned" and dimmed in the display (to make it harder for you to 'cheat' by looking at the on-screen keyboard)
- If accuracy falls below 80% the visible key reappears as a hint to help you find it
Installation
pipx install zmk-buddy
Usage
zmk-buddy --keymap keymap.yaml
You will want to use the keymap.yaml file generated by keymap-drawer. This is how we know where/how to draw keys and what the layer options are.
Some ZMK keyboard builds auto generate keymap.yaml automatically, otherwise see the keymap-drawer documentation for how to generate one for your keyboard/layout. You can either use their command line tool or their webapp to generate this yaml file.
If you do not specify a keymap a placeholder example keymap is used, which is probably not what you want.
Options
-d, --debug: Enable debug logging-k, --keymap <file>: Load a custom keymap YAML file
Controls
- FIXME to cycle through layers
- FIXME to exit
- Drag the window to reposition it
Requirements
- Python 3.12+
Platform Support
ZMK Buddy supports global keyboard monitoring across all major platforms:
| Platform | Backend | Notes |
|---|---|---|
| Linux | evdev (preferred) | Requires user to be in input group |
| Windows | pynput | 'should' work, but untested by me - let me know how it goes for you? |
| macOS | pynput | May require Accessibility permissions in System Preferences (also untested) |
Linux Permissions
For global keyboard monitoring on Linux, your user needs access to /dev/input/event* devices. Add your user to the input group:
sudo usermod -aG input $USER
Then log out and back in for the change to take effect.
License
Copyright 2026 Kevin Hester, kevinh@geeksville.com GPL V3 license
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zmk_buddy-0.1.2.tar.gz.
File metadata
- Download URL: zmk_buddy-0.1.2.tar.gz
- Upload date:
- Size: 33.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
17782f9f54e6fc79a6d137f558cb7c49616fe36075c9a8eb826478fe997e5ba6
|
|
| MD5 |
8c3803965585489848703dd7df9989b5
|
|
| BLAKE2b-256 |
52e3f36c0888b2a599e672e4e592d8a022d9657e29c64f613495ea068218efc3
|
Provenance
The following attestation bundles were made for zmk_buddy-0.1.2.tar.gz:
Publisher:
publish-release.yml on geeksville/zmk-buddy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zmk_buddy-0.1.2.tar.gz -
Subject digest:
17782f9f54e6fc79a6d137f558cb7c49616fe36075c9a8eb826478fe997e5ba6 - Sigstore transparency entry: 820449589
- Sigstore integration time:
-
Permalink:
geeksville/zmk-buddy@1a058d3719474eba60c8d40f5d3e2ca8fc009e28 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/geeksville
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-release.yml@1a058d3719474eba60c8d40f5d3e2ca8fc009e28 -
Trigger Event:
push
-
Statement type:
File details
Details for the file zmk_buddy-0.1.2-py3-none-any.whl.
File metadata
- Download URL: zmk_buddy-0.1.2-py3-none-any.whl
- Upload date:
- Size: 36.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
036a27b4a818788e102cc646d549bfa88985690d2df90de3b72a64a4491c7d43
|
|
| MD5 |
2417fc77fa8d54392eb466e231d4dab8
|
|
| BLAKE2b-256 |
af668b9c85e96393b2bb540a6702defd83596eb2956564cd935cdb06ee187e1b
|
Provenance
The following attestation bundles were made for zmk_buddy-0.1.2-py3-none-any.whl:
Publisher:
publish-release.yml on geeksville/zmk-buddy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zmk_buddy-0.1.2-py3-none-any.whl -
Subject digest:
036a27b4a818788e102cc646d549bfa88985690d2df90de3b72a64a4491c7d43 - Sigstore transparency entry: 820449593
- Sigstore integration time:
-
Permalink:
geeksville/zmk-buddy@1a058d3719474eba60c8d40f5d3e2ca8fc009e28 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/geeksville
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-release.yml@1a058d3719474eba60c8d40f5d3e2ca8fc009e28 -
Trigger Event:
push
-
Statement type: