Skip to the content
PCBKitNew board
4 layers92.8 × 76 mmDeck-8, the printed circuit board in 3D

Open-source 8-key macro pad with 2 knobs, OLED and Bluetooth: PCB, case and ZMK firmware

Size
92.8 × 76 mm
Copper layers
4
Thickness
1.6 mm
Parts
101
Nets
88
Pads
441
Tracks, vias
1,037, 585
Pours
14
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
23 Oct 2026
Updated
23 Oct 2026

Overview

Deck-8 is an open-source printed circuit board by varaddorle007, from the varaddorle007/deck-8 repository on GitHub, published under the MIT licence. It is a 4-layer board of 92.8 × 76 mm with 101 parts on 88 nets, routed with 1,037 tracks and 585 vias.

It is built around the SN74LV1T125DBV, MDBT50Q-1MV2 and BQ24074RGTR, with the TPS22917DBV, TPS7A0533PDBV and USBLC6-2SC6 among its other parts. Its parts include 27 capacitors, 20 resistors, 13 switches, 8 diodes and 7 ICs. It belongs with the keyboards and input boards and the nRF52 and nRF5x boards of this library.

Main components

8

README

README.md

Deck-8

An open-source 8-key macro pad with two knobs, a tiny screen and Bluetooth. Everything is in this repo: the circuit board, the 3D-printable case, the firmware, and every file you need to order the parts.

Watch the 30 second promo

Click the preview for the full 30 second video with sound.

Deck-8 in its case

Status: Rev A, designed and checked, but not yet built. The board passes every automatic check (design rules, schematic checks, a fit check of the board in the case). The firmware compiles. But no one has built one yet, and the firmware has never run on real hardware. If you build one, you are the first. Please open an issue and tell us what happened, good or bad. See Known risks.

What it does

Keys8 mechanical keys (MX-style, hot-swap, so you can change switches without soldering) in 2 rows of 4
Knobs2 rotary knobs with push buttons (volume, scrolling, anything you map)
Screen0.96 inch OLED showing battery, connection and active layer
Side buttonsL1 and L2 on the left, System on the right, plus a power slide switch
LightsRGB under every key, plus a glowing ring around the base
ConnectionsUSB-C and Bluetooth (5 profiles)
BatteryBuilt-in 1000 mAh LiPo, charges over USB-C
BrainNordic nRF52840 (Raytac MDBT50Q module), running ZMK firmware
RemappingChange keys live in ZMK Studio, no rebuild needed
SizeCase 98 × 84 mm, 18 mm tall at the front rising to 30 mm at the back (the top tilts 8°). Board 92.8 × 76 mm, 4 layers

The layers

By default the 8 keys send F13–F20. No normal keyboard has those keys, so they never clash with anything. Bind them to anything you like in OBS, in your operating system, or in a Stream Deck-style app.

text
         [knob A]   [  OLED  ]   [knob B]
  [L1]   [ 1 ] [ 2 ] [ 3 ] [ 4 ]
  [L2]   [ 5 ] [ 6 ] [ 7 ] [ 8 ]            [SYS]
LayerHow you get itKeys 1–4Keys 5–8Knob A turn / pressKnob B turn / press
Bank 1defaultF13 F14 F15 F16F17 F18 F19 F20volume / mute← → / play-pause
Mediahold L1prev, play/pause, next, muteundo, redo, copy, pastesamesame
Bank 3hold L2Ctrl+F13–F16Ctrl+F17–F20samesame
Systemhold SYSBluetooth profile 1–4clear profile, USB/Bluetooth, lights on/off, next effectbrightness / saturationcolour / unlock Studio

On the System layer, L1 jumps to the bootloader (for updates) and L2 resets. Edit firmware/config/deck8.keymap to change any of this.

Pictures

The case

Front rightTop
SideBack with USB-C
Board inside the caseTray with battery

Bottom right: the tray, with the battery on the left and the glowing ring's wall around the edge. The 3D renders show the board and its parts as simple boxes where a part has no 3D model.

How it stacks together

Layers from top to bottom

