
Daylight Matchstick
VoronDesign/Voron-Hardware
Cool Hardware designed by the Voron Design group

Project for replicating USB HID messages over SPI
Kbdrelay carrier v0.1 is an open-source printed circuit board by mdthorpe, from the mdthorpe/kbdrelay repository on GitHub. It is a 2-layer board of 88 × 55 mm with 22 parts on 41 nets, routed with 73 tracks and 0 vias.
Its parts include 9 resistors, 3 connectors, 2 capacitors, 2 ICs and 1 diode. It belongs with the ESP32 boards of this library.
A transparent two-board bridge that lets any USB keyboard type into a target device as if it were a plain USB 1.1 boot-protocol keyboard. Two cheap single-USB-controller boards, joined by a short SPI harness.
Boards are named for what they face. "Sender/receiver" is banned vocabulary here — both boards send and receive over the bidirectional SPI link.
See spec.md (what/why), plan.md (how), and
tasks.md (build log / progress).
v1 achieved on the bench — typing crosses the bridge, Caps/Num Lock LEDs
round-trip, hot-plug recovers, and the whole chain was validated on a
Commodore Amiga 1200 (1992) via a USB keyboard adapter, with modern and
vintage keyboards. Verified: AC1–AC5 (see tasks.md for caveats).
| Signal | KBD (master) | TGT (slave) | Notes |
|---|---|---|---|
| SCK | GPIO4 (GP4) | GPIO4 | 1 MHz |
| MOSI | GPIO5 (GP5) | GPIO5 | key reports, heartbeats → |
| MISO | GPIO6 (GP6) | GPIO6 | ← LED reports |
| CS | GPIO7 (GP7) | GPIO7 | |
| DATA_READY | GPIO8 (in) | GPIO8 (out) | TGT signals a queued LED report |
| GND | GND | GND | common |
Put ~470 Ω (→2.2 kΩ recommended) in series on each signal line — limits backfeed between boards when one is unpowered (FR5.4) and tames ringing.
ESP-IDF 6.x via PlatformIO (framework = espidf). Shared framing +
CRC lives in components/bridge_proto (also unit-
tested on the host). One project, one env per firmware:
| env | board role | what it is |
|---|---|---|
kbd | KBD | USB host → reads keyboard → SPI master forwards KEY_REPORTs |
tgt | TGT | SPI slave → replays as boot keyboard; watchdog releases keys |
mock_kbd | test | SPI-master stand-in (scaffold) |
mock_tgt | test | SPI-slave stand-in (scaffold) |
native | host | bridge_proto unit tests (no hardware) |
Fixed 12-byte frames, full-duplex: SYNC(0xA5) TYPE SEQ PAYLOAD[8] CRC8.
Types: IDLE, KEY_REPORT (KBD→TGT), LED_REPORT (TGT→KBD), HEARTBEAT.
KBD sends on key change or every 25 ms; TGT releases all keys if no valid frame
for 75 ms (FR4.1).
make build ENV=kbd # compile (kbd | tgt | mock_kbd | mock_tgt)
make upload ENV=kbd # flash over USB-C (see flashing quirks below)
make monitor # serial monitor on the USB-UART adapter
make test # host unit tests (native, no hardware)
make reconfigure ENV=kbd # clean rebuild of one envToolchain: PlatformIO Core (Python 3.13 penv) + ESP-IDF 6.x, board def
boards/waveshare_esp32_s3_zero.json (the official platform doesn't ship it).
CONFIG_ESP_CONSOLE_UART_DEFAULT).TBD.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 5 | 2.2k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R1, R2, R3, R4, R5 |
| 4 | 1k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R6, R7, R8, R9 |
| 4 | MountingHole_3.2mm_M3 | MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 2 | ESP32-S3-Zero | kbdrelay:ESP32-S3-Zero-Socketed | U1, U2 |
| 1 | 100nF | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C2 |
| 1 | 1N5817 | Diode_THT:D_DO-201AD_P12.70mm_Horizontal | D1 |
| 1 | 470uF/16V | Capacitor_THT:CP_Radial_D10.0mm_P5.00mm | C1 |
| 1 | 5V_IN | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J3 |
| 1 | PPTC 0.9A 60R090 | kbdrelay:PPTC_Littelfuse_60R_P5.08mm | F1 |
| 1 | UART_KBD | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J1 |
| 1 | UART_TGT | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J2 |
It measures 88 × 55 mm and has 2 copper layers, 1.6 mm thick.
22 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the mdthorpe/kbdrelay repository on GitHub, at the commit this page was made from: the board is hardware/pcb-carrier/kbdrelay-carrier/kbdrelay-carrier-v0.1.kicad_pcb and its schematic hardware/pcb-carrier/kbdrelay-carrier/kbdrelay-carrier.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask mdthorpe before reusing the design.

VoronDesign/Voron-Hardware
Cool Hardware designed by the Voron Design group

hoglet67/RGBtoHDMI
Bare-metal Raspberry Pi project that provides pixel-perfect sampling of Retro Computer RGB/YUV video and conversion to HDMI

hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

abhishek-kakkar/BeagleLogic
A Software Suite that implements a logic analyzer with the PRU on the BeagleBone / BeagleBone Black.

Chrismettal/flipper-zero-backpacks
Backpack-style addon boards for the Flipper Zero!



CRImier/MyKiCad
My KiCad boards. Can't be bothered uploading individually anymore, so here you go.