I built a weird keyboard

June 26, 2023  |  13 minutes to read

A picture of half a Dactyl Manuform keyboard

I spent most of my free time over the last 10 months building this bizarre keyboard from scratch. It’s a Dactyl Manuform - a split keyboard with a highly sculpted design that is somehow simulataneously the ugliest and most eye-catching object I’ve ever seen.

The goal of this keyboard design is to place keys exactly along each finger’s natural axis of motion. The consequences of this approach are downward-sloping (A.K.A “tented”) rows to match the natural angle of the wrists, a deeper middle finger column to compensate for this finger’s relative length, an offset pinky column to minimize stretching, and a thumb cluster with multiple keys to take advantage of its opposable nature.

There’s a reason most keyboards don’t look like this. It’s difficult to mass-produce curved keyboards since they can’t use the stiff, flat PCBs that most keyboards use to wire the keys to the microcontroller. Every Dactyl Manuform is a unique piece of art, painstakingly hand-wired by a human being. Here’s how I built mine:

Build log

The first step was to design and 3D print the case. There are a number of Dactyl Manuform model generators out there; I ended up using this one since it had a few extra features I wanted (e.g. wide pinky keys). Some things I was looking for in my design:

  • A key layout similar to the ErgoDox EZ keyboards I already own
  • An aggressive tent angle (I went with π/8 = 22.5°)
  • Hot-swap sockets

I gave up on the hot-swap sockets after failing to coax the generator script to produce valid hot-swap socket holders. I’m glad I did - in the end I don’t think they would have worked anyway.

Once I had a model that looked good on the screen, I printed a draft version to see it in real life.

A draft print of the right half
Printed with a .8mm nozzle, .32mm layer height, and lightning infill

Overall, I was really happy with this first draft. I only made a few tweaks to the model before printing the real thing:

  1. I enabled the “external microcontroller” option, which let me kick the can on deciding which microcontroller and connection types to use
  2. I added my own screw holes; the holes generated by the script were awkwardly placed

To mount the base plates to the body of the keyboard, I used these heat set inserts. It’s a neat system; the threaded inserts are melted into the 3D print using a soldering gun, producing threaded screw holes much stronger and smaller than anything that would be possible using only 3D printing.

To determine the ideal hole size for these inserts, I made a test print.

A photo of a print for determining the correct insert tolerance
A test print with insert holes ranging from 3.8mm to 4.2mm in diameter

I’m glad I tested this; all of the hole options were too small! A second print with bigger holes was more successful.

A photo of another insert hole test print; this one includes installed screws
A second test print with insert holes ranging from 4.2mm to 4.6mm in diameter. I decided to go with 4.5mm

With this last detail resolved, I began printing the real halves. I used my favorite material - wood PLA - which looks (and even smells!) quite similar to real wood, once properly post-processed.

A screenshot of the final STL being sliced in Cura
The final STL file being sliced in Cura. 24 hours per half!

A picture of the left half of the keyboard on the 3D printer bed
The left half, fresh off the printer

A picture of both halves of the keyboard
Both halves printed and slightly cleaned up

I melted the inserts into the holes, which was nerve-wracking; one bad insert would have likely ruined the whole print. It was awkward to try and hold the keyboard and the insert in place while pressing the insert into the plastic with the soldering gun. Somehow I managed to install all ten without issue!

A picture of an installed heat-set insert
An installed heat-set insert

I ordered the transparent acrylic base plates from ponoko.com and was quite happy with the result.

The bottom plate of the keyboard, made from acrylic
Acrylic base plate from ponoko.com

Next up was post-processing. I sanded each half with 80-grit sandpaper, which was a ton of work - there are a lot of nooks and crannies that make this a tedious job.

A picture of both keyboard halves, sanded
Both halves, sanded

In order to sand the inside of the key holes, I printed a little attachment that I could wrap with sandpaper and fit on my screwdriver.

A screwdriver with a 3D-printed accessory installed
My custom SuperSander™ (patent pending)

Normally this would be an unnecessary step - no one sees the inside of the key holes - but the fit was a bit too tight; most of the holes required some sanding before the switch would fit properly. (This is why I’m glad I didn’t bother with hot-swap sockets - the fit is so tight, I’d never be able to get the switches out anyway.)

Another picture of both keyboard halves, sanded
Another shot, because sanding these took too much time not to show off

The next step was to stain and clear coat the prints. I used this gel stain and glossy polyurethane to give the prints a rich, polished wood color.

A picture of a keyboard half, finished with stain and polyurethane
The finished product

Another picture of a keyboard half from a different angle, finished with stain and polyurethane
Some nice faux woodgrain

This was a time consuming step, as each half required three coats of stain (minimum 24 hours to dry per coat) and at least 3 coats of polyurethane (a few hours to dry per coat). I did this in the dead of winter which made drying these in the outdoors challenging (a space heater may have been involved).

The hard work paid off, though - I’m really happy with how these look! The layer lines even give the illusion of a wood grain.

The next decision was which key switches to use. I’m a clicky switch guy; the noisier the better. I bought a Kailh switch tester so I could make an informed decision and decided on Kailh Box Whites.

Two keyboard switch testers
Regular and low-profile Kailh switch testers. Not pictured: Gateron and Boba testers

Compared to other clicky switches (e.g. Cherry MX Blues), Box Whites are extra clicky (they click twice per key press). Perfect for working remotely! If I ever make a silent/office-friendly version of this board, I’ll go with Boba U4 Silents.

At this point, I was able to set the switches and keycaps in place and get a feel for what it would be like to type on this monstrosity. I’ll admit it felt about as weird as it looks.