The board is a two-sided sandwich:

  • Underneath are all the small electronic parts: the main chip, the charger, the USB-C port, the key lights and the 8 key sockets. The factory solders these on.
  • On top are only the parts you touch: the 2 knobs and the screen.
  • The key switches are not soldered. They push down from the top through a thin plate and click into the sockets underneath. A broken key is pulled out and replaced.

The circuit board

TopBottom
PCB topPCB bottom
3D view, top3D view, bottom
PCB 3D topPCB 3D bottom

The PCB 3D views show the bare board; most parts have no 3D model in KiCad's library.

Four layers: top (signals), a full ground plane, a split power plane (3.3 V and the LED supply), and the bottom (parts and signals). 1037 tracks, 585 vias, USB data lines 14.5 and 15.2 mm long with no vias.

Ground layerPower layer
Ground planePower plane

The schematic

Seven sheets, all generated from hardware/tools/gen_schematic.py. The full set is in docs/deck8-schematic.pdf.

Power: USB-C, charger, regulator, LED switchMCU: nRF52840 and crystal
PowerMCU
Inputs: keys, buttons, knobsLightingDisplay
InputsLightingDisplay

Build one

This is the plain version. release/BUILD-GUIDE.md has the same steps in more detail, and release/BUY-LIST.csv lists every part.

What it costs

An honest estimate, from October 2026 prices. Check every number at the time you order:

ItemRough cost
Assembled boards from JLCPCB (3–5 boards, with all the small parts, setup fees and shipping)about $150–200 total (₹13,000–17,000)
Parts you buy yourself: screen, 2 encoders, battery, LED strip, 8 switches, keycaps, screwsabout $20–35 per unit
Printing the caseabout $10–35, depending on where you print

The big cost is not the board itself. A bare board is cheap (5 boards for about $8 with leaded HASL finish). The cost is assembly: setup fees, "extended part" fees, the parts, and shipping. If you can solder, you can order bare boards and build them, but the main chip's pads are underneath it (see the next section), so you will need a hot-air station.

Step 1: order the board

The ready-to-upload files are in release/deck8-RevA-manufacturing/1-PCB-order-JLCPCB/:

FileUpload it as
deck8-RevA-gerbers.zipThe board design
deck8-RevA-bom-jlc.csvThe parts list
deck8-RevA-cpl-jlc.csvWhere each part goes

Settings (all listed in JLC-ORDER-SETTINGS.md in the same folder): 4 layers, 1.6 mm thick, ENIG finish (HASL also works but is less flat), tented vias, assembly on the bottom side only, and "Confirm parts placement" turned on.

Watch for these on the JLCPCB parts page:

  • The nRF52840 module (U5, MDBT50Q-1MV2) was out of stock on 24 Oct 2026. Pick "Global Sourcing" for it, or buy it from Mouser or DigiKey and send it to JLC. Don't remove it from the order: its pads are under the module, so it can't be soldered by hand without hot air.
  • Four parts were swapped to alternatives JLC had in stock. Each has the same footprint, checked against its datasheet: the 8 key sockets (HanElectricity CPG151101S11-16), the charger (BQ24074RGTT), the reset button (PTS810SJK) and the ring connector (Joint Tech A1001WR-S-03P).
  • Check the placement preview. JLC doesn't know some of these parts' rotation. Check D1–D8, K1–K8, J4, SW1–SW5 and U5 sit correctly on their pads, and rotate any that don't.

Step 2: buy the rest

release/BUY-LIST.csv is the full list. Briefly:

  • 2 × Bourns PEC11R-4220F-S0024 rotary encoders (through-hole)
  • 4 × Würth 9774030243 M2 standoffs (SMD, not at LCSC)
  • 0.96 inch SSD1306 I²C OLED module with its 4-pin header (pin order GND-VCC-SCL-SDA)
  • 8 × MX-style switches and 8 × keycaps
  • 1000 mAh LiPo with protection board and a JST-PH plug (check the polarity, see below)
  • SK6812 LED strip (5 mm wide, 60 LEDs/m, 293 mm = 17 LEDs) and a 3-pin JST SH lead
  • M2 hardware: 4 heat-set inserts (3 mm long), 4 × M2×5 wafer-head screws, 2 × M2×6 and 2 × M2×12 pan-head screws
  • 4 rubber feet (8 mm), and a 1 mm acrylic lens (laser-cut from the DXF)
  • To flash the bootloader once: a Tag-Connect TC2030-IDC-NL cable and an SWD probe

