Home/03 : Hardware/NullKeys
Split keyboard : Input design
36 keys / Kailh Choc / ZMK over BLE / TPS43 trackpad
Scroll to assemble
Layout : ZMK firmware
Combos on this layer
The 3D model needs WebGL, which this browser has turned off.
A split keyboard with 36 keys and a trackpad in the right half, built around one idea: every letter and every hotkey within reach of one hand, so the other can stay on the mouse. The first build took six months of spare time in fall 2023, and I have been refining the design ever since.
01 : Problem
I love the puzzle of control interfaces, and the standard keyboard is a poor answer to it. Its layout is stuck in time. I wanted to challenge myself to come up with the best layout I could, in the smallest footprint possible.
The biggest slowdown on a computer is the trip between mouse and keyboard. Most ergonomic keyboards try to solve that by keeping you on the keyboard. That works for coding. It falls apart in CAD, video editing, and any workflow that jumps between programs, where the mouse is doing half the work.
In that kind of work you are rarely typing a whole word. You type the first few letters of a command, or a hotkey. So I flipped the goal: keep one hand on the mouse, and put the whole keyboard under the other one.
That set the requirements. Every key has to be pressable without shifting the hand. Common tasks live on the home row. Every letter can be typed with one hand. And every hotkey has to work from that same hand, whether it is Shift plus a key or Ctrl plus Shift plus a key.
02 : Constraints
Constraints came from three places: my hands, the manufacturing process available to me, and the firmware. Naming them up front is what turned this from a parts order into a design problem.
01
Five columns and three thumb keys per half. I broke the outer columns off the Corne PCB. Everything a full keyboard does has to be reached through layers instead of surface area, which makes keymap design the real interface work.
02
The real physical problem was tenting, and keeping the halves steady once tented. The legs fold flat into the printed base, swing out to set the angle, and have to stop the half from rocking while I type on it.
03
ZMK runs the halves over BLE, so every added component is a draw on a small cell. A trackpad polling continuously is a very different battery story from one that sleeps.
04
The TPS43 had to fit into the right half without taking a key position, wire straight to the controller, and sleep with the keyboard so it does not drain the battery.
05
Hand-soldered wiring in a printed shell fails eventually. The case had to open without destroying itself and the electronics had to come out as a unit.
06
A layout I could not type on would get abandoned inside a week. The migration path mattered as much as the end state.
03 : Prior Art
Split ergonomic keyboards are a well-explored space. Ruling out the existing answers was faster than designing from nothing, and it forced me to name what I actually wanted.
04 : Process
Each revision existed to answer one question. The point of printing quickly is that a wrong answer costs an evening instead of a month.
September 2023
Iteration one was a case I printed as a test, still holding every key of the full Corne. It needed printed supports for the component leads under the PCB, plus standoffs and retaining C rings to hold it together. Living with it for a few days convinced me I could go even smaller.
Four days later
The outer columns came off the PCB, the three keys on the left of the photo, and the next case was modelled in Fusion 360 around what was left: a base with standoffs for the PCB and a separate tray underneath.
October 2023
The constraint that really shaped the case. Two legs sit flush in recesses on the underside and swing out to tent the half. The case stays thin enough to hold in one hand with everything folded away.
The first underside used a printed TPU foot across the whole base. It did not give enough grip, so it was replaced with rubber feet at the corners.
Today
On the right half the TPS43 sits at the inner top corner, where the left half has its controller window, under a walnut veneer that sits flush with the edges of its holder. It took about three mounts to get right, and it is still a work in progress.
I wanted the trackpad to be removable at first. After a few attempts at stripping a six pin ribbon cable I gave up and soldered it straight to the pads on the trackpad. Since then the work has been on tracking performance and battery drain.
Firmware
Switches, diodes, controller, and the trackpad on its own bus. ZMK handles the split link and the keymap; getting a pointing device to behave alongside it is where the configuration work lives.
Each half runs a Nice!Nano v2. The TPS43 is soldered straight to the right Nano's pads and talks over I2C. I moved to a fork of the Azoteq driver that ties the trackpad into ZMK's sleep states, because the original kept the pad awake and drained the right half's battery. A small custom input processor adds laptop style tap and tap to drag.
Layout
36 keys means every symbol, number, and modifier lives on a layer. This is interface design with the same rules as any other: frequency drives placement, and anything you have to think about is in the wrong spot.
The letters start from Colemak, then I moved a few of them. Before moving any letter I checked why Colemak put it there, so a change would not undo something that was optimized. The moves put the most important hotkeys back where QWERTY has them. Z, X, C and V sit exactly where every program expects undo, cut, copy and paste, and S is back under the ring finger for save.
Common edits are home row combos. S and R together is Backspace, R and T is Delete, and S and T is Tab, so fixing a typo never means reaching. The S and R backspace is one of my favorite optimizations in the whole layout.
Holding R or T mirrors the right half onto the left hand, so with the right hand on the mouse the left can still type any letter. The thumbs carry Shift, Ctrl, Alt and Win, which covers every modifier combination from the same hand.
Gaming needed its own answer. A home row built for typing puts WASD in the wrong place, so two layers can be switched on for games. Pressing A, S and T together toggles a layer that puts the keys back in their QWERTY spots shifted one column in, with WASD under the fingers and Shift and Ctrl under the pinky. Holding Q on that layer brings up the numbers.
05 : Software
Fourteen layers and two dozen combos are a lot to hold in your head. The NullKeys overlay is a desktop app I built in Godot that sits on top of everything and shows what the keyboard is doing as I use it: which keys are pressed, which layers are active, and what every key does right now. Hover a key and it explains that key on every layer, plus every combo it belongs to.
The hard part is that a computer only ever receives keycodes. Layers, holds and combos never reach it, and holding A for the Num / Sym layer sends nothing at all. So instead of guessing from keystrokes, a small ZMK module streams the physical key positions and the layer state straight from the firmware.
Keyboard
Listens for key position and layer events and sends 32 byte reports over Raw HID. It only streams while the overlay is asking for data, so the radio stays quiet otherwise.
Bridge
Godot cannot open HID devices, so a small Python process reads the reports and forwards them as JSON over local UDP. The overlay starts and stops it automatically.
Overlay
Parses corne.keymap directly, so it always matches the firmware, then resolves layers, hold taps and combos and draws the result. Overlay mode draws the keys as outlines for screen recordings.
06 : Decisions
A trackball is more precise and needs no calibration, a pointing stick takes almost no space. I went with a capacitive pad because it supports gestures, scrolling and zoom.
Capacitive sensing costs power, needs tuning, and is worse than a ball for fine selection work.
Getting every modifier and the F keys onto 36 keys took the most fiddling of anything on the board. The first thumb key is a tap dance: hold it and it is Alt, tap it twice and it becomes a sticky Win key. Alt has to stay holdable for things like Alt+Tab, so Win could not simply take its place.
The other two thumbs carry Shift under Space and Ctrl under Enter. Getting those mod taps to live together, so fast typing never fires a modifier and a held modifier never types a space, took a lot of tuning. The F keys sit on their own layer, reached by holding A and the Ctrl and Enter thumb together.
Three magnets are mounted in the case. The two halves snap together into one block, and the same magnets attach the keyboard to accessories, like a pocket mount that clips into a pocket so the halves can hang off my pants for portable use. They also stick to any metal surface for storage.
A custom matrix would have let me tune every key position to my own hand. Starting from an established Corne skeleton meant the switch plate, the firmware target, and a decade of other people's keymaps were already solved, so the design effort could go entirely into the part nobody had solved for me.
I inherited someone else's column stagger, which is a compromise for an average hand rather than mine.
FDM in the room beats a better process three weeks away. Being able to test a mount in the evening and print the revision the same night is what made five iterations affordable at all.
Layer lines, weaker screw bosses, and a finish that reads as prototype rather than product. Now that the design is refined, one of my next steps is a resin print to bring the build quality up to match it.
07 : Failures
The TPU foot. The first underside was a single printed TPU foot. I expected the soft print to grip a desk, and it slid instead. Rubber feet at the corners replaced it.
A removable trackpad. The plan was a trackpad that could unplug from the case. Stripping a six pin ribbon cable cleanly enough to connect kept failing, so I soldered it straight to the trackpad's pads and dropped the connector.
Battery drain on the right half. The original trackpad driver never let the pad sleep, so the right half emptied faster than the left. Moving to a driver fork that follows ZMK's sleep states fixed the worst of it, and tuning continues.

08 : Outcome
NullKeys is my daily driver. Going back to a normal keyboard makes me miss it immediately.
It still has rough edges. A few rare hotkeys are awkward, mostly the ones built on the Win key. Win needs a tap dance, so a combo like Win+Shift+S takes a bit of hand contortion. Games usually need a few controls remapped, depending on the game. The exposed Choc switches and caps are a little fragile, so a case is a must before it goes in a backpack.
The biggest open question is the trackpad. Its battery drain has me considering swapping it for an AZ1UBALL trackball module. Next on the list are that decision and a resin printed case.
1 month
Back to full typing speed. I am now much faster than I ever was on a normal keyboard
5
Case versions printed so far
2 to 4 weeks
Per charge for the left half on a 110 mAh cell. The trackpad half drains faster
09 : Object
The current build, and the details that took the longest to get right.




10 : Build