I Built a Custom Keyboard!

Published on Aug 22, 2025

An over the shoulder shot of me testing the keyboard.

Monkeytype testing the keyboard!

Ever since I started watching ThePrimeagen and his Kinesis keyboard, I have wanted to try one out for a very long time. Initially, I couldn't justify spending so much money, so I decided to take matters into my own hands. Thus, a new project was born.

Bill of Materials (BOM)

I chose a Dactyl Manuform layout, but these materials are standard for DIY keyboards:

  • 2 Pro Micro Boards
  • Diodes (1N4148)
  • Key Switches and Caps
  • TRRS Cable and Jacks
  • Solid Core Wire
  • M4 Heat Inserts and Screws
  • 3D Printed Case

I also used a soldering iron, lead-free solder, wire strippers, and a multimeter for testing solder points.

Project Goals

My main goals were simple: learn about keyboard design, implement USB-C, have fun, and complete the project efficiently. Functionality, durability, and good ergonomics were non-negotiable.

Keyboard Matrix & Ghosting Prevention

A keyboard is basically a grid of wires (rows × columns), a bunch of switches sitting at the intersections, and a tiny brain (microcontroller) that scans that grid super fast to figure out which switch closed. No magic, just clever wiring and some firmware doing laps. This matrix adaptation of a keyboard is what allows smaller hardware to make quick scans for key presses. Instead of one pin per key, keys share wires in a matrix. Each switch connects a row to a column. Press a key > that row and column are now electrically connected. What happens is...

  • The microcontroller sets one row "active" at a time (drives it high/low).
  • It then reads all the columns to see which ones are "lit up".
  • It moves to the next row and repeats. This happens thousands of times per second.

From that row+column pair, it knows exactly which key you hit. Fast enough that it feels instant. You may be asking about multiple keys being pressed at once right about now. Let's take, for example, a 2x2 keyboard. If I were to hold down the keys in position (1,1), (1,2) and (2,1), the microcontroller will notice that rows 1 and 2 are active, and columns 1 and 2 are also active. Therefore, the key in position (2,2) would appeae as pressed, and is therefore "ghosted". Without diodes, current can sneak through multiple pressed switches and make it look like an extra key (the "fourth corner" of a rectangle) is pressed. A diode on each switch forces current to flow in only one direction, so signals don't backfeed through other keys, which fixes the ghosting problem! To deal with all of these columns and rows, we will deploy a firmware (QMK in my case) to the microcontroller to deal with taking the data from current to serial data. It does this with the following features and techniques:

  • Matrix scanning: Runs that row>column loop nonstop to detect closures.
  • Debouncing: Mechanical switches "chatter" for a few ms; firmware smooths that into a single press.
  • Keymap & layers: Maps row/col positions to actual keycodes, plus your layers/macros.
  • Split comms (for two halves): One side is master. It scans its half, receives the other half's scan data over TRRS/serial, merges both, then sends a single USB HID report to the computer.

So the flow ends up looking loke this: Switch press > row/column connect > diode keeps it one-way > MCU sees it during scan > firmware debounces & maps > USB HID event > OS gets a keypress

Build Process

The build process followed these main steps:

  1. Planning the layout: Decided on a 5-row, 6-column layout with a 6-key thumb cluster and mapped out the key positions.
  2. Handwiring the keyboard matrix: Wired all switches to rows and columns, adding diodes to prevent ghosting and ensure accurate key detection.
  3. Connecting the microcontrollers: Soldered the Pro Micro boards and connected them using a TRRS cable for split keyboard communication.
  4. Case assembly: Placed all components into the 3D printed case and secured with M4 heat inserts and screws.
  5. Key installation: Inserted the switches and keycaps, double-checking each row and column for proper connectivity.
  6. Firmware & Testing: Uploaded the QMK firmware, tested each key, and ensured ghosting was prevented and everything worked correctly.
Completed keyboard layout

The layout of the keyboard.

Completed keyboard

Top-down view of the completed keyboard

Completed keyboard POV

First-person view of the keyboard in use

Testing and Final Thoughts

After assembly, I tested the keyboard thoroughly. Getting the QMK software to correctly configure was a little bit of a hassle, but once I found the correct sections of the documentation, it was a breeze thereafter. It met all of my initial goals; typing felt comfortable, the USB-C connection worked flawlessly, and the layout was ergonomic.

Fun, Optional Upgrades

I also made some small improvements to the build itself by adding some laptop rubber feet to it in order to stop it from sliding:

The bottom of one half of the keyboard showing the rubber feet

The bottom of one half of the keyboard showing the rubber feet

Plus, I got an EVA hard case with foam inserts for travel, since I do that a lot:

The keyboard displayed in a case

Foam fitted EVA case for safe travel

Overall, this was a very interesting, fun, and overall useful project that I believe will help me for years to come!