Step 3: print the case

Files are in release/deck8-RevA-manufacturing/3-Enclosure/. All STLs are in millimetres, laid flat.

PartQtyMaterial
Top shell1MJF or SLS nylon (best), or FDM PETG/ASA. Nylon takes heat-set inserts.
Bottom tray1MJF nylon or FDM PETG
Light ring1Clear or translucent (clear SLA resin, sanded frosted). It must let light through.
Knob2MJF nylon or SLA (one file, print two)
Buttons (L1, L2, System)1 eachMJF nylon or SLA
Switch plate1Laser-cut 1.5 mm steel, aluminium or FR-4 from the DXF (best), or printed
OLED lens11 mm clear or smoked acrylic, laser-cut from the DXF

Step 4: assemble

  1. Solder by hand: the 4 standoffs on the bottom (ST1–ST4) and the 2 encoders on the top.
  2. Check power. Plug in USB-C through a USB power meter: it should draw well under 100 mA. With the power switch on, TP2 (VSYS) should read about 4.4 V and TP4 (+3V3) 3.3 V, measured against TP6 (GND).
  3. Flash the bootloader once (next section).
  4. Melt the 4 heat-set inserts into the shell bosses.
  5. Fit the OLED. Shell upside down: drop in the lens, then the screen module glass-down with its header pins pointing up. Clip the header's short pins to 1 mm.
  6. Fit the board. Lower it onto the bosses with the OLED pins through J5. Screw it down with the four wafer-head screws, then solder the 4 J5 pins from underneath. The shell sets the screen height, so do this after screwing the board in.
  7. Switches. Put the plate in, then push the 8 switches through it into the sockets.
  8. Battery. Check the polarity first: the red wire must land on J2 pin 1 (VBAT). Swap the crimps in the plug if not. Then plug in the cell; it sits in the tray's fence.
  9. Ring. Stick the LED strip round the light wall, LEDs facing out. Solder the SH lead (VLED, DIN, GND) and plug it into J4.
  10. Close up. Fit the ring, then close the tray with the M2×6 screws (front) and M2×12 (back). Stick on the feet.
  11. Finish. Knobs on the shafts, buttons, and keycaps.

Step 5: firmware

The firmware is ready-built: release/deck8-RevA-manufacturing/4-Firmware/deck8.uf2.

Once per board (a new nRF52840 is empty): put the bootloader on through the Tag-Connect pads J3.

  1. Download nice_nano_bootloader-0.11.0_s140_6.1.1.hex from the Adafruit bootloader releases. Its flash layout matches this board.
  2. Connect the Tag-Connect cable and an SWD probe, power the board over USB, then run:
bash
nrfjprog --program nice_nano_bootloader-0.11.0_s140_6.1.1.hex --chiperase --verify --reset
  1. A USB drive called NICENANO appears. Copy deck8.uf2 onto it. The board restarts as "Deck-8".

Updates: hold SYS and press L1, or double-press the RESET button (SW2), and copy the new .uf2 onto the drive.

First-power-up checks (the firmware has never run on real hardware, so check these):

  • Screen upside down? Add segment-remap; and com-invdir; to the oled node in firmware/boards/deck8/deck8_nrf52840_zmk.dts. Blank? Delete inversion-on;.
  • A knob turns the wrong way? Swap its two values in sensor-bindings in the keymap. Two steps per click? Set steps = <48> for that encoder.
  • Ring colours wrong, or the wrong length? Change color-mapping or chain-length in the ring_leds node, and chain-length in all_leds (8 key LEDs + ring LEDs).

See firmware/README.md for how the firmware is built and what each file does.

