Callum's Keymap
June 19, 2026 · View on GitHub
A keymap for 34 keys with half-layer mods.
╭ ┌─────┐ ┌─────┐ ╮
│ ┌─────┤ e ├─────┬─────┐ ┌─────┬─────┤ i ├─────┐ │
│ ┌─────┤ w ├─────┤ r │ t │ │ y │ u ├─────┤ o ├─────┐ │
│ │ q ├─────┤ d ├─────┼─────┤ ├─────┼─────┤ k ├─────┤ p │ │
│ ├─────┤ s ├─────┤ f │ g │ │ h │ j ├─────┤ l ├─────┤ │
base │ a ├─────┤ c ├─────┼─────┤ ├─────┼─────┤ , ├─────┤ ' │ │
│ ├─────┤ x ├─────┤ v │ b │ │ n │ m ├─────┤ . ├─────┤ │
│ │ z ├─────┘ └──┬──┴──┬──┴──┐ ┌──┴──┬──┴──┬──┘ └─────┤ / │ │
│ └─────┘ │ sym │ nav │ │space│ sym │ └─────┘ │
╰ └─────┴─────┘ └─────┴─────┘ ╯
╭ ┌─────┐ ┌─────┐ ╮
│ ┌─────┤tab- ├─────┬─────┐ ┌─────┬─────┤ up ├─────┐ │
│ ┌─────┤close├─────┤tab+ │lock │ │ │ bsp ├─────┤ del ├─────┐ │
│ │swap ├─────┤ cmd ├─────┼─────┤ ├─────┼─────┤down ├─────┤ tab │ │
│ ├─────┤ alt ├─────┤shift│ esc │ │ esc │left ├─────┤right├─────┤ │
nav │ctrl ├─────┤back ├─────┼─────┤ ├─────┼─────┤vol+ ├─────┤enter│ │
│ ├─────┤fresh├─────┤ fwd │boot │ │ │vol- ├─────┤play ├─────┤ │
│ │cmd-`├─────┘ └──┬──┴──┬──┴──┐ ┌──┴──┬──┴──┬──┘ └─────┤ │ │
│ └─────┘ │ │╳╳╳╳╳│ │ │ │ └─────┘ │
╰ └─────┴─────┘ └─────┴─────┘ ╯
╭ ┌─────┐ ┌─────┐ ╮
│ ┌─────┤ 3 ├─────┬─────┐ ┌─────┬─────┤ 8 ├─────┐ │
│ ┌─────┤ 2 ├─────┤ 4 │ 5 │ │ 6 │ 7 ├─────┤ 9 ├─────┐ │
│ │ 1 ├─────┤ cmd ├─────┼─────┤ ├─────┼─────┤ cmd ├─────┤ 0 │ │
│ ├─────┤ alt ├─────┤shift│ esc │ │ esc │shift├─────┤ alt ├─────┤ │
sym* │ctrl ├─────┤ - ├─────┼─────┤ ├─────┼─────┤ ] ├─────┤ctrl │ │
│ ├─────┤ ` ├─────┤ = │ │ │ │ [ ├─────┤ ; ├─────┤ │
│ │caps ├─────┘ └──┬──┴──┬──┴──┐ ┌──┴──┬──┴──┬──┘ └─────┤ \ │ │
│ └─────┘ │╳╳╳╳╳│ │ │ │╳╳╳╳╳│ └─────┘ │
╰ └─────┴─────┘ └─────┴─────┘ *half-layers ╯
╭ ┌─────┐ ┌─────┐ ╮
│ ┌─────┤ f3 ├─────┬─────┐ ┌─────┬─────┤ f8 ├─────┐ │
│ ┌─────┤ f2 ├─────┤ f4 │ f5 │ │ f6 │ f7 ├─────┤ f9 ├─────┐ │
│ │ f1 ├─────┤ cmd ├─────┼─────┤ ├─────┼─────┤ cmd ├─────┤ f10 │ │
│ ├─────┤ alt ├─────┤shift│ esc │ │ esc │shift├─────┤ alt ├─────┤ │
fn* │ctrl ├─────┤ ├─────┼─────┤ ├─────┼─────┤ ├─────┤ctrl │ │
│ ├─────┤ f12 ├─────┤ │ │ │ │ ├─────┤ ├─────┤ │
│ │ f11 ├─────┘ └──┬──┴──┬──┴──┐ ┌──┴──┬──┴──┬──┘ └─────┤ │ │
│ └─────┘ │ │╳╳╳╳╳│ │ │╳╳╳╳╳│ └─────┘ │
╰ └─────┴─────┘ └─────┴─────┘ *nav + right sym ╯
Design
I love tiny keyboards but find myself frustrated by many of the popular mechanisms to handle modifiers.
- Mod-tap -- timing issues. If you roll quickly from
atobthen is that supposed to beathenborbmodified bya? - Chording -- same timing issues as mod-tap. If you roll quickly from
atobthen is that supposed to beathenbor thea+bchord? - Oneshot mods / "callum mods" (my previously proposed method) -- solve the timing issues with mod-tap and chords, but at the expense of being slower in general. It turns what could be a single fluid movement into two distinct movements. This is most egregious when making multiple keypresses while "holding" the same modifiers, requiring you to re-activate the modifiers for each keypress.
After some experimentation I think I've found a solution that relies on purely the oldest keyboard trick in the book: the humble layer (with an extremely minor twist).
Half-layer mods
The minor twist is to make use of what I'm going to call half-layers -- layers that can be
activated on each half of the keyboard independently. sym above consists of two half-layers, with
a key on each thumb. Holding left sym activates just the left half, and holding right sym
activates just the right half. Both halves have home row modifiers, so to modify a key on the left
half of base we can use right sym without obscuring the key we want to modify (e.g. cmd + c
becomes right sym + right cmd + c).
╭ ┌─────┐ ┌─────┐ ╮
│ ┌─────┤ e ├─────┬─────┐ ┌─────┬─────┤ 8 ├─────┐ │
│ ┌─────┤ w ├─────┤ r │ t │ │ 6 │ 7 ├─────┤ 9 ├─────┐ │
│ │ q ├─────┤ d ├─────┼─────┤ ├─────┼─────┤╳╳╳╳╳├─────┤ 0 │ │
│ ├─────┤ s ├─────┤ f │ g │ │ esc │shift├─────┤ alt ├─────┤ │
│ │ a ├─────┤╳╳╳╳╳├─────┼─────┤ ├─────┼─────┤ ] ├─────┤ctrl │ │
│ ├─────┤ x ├─────┤ v │ b │ │ │ [ ├─────┤ ; ├─────┤ │
│ │ z ├─────┘ └──┬──┴──┬──┴──┐ ┌──┴──┬──┴──┬──┘ └─────┤ \ │ │
│ └─────┘ │ sym │ nav │ │ │╳╳╳╳╳│ └─────┘ │
╰ └─────┴─────┘ └─────┴─────┘ ╯
To modify a key on sym we can activate both half-layers and use the modifiers on the other half.
e.g. & becomes left sym + left shift + right sym + 7.
╭ ┌─────┐ ┌─────┐ ╮
│ ┌─────┤ 3 ├─────┬─────┐ ┌─────┬─────┤ 8 ├─────┐ │
│ ┌─────┤ 2 ├─────┤ 4 │ 5 │ │ 6 │╳╳╳╳╳├─────┤ 9 ├─────┐ │
│ │ 1 ├─────┤ cmd ├─────┼─────┤ ├─────┼─────┤ cmd ├─────┤ 0 │ │
│ ├─────┤ alt ├─────┤╳╳╳╳╳│ esc │ │ esc │shift├─────┤ alt ├─────┤ │
│ │ctrl ├─────┤ - ├─────┼─────┤ ├─────┼─────┤ ] ├─────┤ctrl │ │
│ ├─────┤ ` ├─────┤ = │ │ │ │ [ ├─────┤ ; ├─────┤ │
│ │caps ├─────┘ └──┬──┴──┬──┴──┐ ┌──┴──┬──┴──┬──┘ └─────┤ \ │ │
│ └─────┘ │╳╳╳╳╳│ │ │ │╳╳╳╳╳│ └─────┘ │
╰ └─────┴─────┘ └─────┴─────┘ ╯
Four keypresses to type one symbol may sound like a lot, but in practice it's one fluid movement of each hand, rolling quickly from the thumb press in to the finger press:
- Left hand holds
left symand thenleft shiftin one rolling motion. - Immediately following, right hand holds
right symand then hits7in one rolling motion.
Implementation
I'm currently running this on a Ferris. You can see my keymap.c here.