Skip to the content
PCBKitNew board
2 layers404 × 118.3 mmKeyboard, the printed circuit board in 3D

A custom wireless low-profile mechanical keyboard powered by ZMK.

Size
404 × 118.3 mm
Copper layers
2
Thickness
1.6 mm
Parts
226
Nets
165
Pads
1,275
Tracks, vias
697, 46
Pours
1
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
12 Dec 2025
Updated
13 Oct 2026

Overview

Keyboard is an open-source printed circuit board by ItzBuble, from the ItzBuble/Bubleboard repository on GitHub. It is a 2-layer board of 404 × 118.3 mm with 226 parts on 165 nets, routed with 697 tracks and 46 vias.

It is built around the 1N4148W. Its parts include 105 diodes, 4 resistors, 3 capacitors and 2 ICs. It belongs with the keyboards and input boards of this library.

Main components

1

README

readme.md

Bubleboard

Finished Bubleboard keyboard

A custom full-size (104-key) mechanical keyboard with a hand-designed PCB, a rotary encoder, an e-ink display and ZMK firmware. It was built as my graduation project (maturitní práce) at SPŠ a OA Uherský Brod, field Mechanik elektrotechnik, 2026.

Features

  • 104 keys in a 21 × 6 diode matrix (N-key rollover, no ghosting)
  • Seeed XIAO BLE nRF52840 microcontroller soldered directly on the PCB
  • Wired USB and Bluetooth Low Energy, with a LiPo battery connected through a JST connector
  • Two MCP23017 I/O expanders (I²C) to drive the matrix
  • Bourns PEC11L rotary encoder (15 mm) used as a media knob
  • nice!view e-ink display (SPI) showing the keyboard status
  • Hot-swappable Kailh Choc V1 sockets
  • Custom 2-layer PCB designed in KiCad
  • 3D-printed case and keycaps
  • No backlight, to keep power consumption low

Hardware

PartComponent
MicrocontrollerSeeed XIAO BLE nRF52840
I/O expanders2× MCP23017 (SSOP), I²C with 10 kΩ pull-ups
Switch sockets104× Kailh Choc V1 hot-swap
Matrix diodes105× 1N4148W
Rotary encoderBourns PEC11L, push button wired into the matrix (Column 16 / Row 0)
Displaynice!view, connected over SPI
Decoupling2× 100 nF and 1× 10 µF

The PCB was made by JLCPCB and assembled by hand. The schematic and PCB use the marbastlib library, and the key positions come from a Keyboard Layout Editor file imported into KiCad.

Firmware

The firmware is built on ZMK (Zephyr). The matrix is defined in the keyboard's devicetree: columns 0–15 and 16–20 are spread over the two MCP23017 expanders, rows 0–5 are on the second expander, and all pins use GPIO_ACTIVE_LOW with pull-ups.

Encoder functions:

  • Rotate right: volume up
  • Rotate left: volume down
  • Press: play / pause

Building

Firmware is built with GitHub Actions using the standard ZMK user-config workflow. Push a commit (or run the workflow manually from the Actions tab) and download the firmware from the build artifacts.

The build uses:

  • Board: seeeduino_xiao_ble
  • Shield: buble_board plus nice_view_adapter and nice_view

The ZMK build needs config/, boards/ and zephyr/module.yml to stay in the repository root.

Case and keycaps

The case was modelled in Autodesk Fusion and 3D printed. It is printed in two halves that are glued together in the middle, with alignment holes and pegs. The PCB is mounted on six screw posts, and a separate display holder (adapted from a freely available model) slides into V-shaped tabs in the top right corner. The keycaps are also 3D printed, adapted from existing models.

Measurements

Power consumption while connected to a PC (no backlight, no heavy load):

MeterVAW
Custom USB meter5.0920.0050.027
Commercial USB meter5.10800.00500.0252

Input latency, measured with a 240 fps phone camera (1 frame ≈ 4.167 ms):

KeyboardFramesLatency
SteelSeries Apex Pro (magnetic)833.3 ms
Bubleboard1145.8 ms
Razer Ornata Chroma (membrane)1770.8 ms
School membrane keyboard1979.2 ms

Author

Martin Janíček. Střední průmyslová škola a obchodní akademie Uherský Brod, 2026.

Parts