What's in this repo

text
deck-8/
├── hardware/             the circuit board (KiCad 10)
│   ├── main/             the KiCad project: open deck8.kicad_pro
│   ├── lib/              the 4 custom footprints
│   ├── exports/          the board as a 3D STEP file (deck8_pcb.step)
│   ├── tools/            Python that generates, routes and checks the board and writes the fab files
│   └── README.md         how the board was designed, routed and checked
├── mechanical/           the case (Autodesk Fusion)
│   ├── fusion/Deck8Model/  script that builds the whole case; change a number and re-run
│   └── exports/          STEP, STL, renders and the clash-check report
├── firmware/             ZMK firmware: keymap, board definition, LED and battery code
├── release/              everything ready to upload, print and flash, plus the build guide and buy list
├── media/                the 30 second promo video
└── docs/                 images and the schematic PDF

Nothing is drawn by hand. The schematic, the board layout and the case are all produced by scripts, so a change is a few lines of code and a re-run. That also means edit the scripts, not the generated files.

Rebuild it from source

You need macOS or edit the paths: the scripts point to KiCad at /Applications/KiCad/KiCad.app. You'll want KiCad 10, Python 3, Autodesk Fusion (the free personal or education licence works), and a C compiler for the router.

Board, from hardware/tools. KPY is KiCad's own Python, which includes pcbnew:

bash
KPY=/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/Current/bin/python3
python3 gen_schematic.py && python3 check_schematic.py
$KPY gen_pcb.py && $KPY route_pcb.py && python3 check_pcb.py
$KPY make_fab.py

About a minute in total, with the same result every time. check_pcb.py runs KiCad's design-rule check and fails on anything. make_fab.py refuses to run unless the check passes, then writes the Gerbers, BOM and pick-and-place files and reads them all back to verify them.

The router is a small A* autorouter written for this project (hardware/tools/route_pcb.py plus a C core in hardware/tools/router/maze.c, compiled on first run).

Case, in Fusion: open Utilities → Add-Ins → Scripts and Add-Ins, add the folder mechanical/fusion/Deck8Model, and run it. It builds the case, loads the PCB from hardware/build/deck8_pcb.step, and writes the report and exports. If you copy the script into Fusion's own scripts folder instead, put the path of this repo in a file called deck8_root.txt next to it, or set the DECK8_ROOT environment variable. A clean build reports 0 errors and 0 clashes.

Firmware, from firmware/:

bash
tools/setup_toolchain.sh   # once: about 4 GB into ~/zmk-build, nothing system-wide
tools/build.sh             # builds out/deck8.uf2

Release files: python3 release/tools/make_release.py collects the latest board, case and firmware files into release/deck8-RevA-manufacturing/.

Known risks

Rev A is a first prototype. In order of how likely they are to bite:

  1. Nothing has been powered up. The design passes every check a computer can run, but first prototypes nearly always have a surprise.
  2. The firmware has never run on a real board. The screen orientation, knob direction and ring length are the likely first fixes (each is one line).
  3. Part stock. The nRF52840 module was out of stock at JLC. Stock changes daily; check before you order.
  4. Footprints are checked against datasheets, not against real parts. The key sockets are HanElectricity parts sold under Kailh's number; the land pattern matches their drawing, but nobody has plugged a switch in.
  5. The LED-ring plug length is assumed (3.0 mm). JST doesn't draw the mated length for that connector.
  6. The cells' polarity isn't standard. JST-PH leads from different sellers are wired both ways. Check before plugging in.
  7. The lights need a charged battery. The SK6812 LEDs need about 3.7 V, so on battery below that the firmware switches the colours off.
  8. Power saving is off. The chip runs on its LDO. Raytac's material doesn't confirm the DC/DC inductor is fitted, and turning DC/DC on without it stops the chip. Once you have a board, try it (see firmware/boards/deck8/deck8_nrf52840_zmk_defconfig).

