Skip to content
Sofle keymap

Sofle keymap

The Eyelash Sofle split keyboard’s layers, with every key labelled by what it does on these machines rather than what it sends: NAV’s Super+Shift+K is drawn as Mon ↑ because binds.kdl binds it to focus-monitor-up. The firmware and its own key-by-key reference live in rdlu/sofleii; this page joins that keymap to the configs in this repo.

Hover or focus a key for what it sends, what that does, and the line it comes from. Printable version: sofle-keymap.pdf (A4, one page of basics and every layer).

Generated by tools/gen-docs.py from a snapshot of the sofleii keymap in tools/sofle/ (refresh it with mise run docs-sofle-sync) and the live niri and tmux configs, so a rebind in binds.kdl shows up here on the next build.

niri action niri runs a command tmux types text firmware (Bluetooth, underglow, mouse) layer key spare: sent, not bound yet kernel SysRq held for this layer falls through plain key Small top legend: the chord sent · bottom: the hold · ◆ Super (niri's Mod) · ⌃ Ctrl · ⌥ Alt · ⇧ Shift

BASE

Always on. The joystick (centre column) and the left encoder are media keys; the thumbs hold the other layers.

layer 0 · BASErdlu/sofleii @ 982d0b3
`
key
` · position 0
sends
`
zmk
&kp GRAVE
1
key
1 · position 1
sends
1
zmk
&kp N1
2
key
2 · position 2
sends
2
zmk
&kp N2
3
key
3 · position 3
sends
3
zmk
&kp N3
4
key
4 · position 4
sends
4
zmk
&kp N4
5
key
5 · position 5
sends
5
zmk
&kp N5
Vol+Vol +
key
joystick ↑ · position 6
sends
XF86AudioRaiseVolume
does
Vol + (wpctl)
bind
niri: spawn "wpctl" "set-volume" "-l" "1.0" "@DEFAULT_AUDIO_SINK@" "5%+"
from
niri/dot-config/niri/binds.kdl:56
zmk
&kp C_VOL_UP
6
key
6 · position 7
sends
6
zmk
&kp N6
7
key
7 · position 8
sends
7
zmk
&kp N7
8
key
8 · position 9
sends
8
zmk
&kp N8
9
key
9 · position 10
sends
9
zmk
&kp N9
0
key
0 · position 11
sends
0
zmk
&kp N0
-
key
- · position 12
sends
-
zmk
&kp MINUS
Tab
key
Tab · position 13
sends
Tab
zmk
&kp TAB
Q
key
Q · position 14
sends
Q
zmk
&kp Q
W
key
W · position 15
sends
W
zmk
&kp W
E
key
E · position 16
sends
E
zmk
&kp E
R
key
R · position 17
sends
R
zmk
&kp R
T
key
T · position 18
sends
T
zmk
&kp T
Vol−Vol −
key
joystick ↓ · position 19
sends
XF86AudioLowerVolume
does
Vol − (wpctl)
bind
niri: spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "5%-"
from
niri/dot-config/niri/binds.kdl:57
zmk
&kp C_VOL_DN
Y
key
Y · position 20
sends
Y
zmk
&kp Y
U
key
U · position 21
sends
U
zmk
&kp U
I
key
I · position 22
sends
I
zmk
&kp I
O
key
O · position 23
sends
O
zmk
&kp O
P
key
P · position 24
sends
P
zmk
&kp P
=
key
= · position 25
sends
=
zmk
&kp EQUAL
Esc
key
Esc · position 26
sends
Escape
zmk
&kp ESC
A
key
A · position 27
sends
A
zmk
&kp A
S⌥
key
S · position 28
sends
S
hold
Alt
zmk
&hml LALT S
D⌃
key
D · position 29
sends
D
hold
Ctrl
zmk
&hml LCTRL D
F⇧
key
F · position 30
sends
F
hold
Shift
zmk
&hml_idx LSHFT F
G
key
G · position 31
sends
G
zmk
&kp G
PlayPlay / pause
key
joystick ← · position 32
sends
XF86AudioPlay
does
Play / pause (playerctl)
bind
niri: spawn-sh "playerctl play-pause"
from
niri/dot-config/niri/binds.kdl:68
zmk
&kp C_PP
H
key
H · position 33
sends
H
zmk
&kp H
J⇧
key
J · position 34
sends
J
hold
Shift
zmk
&hmr_idx RSHFT J
K⌃
key
K · position 35
sends
K
hold
Ctrl
zmk
&hmr RCTRL K
L⌥
key
L · position 36
sends
L
hold
Alt
zmk
&hmr LALT L
;
key
; · position 37
sends
;
zmk
&kp SEMI
'
key
' · position 38
sends
'
zmk
&kp APOS
\
key
\ · position 39
sends
\
zmk
&kp BSLH
Z
key
Z · position 40
sends
Z
zmk
&kp Z
X
key
X · position 41
sends
X
zmk
&kp X
C
key
C · position 42
sends
C
zmk
&kp C
V
key
V · position 43
sends
V
zmk
&kp V
B
key
B · position 44
sends
B
zmk
&kp B
NextNext
key
joystick → · position 45
sends
XF86AudioNext
does
Next (playerctl)
bind
niri: spawn-sh "playerctl next"
from
niri/dot-config/niri/binds.kdl:66
zmk
&kp C_NEXT
N
key
N · position 46
sends
N
zmk
&kp N
M
key
M · position 47
sends
M
zmk
&kp M
,
key
, · position 48
sends
,
zmk
&kp COMMA
.
key
. · position 49
sends
.
zmk
&kp DOT
/
key
/ · position 50
sends
/
zmk
&kp FSLH
⏎
key
⏎ · position 51
sends
Enter
zmk
&kp RET
MuteMute
key
encoder press · position 52
sends
XF86AudioMute
does
Mute (wpctl)
bind
niri: spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"
from
niri/dot-config/niri/binds.kdl:58
zmk
&kp C_MUTE
SYS|NUM
key
SYS|NUM · position 53
does
hold for layer 4 (SYS|NUM)
zmk
&mo 4
F11
key
F11 · position 54
sends
F11
zmk
&kp F11
◆
key
◆ · position 55
sends
Super
zmk
&kp LGUI
NAV
key
NAV · position 56
does
hold for layer 1 (NAV)
zmk
&mo 1
⌫
key
⌫ · position 57
sends
Backspace
zmk
&kp BSPC
MuteMute
key
joystick press · position 58
sends
XF86AudioMute
does
Mute (wpctl)
bind
niri: spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"
from
niri/dot-config/niri/binds.kdl:58
zmk
&kp C_MUTE
Space
key
Space · position 59
sends
Space
zmk
&kp SPACE
CODE
key
CODE · position 60
does
hold for layer 2 (CODE)
zmk
&mo 2
CapsWd
key
CapsWd · position 61
does
Caps Word: the next word in capitals
zmk
&caps_word
F12tmux OFFAltGr
key
F12 · position 62
sends
F12
does
tmux: toggle nested OFF mode (pass keys to an inner tmux)
hold
AltGr (third level: the usbr layout's ã õ ç …)
bind
tmux: bind -T root F12
from
terminal/dot-tmux.conf:11
zmk
&ralt_mt RALT F12
MEDIA
key
MEDIA · position 63
does
hold for layer 3 (MEDIA)
zmk
&mo 3

NAV

Hold the left thumb’s NAV key. The left half drives niri: workspaces on Tab/Q, monitors on the home row, moving the column on the bottom row, plus the screenshot column on the inner edge. S and D stay Alt and Ctrl when held.

layer 1 · NAVrdlu/sofleii @ 982d0b3
F12tmux OFF
key
` · position 0
sends
F12
does
tmux: toggle nested OFF mode (pass keys to an inner tmux)
bind
tmux: bind -T root F12
from
terminal/dot-tmux.conf:11
zmk
&kp F12
F1
key
1 · position 1
sends
F1
zmk
&kp F1
F2
key
2 · position 2
sends
F2
zmk
&kp F2
F3
key
3 · position 3
sends
F3
zmk
&kp F3
F4
key
4 · position 4
sends
F4
zmk
&kp F4
F5
key
5 · position 5
sends
F5
zmk
&kp F5
↑
key
joystick ↑ · position 6
sends
Up
zmk
&kp UP_ARROW
F6
key
6 · position 7
sends
F6
zmk
&kp F6
F7
key
7 · position 8
sends
F7
zmk
&kp F7
F8
key
8 · position 9
sends
F8
zmk
&kp F8
F9
key
9 · position 10
sends
F9
zmk
&kp F9
F10
key
0 · position 11
sends
F10
zmk
&kp F10
F11
key
- · position 12
sends
F11
zmk
&kp F11
◆UWS ↓
key
Tab · position 13
sends
Super+U
does
Focus workspace down
bind
niri: focus-workspace-down
from
niri/dot-config/niri/binds.kdl:143
zmk
&kp LG(U)
◆IWS ↑
key
Q · position 14
sends
Super+I
does
Focus workspace up
bind
niri: focus-workspace-up
from
niri/dot-config/niri/binds.kdl:144
zmk
&kp LG(I)
W
key
W · position 15
does
transparent: falls through to the layer below
zmk
&trans
E
key
E · position 16
does
transparent: falls through to the layer below
zmk
&trans
R
key
R · position 17
does
transparent: falls through to the layer below
zmk
&trans
⌃PrtScShot screen
key
T · position 18
sends
Ctrl+Print
does
Screenshot monitor
bind
niri: screenshot-screen
from
niri/dot-config/niri/binds.kdl:290
zmk
&kp LC(PSCRN)
↓
key
joystick ↓ · position 19
sends
Down
zmk
&kp DOWN_ARROW
Home
key
Y · position 20
sends
Home
zmk
&kp HOME
PgDn
key
U · position 21
sends
Page Down
zmk
&kp PG_DN
PgUp
key
I · position 22
sends
Page Up
zmk
&kp PG_UP
End
key
O · position 23
sends
End
zmk
&kp END
Ins
key
P · position 24
sends
Insert
zmk
&kp INS
PrtScShot region
key
= · position 25
sends
Print
does
Screenshot region
bind
niri: screenshot
from
niri/dot-config/niri/binds.kdl:289
zmk
&kp PRINTSCREEN
◆⇧HMon ←
key
Esc · position 26
sends
Super+Shift+H
does
Focus monitor left
bind
niri: focus-monitor-left
from
niri/dot-config/niri/binds.kdl:112
zmk
&kp LG(LS(H))
◆⇧JMon ↓
key
A · position 27
sends
Super+Shift+J
does
Focus monitor down
bind
niri: focus-monitor-down
from
niri/dot-config/niri/binds.kdl:113
zmk
&kp LG(LS(J))
◆⇧KMon ↑⌥
key
S · position 28
sends
Super+Shift+K
does
Focus monitor up
hold
Alt
bind
niri: focus-monitor-up
from
niri/dot-config/niri/binds.kdl:114
zmk
&hml LALT LG(LS(K))
◆⇧LMon →⌃
key
D · position 29
sends
Super+Shift+L
does
Focus monitor right
hold
Ctrl
bind
niri: focus-monitor-right
from
niri/dot-config/niri/binds.kdl:115
zmk
&hml LCTRL LG(LS(L))
F
key
F · position 30
does
transparent: falls through to the layer below
zmk
&trans
⌥PrtScShot window
key
G · position 31
sends
Alt+Print
does
Screenshot window
bind
niri: screenshot-window
from
niri/dot-config/niri/binds.kdl:292
zmk
&kp LA(PSCRN)
←
key
joystick ← · position 32
sends
Left
zmk
&kp LEFT_ARROW
←
key
H · position 33
sends
Left
zmk
&kp LEFT
↓
key
J · position 34
sends
Down
zmk
&kp DOWN
↑
key
K · position 35
sends
Up
zmk
&kp UP
→
key
L · position 36
sends
Right
zmk
&kp RIGHT
Del
key
; · position 37
sends
Delete
zmk
&kp DEL
Pause
key
' · position 38
sends
Pause
zmk
&kp PAUSE_BREAK
◆⌃UCol → WS ↓
key
\ · position 39
sends
Super+Ctrl+U
does
Move column to workspace down
bind
niri: move-column-to-workspace-down
from
niri/dot-config/niri/binds.kdl:147
zmk
&kp LG(LC(U))
◆⌃ICol → WS ↑
key
Z · position 40
sends
Super+Ctrl+I
does
Move column to workspace up
bind
niri: move-column-to-workspace-up
from
niri/dot-config/niri/binds.kdl:148
zmk
&kp LG(LC(I))
◆⌃⇧HCol → Mon ←
key
X · position 41
sends
Super+Ctrl+Shift+H
does
Move column to monitor left
bind
niri: move-column-to-monitor-left
from
niri/dot-config/niri/binds.kdl:121
zmk
&kp LG(LS(LC(H)))
◆⌃⇧LCol → Mon →
key
C · position 42
sends
Super+Ctrl+Shift+L
does
Move column to monitor right
bind
niri: move-column-to-monitor-right
from
niri/dot-config/niri/binds.kdl:124
zmk
&kp LG(LS(LC(L)))
V
key
V · position 43
does
transparent: falls through to the layer below
zmk
&trans
⇧PrtScShot + edit
key
B · position 44
sends
Shift+Print
does
Screenshot and annotate
bind
niri: spawn "noctalia" "msg" "screenshot-annotate"
from
niri/dot-config/niri/binds.kdl:291
zmk
&kp LS(PSCRN)
→
key
joystick → · position 45
sends
Right
zmk
&kp RIGHT_ARROW
◆1WS 1
key
N · position 46
sends
Super+1
does
Focus workspace 1
bind
niri: focus-workspace 1
from
niri/dot-config/niri/binds.kdl:199
zmk
&kp LG(N1)
◆UWS ↓
key
M · position 47
sends
Super+U
does
Focus workspace down
bind
niri: focus-workspace-down
from
niri/dot-config/niri/binds.kdl:143
zmk
&kp LG(U)
◆IWS ↑
key
, · position 48
sends
Super+I
does
Focus workspace up
bind
niri: focus-workspace-up
from
niri/dot-config/niri/binds.kdl:144
zmk
&kp LG(I)
◆9WS 9
key
. · position 49
sends
Super+9
does
Focus workspace 9
bind
niri: focus-workspace 9
from
niri/dot-config/niri/binds.kdl:207
zmk
&kp LG(N9)
◆⇧HMon ←
key
/ · position 50
sends
Super+Shift+H
does
Focus monitor left
bind
niri: focus-monitor-left
from
niri/dot-config/niri/binds.kdl:112
zmk
&kp LG(LS(H))
◆⇧LMon →
key
⏎ · position 51
sends
Super+Shift+L
does
Focus monitor right
bind
niri: focus-monitor-right
from
niri/dot-config/niri/binds.kdl:115
zmk
&kp LG(LS(L))
Mute
key
encoder press · position 52
does
transparent: falls through to the layer below (Mute (wpctl))
zmk
&trans
SYS|NUM
key
SYS|NUM · position 53
does
transparent: falls through to the layer below (hold for layer 4 (SYS|NUM))
zmk
&trans
F11
key
F11 · position 54
does
transparent: falls through to the layer below
zmk
&trans
◆
key
◆ · position 55
does
transparent: falls through to the layer below
zmk
&trans
NAV
key
NAV · position 56
does
held to be on this layer
zmk
&trans
Del
key
⌫ · position 57
sends
Delete
zmk
&kp DEL
⏎
key
joystick press · position 58
sends
Enter
zmk
&kp ENTER
Menu
key
Space · position 59
sends
Menu (context menu)
zmk
&kp K_APP
⌃
key
CODE · position 60
sends
Ctrl
zmk
&kp LCTRL
←
key
CapsWd · position 61
sends
Left
zmk
&kp LEFT
→
key
F12 · position 62
sends
Right
zmk
&kp RIGHT
MEDIA
key
MEDIA · position 63
does
transparent: falls through to the layer below (hold for layer 3 (MEDIA))
zmk
&trans

CODE

Hold the right thumb’s CODE key. Digraphs and snippets typed as one key; ▏ marks where the cursor ends up.

layer 2 · CODErdlu/sofleii @ 982d0b3
`
key
` · position 0
does
transparent: falls through to the layer below
zmk
&trans
~s(▏)
key
1 · position 1
does
types '~s()', cursor at ▏
bind
macro M_SIGS
zmk
&M_SIGS
~w(▏)
key
2 · position 2
does
types '~w()', cursor at ▏
bind
macro M_SIGW
zmk
&M_SIGW
~r/▏/
key
3 · position 3
does
types '~r//', cursor at ▏
bind
macro M_SIGR
zmk
&M_SIGR
~D[▏]
key
4 · position 4
does
types '~D[]', cursor at ▏
bind
macro M_SIGD
zmk
&M_SIGD
<>
key
5 · position 5
does
types '<>'
bind
macro M_CONCAT
zmk
&M_CONCAT
Vol +
key
joystick ↑ · position 6
does
transparent: falls through to the layer below (Vol + (wpctl))
zmk
&trans
6
key
6 · position 7
does
transparent: falls through to the layer below
zmk
&trans
{ ▏ }
key
7 · position 8
does
types '{ }', cursor at ▏
bind
macro M_HEEXI
zmk
&M_HEEXI
<% ▏ %>
key
8 · position 9
does
types '<% %>', cursor at ▏
bind
macro M_HEEXNP
zmk
&M_HEEXNP
9
key
9 · position 10
does
transparent: falls through to the layer below
zmk
&trans
0
key
0 · position 11
does
transparent: falls through to the layer below
zmk
&trans
-
key
- · position 12
does
transparent: falls through to the layer below
zmk
&trans
Tab
key
Tab · position 13
does
transparent: falls through to the layer below
zmk
&trans
Q
key
Q · position 14
does
transparent: falls through to the layer below
zmk
&trans
<-
key
W · position 15
does
types '<-'
bind
macro M_LARROW
zmk
&M_LARROW
|>
key
E · position 16
does
types '|>'
bind
macro M_PIPE
zmk
&M_PIPE
->
key
R · position 17
does
types '->'
bind
macro M_ARROW
zmk
&M_ARROW
=>
key
T · position 18
does
types '=>'
bind
macro M_FARROW
zmk
&M_FARROW
Vol −
key
joystick ↓ · position 19
does
transparent: falls through to the layer below (Vol − (wpctl))
zmk
&trans
::
key
Y · position 20
does
types '::'
bind
macro M_DCOLON
zmk
&M_DCOLON
|_|
key
U · position 21
does
types '|_|'
bind
macro M_CLOSURE
zmk
&M_CLOSURE
dbg!(▏)
key
I · position 22
does
types 'dbg!()', cursor at ▏
bind
macro M_DBG
zmk
&M_DBG
todo!(▏)
key
O · position 23
does
types 'todo!()', cursor at ▏
bind
macro M_TODO
zmk
&M_TODO
::<▏>
key
P · position 24
does
types '::<>', cursor at ▏
bind
macro M_TFISH
zmk
&M_TFISH
=
key
= · position 25
does
transparent: falls through to the layer below
zmk
&trans
`
key
Esc · position 26
sends
`
zmk
&kp GRAVE
{
key
A · position 27
sends
{
zmk
&kp LBRC
}⌥
key
S · position 28
sends
}
hold
Alt
zmk
&mt LALT RBRC
[⌃
key
D · position 29
sends
[
hold
Ctrl
zmk
&mt LCTRL LBKT
]⇧
key
F · position 30
sends
]
hold
Shift
zmk
&mt LSHFT RBKT
+
key
G · position 31
sends
+
zmk
&kp PLUS
Play / pause
key
joystick ← · position 32
does
transparent: falls through to the layer below (Play / pause (playerctl))
zmk
&trans
(▏)
key
H · position 33
does
types '()', cursor at ▏
bind
macro M_PAREN
zmk
&M_PAREN
[▏]
key
J · position 34
does
types '[]', cursor at ▏
bind
macro M_BRKT
zmk
&M_BRKT
{▏}
key
K · position 35
does
types '{}', cursor at ▏
bind
macro M_BRACE
zmk
&M_BRACE
"▏"
key
L · position 36
does
types '""', cursor at ▏
bind
macro M_DQUO
zmk
&M_DQUO
;
key
; · position 37
does
transparent: falls through to the layer below
zmk
&trans
'
key
' · position 38
does
transparent: falls through to the layer below
zmk
&trans
\
key
\ · position 39
does
transparent: falls through to the layer below
zmk
&trans
-
key
Z · position 40
sends
-
zmk
&kp MINUS
_
key
X · position 41
sends
_
zmk
&kp UNDER
(
key
C · position 42
sends
(
zmk
&kp LPAR
)
key
V · position 43
sends
)
zmk
&kp RPAR
=
key
B · position 44
sends
=
zmk
&kp EQUAL
Next
key
joystick → · position 45
does
transparent: falls through to the layer below (Next (playerctl))
zmk
&trans
==
key
N · position 46
does
types '=='
bind
macro M_EQEQ
zmk
&M_EQEQ
!=
key
M · position 47
does
types '!='
bind
macro M_NEQ
zmk
&M_NEQ
<=
key
, · position 48
does
types '<='
bind
macro M_LEQ
zmk
&M_LEQ
>=
key
. · position 49
does
types '>='
bind
macro M_GEQ
zmk
&M_GEQ
/
key
/ · position 50
does
transparent: falls through to the layer below
zmk
&trans
⏎
key
⏎ · position 51
does
transparent: falls through to the layer below
zmk
&trans
Mute
key
encoder press · position 52
does
transparent: falls through to the layer below (Mute (wpctl))
zmk
&trans
SYS|NUM
key
SYS|NUM · position 53
does
transparent: falls through to the layer below (hold for layer 4 (SYS|NUM))
zmk
&trans
F11
key
F11 · position 54
does
transparent: falls through to the layer below
zmk
&trans
◆
key
◆ · position 55
does
transparent: falls through to the layer below
zmk
&trans
NAV
key
NAV · position 56
does
transparent: falls through to the layer below (hold for layer 1 (NAV))
zmk
&trans
Del
key
⌫ · position 57
sends
Delete
zmk
&kp DEL
Mute
key
joystick press · position 58
does
transparent: falls through to the layer below (Mute (wpctl))
zmk
&trans
Space
key
Space · position 59
does
transparent: falls through to the layer below
zmk
&trans
CODE
key
CODE · position 60
does
held to be on this layer
zmk
&trans
CapsWd
key
CapsWd · position 61
does
transparent: falls through to the layer below (Caps Word: the next word in capitals)
zmk
&trans
tmux OFF
key
F12 · position 62
does
transparent: falls through to the layer below (tmux: toggle nested OFF mode (pass keys to an inner tmux))
zmk
&trans
MEDIA
key
MEDIA · position 63
does
transparent: falls through to the layer below (hold for layer 3 (MEDIA))
zmk
&trans

MEDIA

Hold the right thumb’s outer key. Volume and playback through wpctl and playerctl; F20 is XF86AudioMicMute in xkb, so it toggles the microphone. E and D are the laptop panel’s brightness, W and S an external monitor’s (ext-brightness, DDC/CI).

The number row and T send F14–F19 and F24, and B sends F21: keys kept for host binds. xkb names most of the upper F-keys, so binds.kdl uses those names:

KeySentxkb keysymBound to
`F14XF86Launch5caffeine on/off
1F15XF86Launch6do not disturb on/off
2F16XF86Launch7Bluetooth on/off (rfkill)
3F17XF86Launch8Noctalia control center
4F18XF86Launch9emoji picker
5F19F19clipboard history
TF24F24power menu
BF21XF86TouchpadToggletouchpad on/off (touchpad-toggle)
NF20XF86AudioMicMutemic mute
(game layers)F13XF86Toolspush-to-talk in games; kept unbound desktop-wide
(none)F22 / F23XF86TouchpadOn / XF86TouchpadOfftouchpad on / off
layer 3 · MEDIArdlu/sofleii @ 982d0b3
F14Caffeine
key
` · position 0
sends
F14→XF86Launch5
does
Caffeine on/off
bind
niri: spawn "~/.local/bin/caffeine"
from
niri/dot-config/niri/binds.kdl:318
zmk
&kp F14
F15DND
key
1 · position 1
sends
F15→XF86Launch6
does
Do not disturb on/off
bind
niri: spawn "noctalia" "msg" "notification-dnd-toggle"
from
niri/dot-config/niri/binds.kdl:319
zmk
&kp F15
F16Bluetooth
key
2 · position 2
sends
F16→XF86Launch7
does
Bluetooth on/off
bind
niri: spawn "rfkill" "toggle" "bluetooth"
from
niri/dot-config/niri/binds.kdl:320
zmk
&kp F16
F17Control center
key
3 · position 3
sends
F17→XF86Launch8
does
Control center
bind
niri: spawn "noctalia" "msg" "panel-toggle" "control-center"
from
niri/dot-config/niri/binds.kdl:321
zmk
&kp F17
F18Emoji
key
4 · position 4
sends
F18→XF86Launch9
does
Emoji picker
bind
niri: spawn "noctalia" "msg" "panel-toggle" "launcher" "/emo"
from
niri/dot-config/niri/binds.kdl:322
zmk
&kp F18
F19Clipboard
key
5 · position 5
sends
F19
does
Clipboard history
bind
niri: spawn "noctalia" "msg" "panel-toggle" "clipboard"
from
niri/dot-config/niri/binds.kdl:323
zmk
&kp F19
Vol+Vol +
key
joystick ↑ · position 6
sends
XF86AudioRaiseVolume
does
Vol + (wpctl)
bind
niri: spawn "wpctl" "set-volume" "-l" "1.0" "@DEFAULT_AUDIO_SINK@" "5%+"
from
niri/dot-config/niri/binds.kdl:56
zmk
&kp C_VOL_UP
6
key
6 · position 7
does
transparent: falls through to the layer below
zmk
&trans
7
key
7 · position 8
does
transparent: falls through to the layer below
zmk
&trans
8
key
8 · position 9
does
transparent: falls through to the layer below
zmk
&trans
9
key
9 · position 10
does
transparent: falls through to the layer below
zmk
&trans
0
key
0 · position 11
does
transparent: falls through to the layer below
zmk
&trans
-
key
- · position 12
does
transparent: falls through to the layer below
zmk
&trans
Tab
key
Tab · position 13
does
transparent: falls through to the layer below
zmk
&trans
Q
key
Q · position 14
does
transparent: falls through to the layer below
zmk
&trans
◆Bri+Ext bri +
key
W · position 15
sends
Super+XF86MonBrightnessUp
does
External monitor brightness up
bind
niri: spawn "~/.local/bin/ext-brightness" "+10" · works on the lock screen
from
niri/dot-config/niri/binds.kdl:64
zmk
&kp LG(C_BRI_UP)
Bri+Bright +
key
E · position 16
sends
XF86MonBrightnessUp
does
Bright + (brightnessctl)
bind
niri: spawn "brightnessctl" "-q" "-c" "backlight" "set" "5%+"
from
niri/dot-config/niri/binds.kdl:61
zmk
&kp C_BRI_UP
R
key
R · position 17
does
transparent: falls through to the layer below
zmk
&trans
F24Power menu
key
T · position 18
sends
F24
does
Menu Power
bind
niri: spawn "~/.local/bin/rodii-power-menu"
from
niri/dot-config/niri/binds.kdl:324
zmk
&kp F24
Vol−Vol −
key
joystick ↓ · position 19
sends
XF86AudioLowerVolume
does
Vol − (wpctl)
bind
niri: spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "5%-"
from
niri/dot-config/niri/binds.kdl:57
zmk
&kp C_VOL_DN
Y
key
Y · position 20
does
transparent: falls through to the layer below
zmk
&trans
U
key
U · position 21
does
transparent: falls through to the layer below
zmk
&trans
I
key
I · position 22
does
transparent: falls through to the layer below
zmk
&trans
O
key
O · position 23
does
transparent: falls through to the layer below
zmk
&trans
P
key
P · position 24
does
transparent: falls through to the layer below
zmk
&trans
=
key
= · position 25
does
transparent: falls through to the layer below
zmk
&trans
Esc
key
Esc · position 26
does
transparent: falls through to the layer below
zmk
&trans
A
key
A · position 27
does
transparent: falls through to the layer below
zmk
&trans
◆Bri−Ext bri -
key
S · position 28
sends
Super+XF86MonBrightnessDown
does
External monitor brightness down
bind
niri: spawn "~/.local/bin/ext-brightness" "-10" · works on the lock screen
from
niri/dot-config/niri/binds.kdl:65
zmk
&kp LG(C_BRI_DN)
Bri−Bright −
key
D · position 29
sends
XF86MonBrightnessDown
does
Bright − (brightnessctl)
bind
niri: spawn "brightnessctl" "-q" "-c" "backlight" "--min-value=1%" "set" "5%-"
from
niri/dot-config/niri/binds.kdl:62
zmk
&kp C_BRI_DN
Del
key
F · position 30
sends
Delete
zmk
&kp DEL
G
key
G · position 31
does
transparent: falls through to the layer below
zmk
&trans
PlayPlay / pause
key
joystick ← · position 32
sends
XF86AudioPlay
does
Play / pause (playerctl)
bind
niri: spawn-sh "playerctl play-pause"
from
niri/dot-config/niri/binds.kdl:68
zmk
&kp C_PP
Vol−Vol −
key
H · position 33
sends
XF86AudioLowerVolume
does
Vol − (wpctl)
bind
niri: spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "5%-"
from
niri/dot-config/niri/binds.kdl:57
zmk
&kp C_VOL_DN
Vol+Vol +
key
J · position 34
sends
XF86AudioRaiseVolume
does
Vol + (wpctl)
bind
niri: spawn "wpctl" "set-volume" "-l" "1.0" "@DEFAULT_AUDIO_SINK@" "5%+"
from
niri/dot-config/niri/binds.kdl:56
zmk
&kp C_VOL_UP
PlayPlay / pause
key
K · position 35
sends
XF86AudioPlay
does
Play / pause (playerctl)
bind
niri: spawn-sh "playerctl play-pause"
from
niri/dot-config/niri/binds.kdl:68
zmk
&kp C_PP
Stop
key
L · position 36
sends
XF86AudioStop
zmk
&kp C_STOP
;
key
; · position 37
does
transparent: falls through to the layer below
zmk
&trans
'
key
' · position 38
does
transparent: falls through to the layer below
zmk
&trans
\
key
\ · position 39
does
transparent: falls through to the layer below
zmk
&trans
Z
key
Z · position 40
does
transparent: falls through to the layer below
zmk
&trans
X
key
X · position 41
does
transparent: falls through to the layer below
zmk
&trans
C
key
C · position 42
does
transparent: falls through to the layer below
zmk
&trans
V
key
V · position 43
does
transparent: falls through to the layer below
zmk
&trans
F21Touchpad
key
B · position 44
sends
F21→XF86TouchpadToggle
does
Touchpad on/off
bind
niri: spawn "~/.local/bin/touchpad-toggle" · works on the lock screen
from
niri/dot-config/niri/binds.kdl:302
zmk
&kp F21
NextNext
key
joystick → · position 45
sends
XF86AudioNext
does
Next (playerctl)
bind
niri: spawn-sh "playerctl next"
from
niri/dot-config/niri/binds.kdl:66
zmk
&kp C_NEXT
F20Mic mute
key
N · position 46
sends
F20→XF86AudioMicMute
does
Mic mute (wpctl)
bind
niri: spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"
from
niri/dot-config/niri/binds.kdl:59
zmk
&kp F20
MuteMute
key
M · position 47
sends
XF86AudioMute
does
Mute (wpctl)
bind
niri: spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"
from
niri/dot-config/niri/binds.kdl:58
zmk
&kp C_MUTE
PrevPrev
key
, · position 48
sends
XF86AudioPrev
does
Prev (playerctl)
bind
niri: spawn-sh "playerctl previous"
from
niri/dot-config/niri/binds.kdl:69
zmk
&kp C_PREV
NextNext
key
. · position 49
sends
XF86AudioNext
does
Next (playerctl)
bind
niri: spawn-sh "playerctl next"
from
niri/dot-config/niri/binds.kdl:66
zmk
&kp C_NEXT
/
key
/ · position 50
does
transparent: falls through to the layer below
zmk
&trans
⏎
key
⏎ · position 51
does
transparent: falls through to the layer below
zmk
&trans
Mute
key
encoder press · position 52
does
transparent: falls through to the layer below (Mute (wpctl))
zmk
&trans
SYS|NUM
key
SYS|NUM · position 53
does
transparent: falls through to the layer below (hold for layer 4 (SYS|NUM))
zmk
&trans
F11
key
F11 · position 54
does
transparent: falls through to the layer below
zmk
&trans
◆
key
◆ · position 55
does
transparent: falls through to the layer below
zmk
&trans
NAV
key
NAV · position 56
does
transparent: falls through to the layer below (hold for layer 1 (NAV))
zmk
&trans
⌫
key
⌫ · position 57
does
transparent: falls through to the layer below
zmk
&trans
MuteMute
key
joystick press · position 58
sends
XF86AudioMute
does
Mute (wpctl)
bind
niri: spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"
from
niri/dot-config/niri/binds.kdl:58
zmk
&kp C_MUTE
Space
key
Space · position 59
does
transparent: falls through to the layer below
zmk
&trans
CODE
key
CODE · position 60
does
transparent: falls through to the layer below (hold for layer 2 (CODE))
zmk
&trans
CapsWd
key
CapsWd · position 61
does
transparent: falls through to the layer below (Caps Word: the next word in capitals)
zmk
&trans
tmux OFF
key
F12 · position 62
does
transparent: falls through to the layer below (tmux: toggle nested OFF mode (pass keys to an inner tmux))
zmk
&trans
MEDIA
key
MEDIA · position 63
does
held to be on this layer
zmk
&trans

SYS|NUM

Hold the left thumb’s outer key. Bluetooth profiles, underglow and the mouse on the left, a numpad on the right. Three keys reach the host: B locks the screen (Super+Alt+L, loginctl lock-session), the top-right key sends XF86Calculator (GNOME Calculator), and the key under it is Magic SysRq.

SysRq holds Alt while you hold it, and Linux reads PrintScreen as SysRq, so holding it and tapping a letter sends a kernel SysRq command (R E I S U B and friends). Which ones run is kernel.sysrq’s bitmask: both notebooks have the systemd default, 16, which allows only S (sync) and refuses reboot, kill and power-off. Raising it is a deliberate local choice (/etc/sysctl.d/), not something this repo sets. NAV’s Alt+PrtSc (screenshot window) is the same chord, but as a single tap.

layer 4 · SYS|NUMrdlu/sofleii @ 982d0b3
BT clr
key
` · position 0
does
forget the selected Bluetooth profile's host
zmk
&bt BT_CLR
BT 1
key
1 · position 1
does
select Bluetooth profile 1
zmk
&bt BT_SEL 0
BT 2
key
2 · position 2
does
select Bluetooth profile 2
zmk
&bt BT_SEL 1
BT 3
key
3 · position 3
does
select Bluetooth profile 3
zmk
&bt BT_SEL 2
BT 4
key
4 · position 4
does
select Bluetooth profile 4
zmk
&bt BT_SEL 3
BT 5
key
5 · position 5
does
select Bluetooth profile 5
zmk
&bt BT_SEL 4
Ptr ↑
key
joystick ↑ · position 6
does
move the mouse pointer
zmk
&mmv MOVE_UP
NumLk
key
6 · position 7
sends
Num Lock
zmk
&kp KP_NUM
7
key
7 · position 8
sends
keypad 7
zmk
&kp KP_N7
8
key
8 · position 9
sends
keypad 8
zmk
&kp KP_N8
9
key
9 · position 10
sends
keypad 9
zmk
&kp KP_N9
-
key
0 · position 11
sends
keypad -
zmk
&kp KP_MINUS
CalcCalc
key
- · position 12
sends
XF86Calculator
does
Calculator
bind
niri: spawn "gnome-calculator"
from
niri/dot-config/niri/binds.kdl:297
zmk
&kp C_AL_CALC
Bri+
key
Tab · position 13
does
brightness up (+8, max 60) (zmk-rgb-layer, not the keymap)
zmk
&none
Sat+
key
Q · position 14
does
underglow: RGB_SAI
zmk
&rgb_ug RGB_SAI
Hue+
key
W · position 15
does
underglow: RGB_HUI
zmk
&rgb_ug RGB_HUI
FX+
key
E · position 16
does
underglow: RGB_EFF
zmk
&rgb_ug RGB_EFF
Back
key
R · position 17
does
mouse button MB4
zmk
&mkp MB4
Fwd
key
T · position 18
does
mouse button MB5
zmk
&mkp MB5
Ptr ↓
key
joystick ↓ · position 19
does
move the mouse pointer
zmk
&mmv MOVE_DOWN
/
key
Y · position 20
sends
keypad /
zmk
&kp KP_SLASH
4
key
U · position 21
sends
keypad 4
zmk
&kp KP_N4
5
key
I · position 22
sends
keypad 5
zmk
&kp KP_N5
6
key
O · position 23
sends
keypad 6
zmk
&kp KP_N6
+
key
P · position 24
sends
keypad +
zmk
&kp KP_PLUS
SysRq
key
= · position 25
sends
Alt+SysRq, Alt held
does
kernel Magic SysRq: keep holding, tap a command letter; kernel.sysrq decides which work (16, the systemd default: S, sync, only)
bind
macro SYSRQ
zmk
&SYSRQ
Bri−
key
Esc · position 26
does
brightness down (−8, min 4) (zmk-rgb-layer, not the keymap)
zmk
&none
Sat−
key
A · position 27
does
underglow: RGB_SAD
zmk
&rgb_ug RGB_SAD
Hue−
key
S · position 28
does
underglow: RGB_HUD
zmk
&rgb_ug RGB_HUD
FX−
key
D · position 29
does
underglow: RGB_EFR
zmk
&rgb_ug RGB_EFR
L click
key
F · position 30
does
mouse button LCLK
zmk
&mkp LCLK
R click
key
G · position 31
does
mouse button RCLK
zmk
&mkp RCLK
Ptr ←
key
joystick ← · position 32
does
move the mouse pointer
zmk
&mmv MOVE_LEFT
*
key
H · position 33
sends
keypad *
zmk
&kp KP_ASTERISK
1
key
J · position 34
sends
keypad 1
zmk
&kp KP_N1
2
key
K · position 35
sends
keypad 2
zmk
&kp KP_N2
3
key
L · position 36
sends
keypad 3
zmk
&kp KP_N3
⏎
key
; · position 37
sends
keypad Enter
zmk
&kp KP_ENTER
'
key
' · position 38
does
transparent: falls through to the layer below
zmk
&trans
RGB ⏻
key
\ · position 39
does
underglow: RGB_TOG
zmk
&rgb_ug RGB_TOG
Dark
key
Z · position 40
does
BASE mood: underglow off (zmk-rgb-layer, not the keymap)
zmk
&none
Dim
key
X · position 41
does
BASE mood: solid dim teal (zmk-rgb-layer, not the keymap)
zmk
&none
FX
key
C · position 42
does
BASE mood: step through breathe, spectrum, swirl (zmk-rgb-layer, not the keymap)
zmk
&none
M click
key
V · position 43
does
mouse button MCLK
zmk
&mkp MCLK
◆⌥LLock
key
B · position 44
sends
Super+Alt+L
does
Lock the Screen
bind
niri: spawn "loginctl" "lock-session"
from
niri/dot-config/niri/binds.kdl:21
zmk
&kp LG(LA(L))
Ptr →
key
joystick → · position 45
does
move the mouse pointer
zmk
&mmv MOVE_RIGHT
=
key
N · position 46
sends
keypad =
zmk
&kp KP_EQUAL
0
key
M · position 47
sends
keypad 0
zmk
&kp KP_N0
,
key
, · position 48
sends
,
zmk
&kp COMMA
.
key
. · position 49
sends
keypad .
zmk
&kp KP_DOT
%
key
/ · position 50
sends
%
zmk
&kp PERCENT
⏎
key
⏎ · position 51
does
transparent: falls through to the layer below
zmk
&trans
Mute
key
encoder press · position 52
does
transparent: falls through to the layer below (Mute (wpctl))
zmk
&trans
SYS|NUM
key
SYS|NUM · position 53
does
held to be on this layer
zmk
&trans
F11
key
F11 · position 54
does
transparent: falls through to the layer below
zmk
&trans
◆
key
◆ · position 55
does
transparent: falls through to the layer below
zmk
&trans
NAV
key
NAV · position 56
does
transparent: falls through to the layer below (hold for layer 1 (NAV))
zmk
&trans
⌫
key
⌫ · position 57
does
transparent: falls through to the layer below
zmk
&trans
L click
key
joystick press · position 58
does
mouse button LCLK
zmk
&mkp LCLK
Space
key
Space · position 59
does
transparent: falls through to the layer below
zmk
&trans
CODE
key
CODE · position 60
does
transparent: falls through to the layer below (hold for layer 2 (CODE))
zmk
&trans
CapsWd
key
CapsWd · position 61
does
transparent: falls through to the layer below (Caps Word: the next word in capitals)
zmk
&trans
tmux OFF
key
F12 · position 62
does
transparent: falls through to the layer below (tmux: toggle nested OFF mode (pass keys to an inner tmux))
zmk
&trans
→ GAME?
key
MEDIA · position 63
does
switch to layer 5 (GAME?)
zmk
&to 5

Every command

The keys above that do more than type their legend, by layer.

BASE

Keys sentSofle keyDoes
XF86AudioRaiseVolumejoystick ↑Vol + (wpctl)
XF86AudioLowerVolumejoystick ↓Vol − (wpctl)
XF86AudioPlayjoystick ←Play / pause (playerctl)
XF86AudioNextjoystick →Next (playerctl)
XF86AudioMuteencoder pressMute (wpctl)
XF86AudioMutejoystick pressMute (wpctl)
F12F12tmux: toggle nested OFF mode (pass keys to an inner tmux)

NAV

Keys sentSofle keyDoes
F12`tmux: toggle nested OFF mode (pass keys to an inner tmux)
Super+UTabFocus workspace down
Super+IQFocus workspace up
Ctrl+PrintTScreenshot monitor
Print=Screenshot region
Super+Shift+HEscFocus monitor left
Super+Shift+JAFocus monitor down
Super+Shift+KSFocus monitor up
Super+Shift+LDFocus monitor right
Alt+PrintGScreenshot window
Super+Ctrl+U\Move column to workspace down
Super+Ctrl+IZMove column to workspace up
Super+Ctrl+Shift+HXMove column to monitor left
Super+Ctrl+Shift+LCMove column to monitor right
Shift+PrintBScreenshot and annotate
Super+1NFocus workspace 1
Super+UMFocus workspace down
Super+I,Focus workspace up
Super+9.Focus workspace 9
Super+Shift+H/Focus monitor left
Super+Shift+L⏎Focus monitor right

CODE

Sofle keyTypes (▏ = cursor)
1~s(▏)
2~w(▏)
3~r/▏/
4~D[▏]
5<>
7{ ▏ }
8<% ▏ %>
W<-
E|>
R->
T=>
Y::
U|_|
Idbg!(▏)
Otodo!(▏)
P::<▏>
H(▏)
J[▏]
K{▏}
L"▏"
N==
M!=
,<=
.>=

MEDIA

Keys sentSofle keyDoes
F14→XF86Launch5`Caffeine on/off
F15→XF86Launch61Do not disturb on/off
F16→XF86Launch72Bluetooth on/off
F17→XF86Launch83Control center
F18→XF86Launch94Emoji picker
F195Clipboard history
XF86AudioRaiseVolumejoystick ↑Vol + (wpctl)
Super+XF86MonBrightnessUpWExternal monitor brightness up
XF86MonBrightnessUpEBright + (brightnessctl)
F24TMenu Power
XF86AudioLowerVolumejoystick ↓Vol − (wpctl)
Super+XF86MonBrightnessDownSExternal monitor brightness down
XF86MonBrightnessDownDBright − (brightnessctl)
XF86AudioPlayjoystick ←Play / pause (playerctl)
XF86AudioLowerVolumeHVol − (wpctl)
XF86AudioRaiseVolumeJVol + (wpctl)
XF86AudioPlayKPlay / pause (playerctl)
F21→XF86TouchpadToggleBTouchpad on/off
XF86AudioNextjoystick →Next (playerctl)
F20→XF86AudioMicMuteNMic mute (wpctl)
XF86AudioMuteMMute (wpctl)
XF86AudioPrev,Prev (playerctl)
XF86AudioNext.Next (playerctl)
XF86AudioMutejoystick pressMute (wpctl)

SYS|NUM

Keys sentSofle keyDoes
XF86Calculator-Calculator
Super+Alt+LBLock the Screen
Sofle keyLabelDoes (in the firmware)
`BT clrforget the selected Bluetooth profile’s host
1BT 1select Bluetooth profile 1
2BT 2select Bluetooth profile 2
3BT 3select Bluetooth profile 3
4BT 4select Bluetooth profile 4
5BT 5select Bluetooth profile 5
joystick ↑Ptr ↑move the mouse pointer
TabBri+brightness up (+8, max 60) (zmk-rgb-layer, not the keymap)
QSat+underglow: RGB_SAI
WHue+underglow: RGB_HUI
EFX+underglow: RGB_EFF
RBackmouse button MB4
TFwdmouse button MB5
joystick ↓Ptr ↓move the mouse pointer
=SysRqkernel Magic SysRq: keep holding, tap a command letter; kernel.sysrq decides which work (16, the systemd default: S, sync, only)
EscBri−brightness down (−8, min 4) (zmk-rgb-layer, not the keymap)
ASat−underglow: RGB_SAD
SHue−underglow: RGB_HUD
DFX−underglow: RGB_EFR
FL clickmouse button LCLK
GR clickmouse button RCLK
joystick ←Ptr ←move the mouse pointer
\RGB ⏻underglow: RGB_TOG
ZDarkBASE mood: underglow off (zmk-rgb-layer, not the keymap)
XDimBASE mood: solid dim teal (zmk-rgb-layer, not the keymap)
CFXBASE mood: step through breathe, spectrum, swirl (zmk-rgb-layer, not the keymap)
VM clickmouse button MCLK
joystick →Ptr →move the mouse pointer
joystick pressL clickmouse button LCLK