Personal ZMK configuration for the Leeloo split keyboard by Clickety Split, running on nice!nano v2 controllers.
- Quick Start
- Layers & Layout
- Flashing Firmware
- Bluetooth Setup
- Building Firmware
- Homerow Mods
- Troubleshooting
- Additional Documentation
just build # Build both halves
just flash-left # Flash left half (waits for bootloader)
just flash-right # Flash right half
just all # Build and flash both| Method | Steps |
|---|---|
| Left half | Hold Space + F → tap TAB |
| Right half | Hold Space + F → tap \ (backslash) |
| Hardware | Double-tap reset button on nice!nano |
Hold Space + F → tap 1-4 to switch profiles
| Layer | Name | Activation |
|---|---|---|
| 0 | DEFAULT | Base layer |
| 1 | LOWER | Hold Space (left thumb) |
| 2 | RAISE | Hold F key |
| 3 | FIRMWARE | Hold Space + F together (conditional) |
Base QWERTY layer with homerow mods.
┌──────┬──────┬──────┬──────┬──────┬──────┐ ┌──────┬──────┬──────┬──────┬──────┬──────┐
│ `~ │ 1! │ 2@ │ 3# │ 4$ │ 5% │ │ 6^ │ 7& │ 8* │ 9( │ 0) │ -_ │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│ TAB │ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │ \| │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│CTL/⎋ │ A │ S │ D │ F/L2 │ G │ │ H │ J │ K │ L │ ;: │ '" │
├──────┼──────┼──────┼──────┼──────┼──────┼──────┐ ┌──────┼──────┼──────┼──────┼──────┼──────┼──────┤
│ LSFT │ Z │ X │ C │ V │ B │ L3 │ │ L3 │ N │ M │ ,< │ .> │ /? │ RSFT │
└──────┴──────┴──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┴──────┴──────┘
│ OPT │ CMD │SPC/L1│ F19 │ │ENTER │ SPC │ BSPC │ DEL │
└──────┴──────┴──────┴──────┘ └──────┴──────┴──────┴──────┘
Hold-Tap Keys:
CTL/⎋— Tap: Escape, Hold: Left ControlSPC/L1— Tap: Space, Hold: Layer 1 (LOWER)F/L2— Tap: F, Hold: Layer 2 (RAISE)BSPC— Tap: Backspace, Ctrl+Tap: Delete
Homerow Mods (GACS):
- Left hand: A=GUI, S=ALT, D=CTRL
- Right hand: J=SHIFT, K=CTRL, L=ALT, ;=GUI
Activation: Hold Space (left thumb)
┌──────┬──────┬──────┬──────┬──────┬──────┐ ┌──────┬──────┬──────┬──────┬──────┬──────┐
│ │ F1 │ F2 │ F3 │ F4 │ F5 │ │ F6 │ F7 │ F8 │ F9 │ F10 │ =+ │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│ │ │ W→ │ │ │ │ │ │ │ │ [{ │ ]} │ │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│ │ │ │ │ │ │ │ ← │ ↓ │ ↑ │ → │ │ │
├──────┼──────┼──────┼──────┼──────┼──────┼──────┐ ┌──────┼──────┼──────┼──────┼──────┼──────┼──────┤
│ │ │ │ │ │ W← │ │ │ │ │ │ │ │ │ │
└──────┴──────┴──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┴──────┴──────┘
│ │ │██████│ │ │ │ │ │ │
└──────┴──────┴──────┴──────┘ └──────┴──────┴──────┴──────┘
W→— Option+Right (word right)W←— Option+Left (word left)- Arrow keys on right hand home row
Activation: Hold F key
┌──────┬──────┬──────┬──────┬──────┬──────┐ ┌──────┬──────┬──────┬──────┬──────┬──────┐
│ │ F1 │ F2 │ F3 │ F4 │ F5 │ │ F6 │ F7 │ F8 │ F9 │ F10 │ =+ │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│ │ │ W→ │ │ │ │ │ │ MUTE │ VOL↓ │ VOL↑ │ ⏭/⏮ │ ⏯ │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│ │ │ │ │██████│ │ │ ← │ ↓ │ ↑ │ → │ │ │
├──────┼──────┼──────┼──────┼──────┼──────┼──────┐ ┌──────┼──────┼──────┼──────┼──────┼──────┼──────┤
│ │ │ │ │ │ W← │ │ │ │ │ │ │ │ │ │
└──────┴──────┴──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┴──────┴──────┘
│ │ │ │ │ │ │ │ │ │
└──────┴──────┴──────┴──────┘ └──────┴──────┴──────┴──────┘
- Media controls on right side
⏭/⏮— Tap: Next track, Double-tap: Previous track
Activation: Hold Space + F together (conditional layer: L1 + L2)
┌──────┬──────┬──────┬──────┬──────┬──────┐ ┌──────┬──────┬──────┬──────┬──────┬──────┐
│ BT 0 │ BT 1 │ BT 2 │ BT 3 │ BT 4 │ │ │ BT 0 │ BT 1 │ BT 2 │ BT 3 │ BT 4 │ │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│ BOOT │RESET │ │ │ │ │ │ BLE │ USB │ TOG │ │RESET │ BOOT │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│ │ │ │ │██████│EP ON │ │ │ BT ← │ │ BT → │ │ │
├──────┼──────┼──────┼──────┼──────┼──────┼──────┐ ┌──────┼──────┼──────┼──────┼──────┼──────┼──────┤
│ │ │ │ │ │EP OFF│ │ │ │ │ │ │ │ │ │
└──────┴──────┴──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┴──────┴──────┘
│ │ │██████│ │ │ │ │ │BT CLR│
└──────┴──────┴──────┴──────┘ └──────┴──────┴──────┴──────┘
Bootloader & Reset:
| Key | Position | Function |
|---|---|---|
BOOT |
Top-left (TAB) | Enter bootloader (LEFT half) |
BOOT |
Top-right (\) | Enter bootloader (RIGHT half) |
RESET |
Second from left (Q) | Soft reset LEFT half |
RESET |
Second from right (P) | Soft reset RIGHT half |
Bluetooth:
| Key | Function |
|---|---|
BT 0-4 |
Select Bluetooth profile |
BT ←/→ |
Previous/Next profile |
BT CLR |
Clear current profile pairing |
Output:
| Key | Function |
|---|---|
BLE |
Force Bluetooth output |
USB |
Force USB output |
TOG |
Toggle between USB/Bluetooth |
Power:
| Key | Function |
|---|---|
EP ON |
External power ON |
EP OFF |
External power OFF |
Flash LEFT half:
1. Hold Space (left thumb) + F (left index)
→ Layer 3 activates
2. While holding, tap TAB (top-left key)
→ Left half enters bootloader
3. /Volumes/NICENANO appears on Mac
4. Copy firmware:
cp build/leeloo_left-nice_nano-zmk.uf2 /Volumes/NICENANO/
Flash RIGHT half:
1. Hold Space (left thumb) + F (left index)
→ Layer 3 activates
2. While holding, tap \ (backslash, top-right key)
→ Right half enters bootloader
3. /Volumes/NICENANO appears on Mac
4. Copy firmware:
cp build/leeloo_right-nice_nano-zmk.uf2 /Volumes/NICENANO/
- Locate the reset button on the nice!nano controller
- Double-tap the reset button quickly (within 500ms)
/Volumes/NICENANOappears- Copy the .uf2 file to the drive
If no reset button is accessible:
- Use tweezers to short RST and GND pins twice quickly
/Volumes/NICENANOappears
LAYER 3 (hold Space + F):
LEFT HALF RIGHT HALF
┌──────┬──────┬─────────────────┐ ┌─────────────────┬──────┬──────┐
│ BOOT │RESET │ │ │ │RESET │ BOOT │
│ (TAB)│ (Q) │ ... │ │ ... │ (P) │ (\) │
└──────┴──────┴─────────────────┘ └─────────────────┴──────┴──────┘
↑ ↑
│ │
└── Tap here for LEFT bootloader Tap here for RIGHT ─────┘
| Change Type | Flash |
|---|---|
| Keymap only | Left half only (central) |
| Config changes | Both halves |
| Firmware update | Both halves |
- Activate Layer 3: Hold Space + F
- Select profile: Tap a number key (` = 0, 1-4 = profiles 1-4)
- Release keys
- On your device: Go to Bluetooth settings → Find "Leeloo" → Connect
1. Hold Space + F
2. Tap the profile number (1, 2, 3, or 4)
3. Release — keyboard connects to that device
| Action | Keys (in Layer 3) |
|---|---|
| Select profile 0 | ` (grave) |
| Select profile 1-4 | 1, 2, 3, 4 |
| Previous profile | J |
| Next profile | L |
| Clear current profile | DEL (right thumb) |
When connected via USB but want to type over Bluetooth:
1. Hold Space + F
2. Tap Y (BLE) to force Bluetooth
— or tap U (USB) to force USB
— or tap I (TOG) to toggle
3. Release
- Profile 0 is selected by the grave/tilde key (`)
- Clear a profile before re-pairing to a new device
- Both halves share Bluetooth profiles (only flash left for BT changes)
- See docs/BLUETOOTH.md for troubleshooting
# Build
just build # Build both halves
just build-left # Build left only
just build-right # Build right only
# Flash (waits for bootloader)
just flash-left # Flash left half
just flash-right # Flash right half
just flash-both # Flash both sequentially
# Combined
just left # Build + flash left
just right # Build + flash right
just all # Build + flash both
# Utilities
just clean # Remove .uf2 files
just clean-all # Remove everything + docker image
just list # Show built firmware files
# Settings reset (clears Bluetooth bonds)
just build-reset # Build reset firmware
just flash-reset # Flash reset to both halvesmake build # Build both halves
make flash-left # Build + flash left (alias: make l)
make flash-right # Build + flash right (alias: make r)
make clean # Clean for fresh rebuild- Docker — via colima on macOS
- Just — task runner (
brew install justor via nix)
# Start Docker (if using colima)
colima start
# Or use nix-shell
nix-shell -p colima --run "colima start"Firmware is also built automatically on push. Download artifacts from the Actions tab.
This config uses "timeless" homerow mods with bilateral trigger.
Left hand (hold for modifier):
- A → GUI (Command)
- S → ALT (Option)
- D → CTRL
Right hand (hold for modifier):
- J → SHIFT
- K → CTRL
- L → ALT (Option)
- ; → GUI (Command)
Settings:
- Tapping term: 280ms
- Quick tap: 175ms
- Require prior idle: 150ms
See docs/HOMEROW_MODS.md for tuning.
- Try a different USB cable (some are charge-only)
- Try a different USB port
- Double-tap reset faster (within 500ms)
- Check if controller is damaged
- Check Bluetooth connection on your device
- Try toggling output: Layer 3 → Y (BLE) or U (USB)
- Soft reset: Layer 3 → Q (left) or P (right)
- Re-flash firmware
- Clear the profile: Layer 3 → DEL
- Remove device from your computer's Bluetooth settings
- Re-pair
- Ensure both halves have matching firmware versions
- Flash both halves with latest firmware
- Try settings reset:
just flash-resetthenjust flash-both
| Guide | Description |
|---|---|
| Bluetooth | Pairing, profiles, troubleshooting |
| Battery | Monitoring battery on macOS |
| Bootloader | Detailed flashing guide |
| Firmware Updates | Updating ZMK |
| Homerow Mods | Tuning hold-tap behavior |
| Macro | Keys | Description |
|---|---|---|
SCRN |
Cmd+Shift+Ctrl+4 | Screenshot to clipboard |
SCR2 |
Cmd+Shift+4 | Screenshot to file |
WLEFT |
Option+Left | Word left |
WRIGHT |
Option+Right | Word right |
| Symbol | Meaning |
|---|---|
| ⌘ | Command (GUI) |
| ⌥ | Option (ALT) |
| ⌃ | Control (CTRL) |
| ⇧ | Shift |
| ⎋ | Escape |
| ← ↓ ↑ → | Arrow keys |
| ⏯ | Play/Pause |
| ⏭ ⏮ | Next/Previous track |