Help wanted

  • Build one and report back. Photos, measurements, what broke.
  • A cheaper variant. The full board costs a lot to have assembled. A 2-layer, hand-solderable board that takes a ready-made nRF52840 board (nice!nano style) would cost far less. If you design one, send it.
  • Other fabs. The BOM uses LCSC part numbers for JLCPCB. Ports to PCBWay, or to Indian assembly houses, are welcome.
  • Windows and Linux. The scripts assume macOS paths.
  • Case ideas. Different materials, a flat version, a travel lid.

Open an issue or a pull request.

License

MIT for the hardware design files, the case, the code and the docs. Do what you like with them, including selling them; please keep the licence notice. Third-party material is listed in NOTICE.md.

Parts

101
QtyValueFootprintReferences
13100nCapacitor_SMD:C_0603_1608MetricC4, C11, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C27
8SK6812MINI-ELED_SMD:LED_SK6812MINI-E_3.2x2.8mm_P1.5mm_ReverseMountD1, D2, D3, D4, D5, D6, D7, D8
410u 10VCapacitor_SMD:C_0603_1608MetricC2, C9, C10, C26
4M2 bossMountingHole:MountingHole_2.2mm_M2H1, H2, H3, H4
4M2x3 standoffMounting_Wuerth:Mounting_Wuerth_WA-SMSI-M2_H3mm_9774030243ST1, ST2, ST3, ST4
30RResistor_SMD:R_0603_1608MetricR14, R15, R20
3100kResistor_SMD:R_0603_1608MetricR8, R9, R13
31MResistor_SMD:R_0603_1608MetricR10, R11, R12
3FiducialFiducial:Fiducial_1mm_Mask2mmFID1, FID2, FID3
212pCapacitor_SMD:C_0603_1608MetricC13, C14
21u 10VCapacitor_SMD:C_0603_1608MetricC5, C7
24.7kResistor_SMD:R_0603_1608MetricR18, R19
24.7u 10VCapacitor_SMD:C_0603_1608MetricC3, C12
25.1kResistor_SMD:R_0603_1608MetricR1, R2
2DNPResistor_SMD:R_0603_1608MetricR6, R7
2PEC11R-4220F-S0024Rotary_Encoder:RotaryEncoder_Alps_EC11E-Switch_Vertical_H20mmENC1, ENC2
2SN74LV1T125Package_TO_SOT_SMD:SOT-23-5U6, U7
1+3V3TestPoint:TestPoint_Pad_D1.0mmTP4
11.5kResistor_SMD:R_0603_1608MetricR5
11.8kResistor_SMD:R_0603_1608MetricR4
1100u 6.3VCapacitor_SMD:C_1206_3216MetricC25
110kResistor_SMD:R_0603_1608MetricR3
11nCapacitor_SMD:C_0603_1608MetricC8
11u 25VCapacitor_SMD:C_0603_1608MetricC1
12.2u 10VCapacitor_SMD:C_0603_1608MetricC6
132.768kHz 9pFCrystal:Crystal_SMD_3215-2Pin_3.2x1.5mmY1
133Resistor_SMD:R_0603_1608MetricR16
1330Resistor_SMD:R_0603_1608MetricR17
1500mA holdFuse:Fuse_1206_3216MetricF1
1BQ24074RGTPackage_DFN_QFN:VQFN-16-1EP_3x3mm_P0.5mm_EP1.6x1.6mm_ThermalViasU2
1GNDTestPoint:TestPoint_Pad_D1.0mmTP6
1KEY1Deck8:SW_MX_Hotswap_Kailh_1u_NorthLEDK1
1KEY2Deck8:SW_MX_Hotswap_Kailh_1u_NorthLEDK2
1KEY3Deck8:SW_MX_Hotswap_Kailh_1u_NorthLEDK3
1KEY4Deck8:SW_MX_Hotswap_Kailh_1u_NorthLEDK4
1KEY5Deck8:SW_MX_Hotswap_Kailh_1u_NorthLEDK5
1KEY6Deck8:SW_MX_Hotswap_Kailh_1u_NorthLEDK6
1KEY7Deck8:SW_MX_Hotswap_Kailh_1u_NorthLEDK7
1KEY8Deck8:SW_MX_Hotswap_Kailh_1u_NorthLEDK8
1L1Button_Switch_SMD:SW_Push_1P1T-MP_NO_Horizontal_Alps_SKRTLAE010SW3
1L2Button_Switch_SMD:SW_Push_1P1T-MP_NO_Horizontal_Alps_SKRTLAE010SW4
1LED STRIPConnector_JST:JST_SH_SM03B-SRSS-TB_1x03-1MP_P1.00mm_HorizontalJ4
1LiPo 1000mAhConnector_JST:JST_PH_S2B-PH-SM4-TB_1x02-1MP_P2.00mm_HorizontalJ2
1MDBT50Q-1MV2Deck8:Raytac_MDBT50QU5
1OLED GND-VCC-SCL-SDAConnector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ5
1POWERDeck8:SW_SPDT_PCM12SW1
1RESETButton_Switch_SMD:SW_SPST_PTS810SW2
1SWDConnector:Tag-Connect_TC2030-IDC-NL_2x03_P1.27mm_VerticalJ3
1SYSTEMButton_Switch_SMD:SW_Push_1P1T-MP_NO_Horizontal_Alps_SKRTLAE010SW5
1TPS22917DBVPackage_TO_SOT_SMD:SOT-23-6U4
1TPS7A0533PDBVPackage_TO_SOT_SMD:SOT-23-5U3
1USB-CDeck8:USB_C_Receptacle_HRO_TYPE-C-31-M-12J1
1USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U1
1VBATTestPoint:TestPoint_Pad_D1.0mmTP3
1VBUSTestPoint:TestPoint_Pad_D1.0mmTP1
1VLEDTestPoint:TestPoint_Pad_D1.0mmTP5
1VSYSTestPoint:TestPoint_Pad_D1.0mmTP2