226
QtyValueFootprintReferences
1051N4148WDiode_SMD:D_SOD-123D1, D10, D11, D12, D13, D14, D15, D16, D17, D18, D100, D101, D102, D103, D104, D105 +89
6MountingHole_3.2mm_M3_ISO14580MountingHole:MountingHole_3.2mm_M3_ISO14580MH1, MH1, MH1, MH1, MH1, MH1
410kResistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR1, R2, R3, R4
250V 100nFCapacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC1, C2
2MCP23017_SOPackage_SO:SOIC-28W_7.5x17.9mm_P1.27mmU1, U2
1'"PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH68
1*PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH35
1,<PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH83
1-PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH36
1-_PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH28
1.>PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH84
1.DelPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH104
1/PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH34
1/?PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH85
10)PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH27
10InsPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH103
11PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH88
11!PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH18
12PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH89
12@PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH19
13PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH90
13#PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH20
14PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH72
14$PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH21
15PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH73
15%PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH22
150V 10uFCapacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC3
16PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH74
16^PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH23
17PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH53
17&PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH24
18PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH54
18*PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH25
19PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH55
19(PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH26
1;:PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH67
1=+PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH29
1APCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH58
1Arrow DownPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH101
1Arrow LeftPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH100
1Arrow RightPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH102
1Arrow UpPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH87
1BPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH80
1BackspacePCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH30
1CPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH78
1Caps LockPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH57
1DPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH60
1DeletePCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH51
1EPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH40
1ESCPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH1
1EndPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH52
1EnterPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH69
1FPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH61
1F1PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH2
1F10PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH11
1F11PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH12
1F12PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH13
1F2PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH3
1F3PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH4
1F4PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH5
1F5PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH6
1F6PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH7
1F7PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH8
1F8PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH9
1F9PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH10
1FunctionPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH97
1GPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH62
1HPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH63
1HomePCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH32
1IPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH45
1InsertPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH31
1JPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH64
1KPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH65
1LPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH66
1Left AltPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH94
1Left ControlPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH92
1Left ShiftPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH75
1Long +PCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH56
1Long EnterPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH91
1MPCM_marbastlib-choc:SW_choc_v1_HS_CPG135001S30_1uCH82

The 194 most common of 226 parts.

Questions

How big is the Keyboard PCB?

It measures 404 × 118.3 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Keyboard use?

226 parts, built around the 1N4148W. 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.

Where can I download the Keyboard KiCad files?

From the ItzBuble/Bubleboard repository on GitHub, at the commit this page was made from: the board is Hardware/Keyboard.kicad_pcb and its schematic Hardware/Keyboard.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Keyboard design in my own project?

Its repository states no licence, so its author keeps all rights: ask ItzBuble before reusing the design.

Similar boards

  • 4 layers99 × 53.3 mmPSLab, the printed circuit board in 3D

    PSLab

    fossasia/pslab-hardware

    PSLab Hardware Design and Schematics https://pslab.io

    199 parts1.7kApache-2.0
  • 2 layers208.8 × 396.9 mmFerris, the printed circuit board in 3D

    Ferris

    pierrechevalier83/ferris

    A low profile split keyboard designed to satisfy one single use case elegantly

    145 parts1.3k
  • 2 layers285.5 × 95 mmReviung46 ver1 1, the printed circuit board in 3D

    Reviung46 ver1 1

    gtips/reviung

    The REVIUNG41 is 41-key column staggered keyboard.

    119 parts517MIT
  • 4 layers95.6 × 73.6 mmMathpad, the printed circuit board in 3D

    Mathpad

    Summa-Cogni/Mathpad

    A mathematical keypad for students and professionals

    93 parts243
  • 2 layers141.5 × 83 mmRolio, the printed circuit board in 3D

    Rolio

    MickiusMousius/Rolio46Keyboard

    A split wireless keyboard based on the Corne and Sofle

    110 parts236MIT
  • 6 layers160 × 100 mmAdrmu6layer, the printed circuit board in 3D

    Adrmu6layer

    marcoreps/ADRmu

    ADR1000 10V standard

    240 parts149
  • 2 layers99.1 × 90.7 mmBgkeeb, the printed circuit board in 3D

    Bgkeeb

    sadekbaroudi/bgkeeb

    This is a reversible 100mm x 100mm pcb with support for mx or choc switches (no hotswap), per key led, rotary encoders, and exposes the SDA/SCL/GND/VCC lines in the form of the pimoroni trackball pins (meaning you can…

    108 parts108
  • 2 layers229.8 × 102.6 mmBw2, the printed circuit board in 3D

    Bw2

    hazels-garage/bad-wings

    Bad Wings

    107 parts107CC-BY-SA-4.0