I built a keyboard this weekend, which sounds more impressive than it was. A 60% kit, a hot-swap PCB so I did not even have to solder the switches, a stabiliser or two to lubricate, and a couple of hours with a soldering iron for the bits that did need it. The hardware was the easy half. I had braced for fiddly through-hole work and instead spent most of my soldering time on the diodes and the controller, then snapping switches into sockets like Lego.
The actual project turned out to be the firmware. The board runs QMK, and QMK is where a keyboard stops being a keyboard and becomes a tiny programmable computer that happens to have keys. You define your layout in a keymap.c, compile it, and flash it over USB. The default layout was fine for typing the alphabet and immediately useless for everything else, because a 60% board has no function row, no arrow cluster, no navigation keys. They all live on layers you reach by holding a key.
[_BASE] = LAYOUT(
KC_ESC, KC_Q, KC_W, KC_E, /* ... */
MO(_FN), KC_A, KC_S, KC_D /* ... */
),
[_FN] = LAYOUT(
KC_GRV, KC_F1, KC_F2, KC_F3 /* ... */
),
That is the whole trick and also the whole rabbit hole. Arrows on the hjkl cluster under a layer key. Media controls somewhere sensible. A tap-hold on the escape key so it doubles as control when held. I have reflashed it about nine times today, each time convinced this is the final layout, each time finding one more key that wants to be somewhere else. The soldering took an afternoon. The layout will, I suspect, never be finished, and I am completely fine with that.