Questions

How big is the Deck-8 PCB?

It measures 92.8 × 76 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Deck-8 use?

101 parts, built around the SN74LV1T125DBV, MDBT50Q-1MV2, BQ24074RGTR and TPS22917DBV. 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 Deck-8 KiCad files?

From the varaddorle007/deck-8 repository on GitHub, at the commit this page was made from: the board is hardware/main/deck8.kicad_pcb and its schematic hardware/main/deck8.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Deck-8 design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 4 layers49.3 × 53.8 mmNovara main, the printed circuit board in 3D

    Novara main

    abhisheknote1234-writ/Novara_PCB_Design

    The HARDWARE design for the product - Intelligent maternal health monitoring using PPG for early detection of stress and pregnancy-related risks.

    52 parts
  • 2 layers121.9 × 81 mmCav16 pico, the printed circuit board in 3D

    Cav16 pico

    Charading/SHEGO16-QMK-Hall-Effect-Macropad

    An RP2040-powered 4x4 15 key macropad with a knob on the top row, that runs custom QMK firmware that allows analogue hall effect sensors to work, also has SOCD, works with VIA and SignalRGB

    132 parts3
  • 4 layers99.9 × 60.1 mmPager, the printed circuit board in 3D

    Pager

    alx-alexpark/lora-pager-v2

    An ESP32 powered LoRa pager with a 1W E22-900M30S module and an ePaper display. Mirrored from https://codeberg.org/parkalex/lora-pager-v2

    84 parts
  • 2 layers23 × 83 mmL Smart Baton, the printed circuit board in 3D

    L Smart Baton

    yuanf2004/smart-baton-kicad

    54 parts1
  • 2 layers72.1 × 54 mmAzure Mote, the printed circuit board in 3D

    Azure Mote

    bookeydoo/Azure-Mote

    A bluetooth controller for my custom handheld console

    22 parts
  • 2 layers430.7 × 126 mmTeds kb-100, the printed circuit board in 3D

    Teds kb-100

    DovydasTEDS/teds-kb-100

    A 100% ISO-105 Mechanical keyboard - custom PCB, custom case. It has per-key rgb leds and a rotary encoder. The firmware is written in QMK.

    432 parts1