An experimental 34-key keymap focused on Rust programming ergonomics, designed for the Urchin Keyboard.
This keymap is designed to reduce strains for Rust and TypeScript programmers suffering from Repetitive Strain Injury (RSI).
In a conventional keyboard layout, the keys for the symbols usedd in programming are hard to reach. Reaching those keys often involve moving the entire hand, bending the wrist in an uncomforable way, or repeatedly straining weaker fingers.
This keymap places those programming symbols only 1 unit away from the home row, with placement arranged around fingers by the frequency of use of the symbols in the Rust and the relative strength of the fingers. Although the keymap is primarily focused on increasing Rust programming comfort, it is also great for coding in TypeScript.
Are you trying to make your own ZMK firmware?
Here are the steps you need to take.
This repository includes a Nix flake for local flashing.
If you do not already have Nix installed, start with the Determinate Systems Nix installer.
To build and flash a connected half:
nix run .#flashBefore flashing, put the target half into bootloader mode and connect it over USB. Repeat the flash step for the other half.
The current flake builds the Urchin split firmware with the nice!view display stack:
board = "nice_nano_v2";
shield = "urchin_%PART% nice_view_adapter nice_view";The base layer uses urob's timeless home row mods for modifier keys:
| Key | Tap | Hold |
|---|---|---|
| A | a | Alt |
| S | s | Meta (GUI) |
| D | d | Ctrl |
| F | f | Shift |
| J | j | Shift |
| K | k | Ctrl |
| L | l | Meta (GUI) |
The zmk-helpers module is declared in [config/west.yml], which makes its headers
available on ZMK's include path. The keymap includes them directly:
#include "zmk-helpers/helper.h"
#include "zmk-helpers/key-labels/34.h"The HRM behaviors are defined with the ZMK_HOLD_TAP macro, using key-labels
(KEYS_L, KEYS_R, THUMBS) for clean cross-hand hold-trigger configuration.
Two timing profiles are used, tuned by misfire severity rather than mod frequency:
- Strict (
hml/hmr— Ctrl/GUI/Alt) —require-prior-idle-ms = <200>, so a hold only resolves after a deliberate pause. A misfired Ctrl/GUI/Alt is catastrophic (closes tabs, quits apps, steals focus), so the benign failure mode — a plain letter, no mod — is strongly preferred. - Lenient (
hml_sh/hmr_sh— Shift) —require-prior-idle-ms = <150>, making capitalization easy mid-burst; a misfire only produces a stray capital letter.
Both profiles use tapping-term-ms = <280>, quick-tap-ms = <175>, and the
canonical positional hold-trigger-on-release cross-hand detection.
When a new release of zmk-helpers is available, update the revision in
[config/west.yml] to the desired commit or tag, then rebuild.
This layout is inspired by Urchin by duckyb
This diagram was created using draw.io
Click HERE to view a copy that you can edit