A picture of the keyboard; half has just the switches installed, and the other half has both switches and key caps installed
Switches and keycaps (temporarily) installed

There was one last detail to work out before I could begin wiring up the halves. I wanted to install a rotary encoder (“volume knob”) on each half, but these don’t click into a standard keyboard hole out of the box. I had to 3D print a special adapter for each.

3D-printed adapters for rotary encoders
The end result, with chunks of glass attached to the bottoms

I printed these with PETG and learned the hard way to always use glue stick when printing with PETG. The adapters adhesed to the bed so strongly they took chunks out of my glass bed when I finally pried them off. I was able to salvage the adapters with some sanding, but the printer bed was unfortunately beyond repair.

A picture of the 3D printer bed with chips in it from the overly-adhesive PETG print

Despite their rather violent effects on my printer, the adapters did their job quite nicely!

Two pictures of rotary encoders; one without a cap and one with a cap
Rotary encoder with and without the cap

Finally, it was time to start wiring it up! First, I wrapped diodes around one pin on each switch.

A keyboard half with diodes bent around one pin of the switch
Diodes wrapped

I soldered the diodes into place and snipped the extra leg.

A keyboard half with diodes soldered to one pin of the switch
Diodes soldered and snipped

I soldered the remaining diode legs together to form the rows of the key matrix.

A keyboard half with diodes soldered together to form rows of the keyboard matrix
Diode legs soldered together into rows

I used small, individual pieces of insulated wire to form the columns.

A keyboard half with wires soldered to the switches to form columns of the keyboard matrix
Don't look too closely; I'm really bad at soldering

I installed DuPont connectors so I didn’t have to solder directly to the microcontroller. This saved me a lot of headache since it took quite a bit of trial and error to get all pins in the right spot.

A keyboard half with DuPont connectors installed to each row and column of the keyboard matrix
DuPont connectors installed

I flashed a basic QMK firmware to the microcontroller and had the incredibly satisfying experience of seeing a letter appear on the screen when I pressed a key. I also got the LED strip working!

A keyboard half with a LED strip lit in rainbow colors

I was getting really close at this point. I designed a custom holder for the microcontroller since the one that was supposed to be compatible with my case didn’t fit for some reason.

A 3D printed holder for the microcontroller
Custom-designed microcontroller holder

I spliced some wires together since a few of the microcontroller pins had to be shared by more than one connection.

A mess of wires soldered together
I'm frankly shocked this thing works

After assembling all the pieces, a bit of software configuration, and a lot of trial and error… I had a working keyboard!

A picture of the finished keyboard on a desk
Finally. Done.

A picture of the finished keyboard, with one half showing the bottom and one half showing the side
This was way too much work.

Another picture of the finished keyboard, with pink underglow
Never again. Probably.


How does it feel?

Weird, but good! I’ve only been typing on it for a few work days, so my muscle memory hasn’t fully adjusted. I keep reaching for keys in the wrong places; in particular, my fingers naturally stretch too far when reaching for the bottom row. I also made a few modifications to my QMK layout to take advantage of the more accessible thumb clusters compared to my ErgoDox EZ. I think I’ll really like it once I’m used to it.

Was it worth it?

Umm… I think so? The end result was fantastic, but it was an insane amount of work. I don’t recommend this project to anyone who isn’t interested in the process itself. If you’re just looking for a great ergonomic keyboard, I’d recommend buying an ErgoDox EZ, a Moonlander, a Kinesis Advantage360 or a prebuilt Dactyl Manuform, all of which will cost about the same as this project (see below).

Cost breakdown

Cost of all items, including tax and shipping.

Description Cost (CAD) Link
Wood PLA filament for 3D printed case $40.44 amazon.ca
Kailh switch tester $21.46 aliexpress.com
Kailh low-profile switch tester $9.68 aliexpress.com
Pro Micro controller (x2) $44.98 amazon.ca
Kailh BOX White switches (x90) $51.26 aliexpress.com
M3 heat-seated inserts (x100) $12.42 amazon.ca
M3 screws (x100) $12.02 amazon.ca
EC11 rotary encoder (x4) $15.80 amazon.ca
LED strip (1m) $16.37 aliexpress.com
1N4148 Diode (x100) $8.80 digikey.ca
Reset button (x3) $10.82 digikey.ca
22AWG Wire (25’) $7.24 digikey.ca
TRRS jack, female (x3) $12.65 digikey.ca
Jumper wire (x60) $11.74 digikey.ca
Soldering iron $59.87 homedepot.ca
Solder $28.23 homedepot.ca
Wire stripper $11.29 canadiantire.ca
Acrylic base plate (x4) $54.88 ponoko.com
Gel wood stain $19.93 homedepot.ca
Glossy polyurethane $27.11 amazon.ca
Keycap set (x2) $57.32 amazon.ca
Electrical tape $5.37 amazon.ca
Rubber feet $13.55 amazon.ca
Only keyboard materials $450.93 ≈ $340 USD
All items (including tools, testers, etc.) $553.23 ≈ $417 USD

As you can see, building your own keyboard is not a good way to save money 💸


Other posts you may enjoy:

Wordle Bot

January 25, 2022  |  7 minutes to read

Herding Gits

August 26, 2021  |  2 minutes to read

It's finally here! 🎉

May 7, 2021  |  1 minute to read

Capturing Alexa Errors with Sentry and GitLab

November 18, 2020  |  6 minutes to read

Ridiculous Refs

October 19, 2019  |  2 minutes to read