Building the Lily58 RGB MX

How I hand-soldered a 58-key split keyboard from a bare kit, wrote custom QMK + Vial firmware from scratch, and debugged a WS2812 chain that killed all 70 LEDs.

PandaKB QMK + Vial RP2040 70 RGB LEDs 200 solder points

Why a split keyboard

After months of coding 8+ hours a day I started getting numbness and tingling in my wrists — early signs of carpal tunnel. A traditional keyboard forces both hands together, wrists bent inward, for hours at a time.

I already owned a ZSA Moonlander. It helped, but I wanted to go further: understand every layer myself, from solder joint to firmware byte. So I bought a bare kit and built one from scratch.

Split keyboards keep hands at shoulder width — wrists straight, thumbs neutral. Thumb clusters offload work from the pinkies. Layers mean symbols are always one key off the home row.

The kit — PandaKB Lily58 RGB MX

I picked the PandaKB Lily58 RGB MX: a well-documented open-source design with per-key RGB, hotswap sockets, and dual RP2040 microcontrollers. Both halves communicate over a TRRS cable.

Bill of materials

Diodes58× (one per key, stripe direction matches PCB silkscreen)
Per-key LEDs58× SK6812MINI-E — face up toward keycaps
Underglow LEDs12× WS2812B-5050 — face down toward PCB
Switch sockets58× hotswap MX
Encoders2× EC11 rotary
MCU2× RP2040 ProMicro (one per half)
Display2× 0.91" OLED module
TRRS jacks2× (wired configuration)
OtherReset switches, header pins/sockets, USBLC6-2SC6, resistors

Tools needed

Soldering ironTemperature-adjustable (300–350 °C recommended)
Solder wire60%+ tin content
TweezersAntistatic, fine-tip for SMD components
Solder pasteOptional — helps with LEDs and diodes
MultimeterEssential for debugging (saved my LED matrix)

The build process

The PandaKB build guide recommends a specific order — I followed it closely because desoldering is painful on a board this dense. The golden rule: "Think twice, solder once."

1
Diodes — match stripe direction to PCB silkscreen. These are small and easy to get wrong; do them first while you have a clear board.
2
Per-key RGB LEDs (SK6812MINI-E) — light-emitting face up, toward the keycaps. Align the notch angle with the PCB marking. Fast strokes: under 3 seconds per LED.
3
Underglow LEDs (WS2812B-5050) — face down, toward the PCB. Same notch-alignment rule.
4
Switch sockets — hotswap MX. Straightforward; just make sure both pads wet properly.
5
USBLC6-2SC6 & resistors — bottom side, wired config only. Protects the USB data lines.
6
MCU (RP2040) — chip face down, leave the two top holes open. Trim protruding pins after soldering. Handle the USB port carefully — it's the most fragile part.
7
Reset switch, OLED, TRRS jack, encoders — in that order. Screen sockets into female headers; TRRS only for wired builds.
Build process · Lily58 RGB MX · ~2 hrs compressed
Soldering the 58 hotswap sockets, LED chain, and encoders. The reveal at 1:41 shows first light.

The bug: all 70 LEDs went dark

After full assembly the RGB matrix wouldn't light up. Not one LED. Both WS2812B-5050 (underglow) and SK6812MINI-E (per-key) chains were dead.

WS2812-type LEDs run as a single daisy chain — data flows LED 1 → 2 → 3 → … → 70. If LED #1 fails, every LED downstream receives no signal and stays dark.

A multimeter traced the break to the very first LED in the chain. Reflowed the solder joint. All 70 came back on.

Common issue from PandaKB guide: Incorrect RGB display or a dead matrix almost always means a bad LED solder joint or wrong orientation on one of the early LEDs in the chain. Always reflow LED #1 before replacing components.

Firmware: QMK + Vial

The stock PandaKB binary had a split-hand detection bug on RP2040 — I compiled from source using the QMK Vial fork. Vial adds a live USB remap GUI: rearrange any key without recompiling or reflashing.

My layout is adapted from the ZSA Moonlander I used before. Every programming symbol sits one key off the home row on Layer 1. Went from 60 WPM → 15 WPM the first week. Back to faster than before — and the wrist pain is gone.

Keymap — 4 layers

Click a layer to see its bindings. Hold-tap keys show both actions.

Modifier / system Layer switch Function key RGB control Empty / transparent

Encoder map

Layer Left encoderRight encoder
00 Default Volume −/+PgUp / PgDn
01 Symbols RGB Hue −/+RGB Sat −/+
02 Mouse Transparent (pass-through to layer 0)
03 Gaming Transparent (pass-through to layer 0)

Resources