Skip to the content
PCBKitNew board
2 layers95 × 95 mmHackpad, the printed circuit board in 3D

4-key macropad + EC11 encoder + OLED, XIAO RP2040, KMK firmware. Submitted to Hack Club Hackpad YSWS.

Size
95 × 95 mm
Copper layers
2
Thickness
1.6 mm
Parts
32
Nets
26
Pads
113
Tracks, vias
43, 0
Pours
1
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
7 Jun 2026
Updated
8 Jun 2026

Overview

Hackpad is an open-source printed circuit board by rishith-c, from the rishith-c/hackpad repository on GitHub, published under the MIT licence. It is a 2-layer board of 95 × 95 mm with 32 parts on 26 nets, routed with 43 tracks and 0 vias.

Its parts include 12 diodes, 12 switches and 3 connectors. It belongs with the keyboards and input and lEDs and displays boards of this library.

README

README.md

Hackpad

A 12-key macropad with a rotary encoder and an OLED display, built on a Seeed XIAO RP2040 and running KMK firmware. Submitted to Hack Club's Hackpad You Ship, We Ship program.

v2 — the most loaded build that fits the Hackpad rules at once: 12 MX keys, 1 EC11 rotary encoder, 1 OLED display, and every usable GPIO on the XIAO consumed (11 / 11). 13 inputs, well under the 16-input cap; 95 × 95 mm board, well inside the 100 × 100 mm size cap.

Assembled mockup

Features

  • 12 MX mechanical switches in a 4 × 3 diode matrix (COL2ROW, 1N4148)
  • 1 EC11 rotary encoder — defaults to volume +/− (re-mapped per layer)
  • 0.91" 128 × 32 SSD1306 OLED showing the active layer name
  • 3 firmware layers (default / media / numpad), momentary switching via the bottom-right key (and bottom-right-2 for L2)
  • Two-part 3D-printed case (red top plate + black bottom tray), M3 heatset insert bosses, USB-C side cutout
  • Individual STL part files for every printable AND hardware item (top, bottom, M3 screws, heatset inserts)

CAD model

Full assembled view in cad/assembled-model.step — GitHub renders the STEP inline. STL version in cad/assembled-model.stl.

Printable + hardware parts (all generated by build_scripts/build_case.py):

PartSTLSTEPNotes
Top plate (red, 5 mm)Top.stlTop.step12 MX cutouts + encoder hole + OLED window + XIAO inspection
Bottom tray (black, 8 mm)Bottom.stlBottom.step4× heatset bosses + USB-C side cutout
M3 × 16 mm SHCS screw (×4)M3x16_Screw.stlM3x16_Screw.stephardware visualization — kit supplies real ones
M3 × 5 × 4 mm brass heatset insert (×4)HeatsetInsert_M3x5x4.stlHeatsetInsert_M3x5x4.stephardware visualization — kit supplies real ones

Case fits within 99 × 99 × 15 mm — well inside Hackpad's 200 × 200 × 100 mm limit. Screwed together with 4 × M3 × 16 mm SHCS bolts into M3 × 5 × 4 mm brass heatset inserts.

PCB

Built in KiCad 9 from pcb/hackpad.kicad_pro. The whole board is generated programmatically by build_scripts/build_pcb.py from the netlist

  • placement CSVs — re-running it reproduces the .kicad_pcb byte-for-byte.

Schematic:

Schematic

PCB layout (top and bottom copper):

PCB top PCB bottom
  • Dimensions: 95 × 95 mm (within the Hackpad 100 × 100 mm rule)
  • Layers: 2 (F.Cu signal trunks + B.Cu GND pour and ROW trunks)
  • OLED header pin order: GND – VCC – SCL – SDA (kit spec)
  • Footprints: Cherry MX 1.00u PCB, 1N4148 DO-35 horizontal, EC11E vertical, XIAO on 2 × PinHeader_1x07_P2.54mm_Vertical, OLED on PinHeader_1x04_P2.54mm_Vertical, MountingHole_3.2mm_M3
  • Routing: matrix is fully routed in copper (4 COL trunks F.Cu, 3 ROW trunks B.Cu with cathode tabs, 12 switch→anode bridges, GND pour). 11 short XIAO ↔ peripheral signal pulls (4 COL + 3 ROW + SDA
    • SCL + 5V + ENC_A + ENC_B) are left as ratlines for ~5 min of interactive routing — see pcb/HOW_TO_FINISH.md for the exact start/end coordinates of each pull.
  • Silkscreen: HACKPAD v2.0 on the front, github.com/rishith-c/hackpad on the back.
  • DRC: passes at error level (kicad-cli pcb drc --severity-error → 0 violations)

Gerbers exported and ready for JLCPCB: production/gerbers.zip. Order at 2 layers · 1.6 mm · HASL · green.

Firmware

KMK (CircuitPython). See firmware/README.md for flashing instructions. Sources in firmware/KMK/:

FilePurpose
firmware/KMK/main.py4×3 matrix + encoder + OLED setup, 3 keymap layers
firmware/KMK/code.pyCircuitPython entry point (imports main)
firmware/KMK/boot.pydisables CIRCUITPY auto-reload while plugged in

Pin map

The XIAO RP2040 exposes 11 usable GPIO. All 11 are used.

XIAOGPIORole
D0GP26matrix COL0 (left column)
D1GP27matrix COL1
D2GP28matrix COL2
D3GP29matrix COL3 (right column)
D4GP6OLED SDA (I²C1)
D5GP7OLED SCL (I²C1)
D6GP0matrix ROW0 (top row)
D7GP1matrix ROW1 (middle row)
D8GP2matrix ROW2 (bottom row)
D9GP4encoder phase A
D10GP3encoder phase B

No spare GPIOs. See pcb/DESIGN_NOTES.md for alternate firmware tweaks (drop OLED for encoder push + RGB; shrink matrix to 3×3 for a second encoder; etc.) — each one reuses this same PCB without changes.

Bill of Materials

See production/BOM.csv. Everything except the PLA filament is in the Hackpad kit.

  • 1 × Seeed XIAO RP2040 (through-hole, mounts on 2 × 1×7 pin sockets)
  • 12 × Cherry MX mechanical switch
  • 12 × DSA blank keycap
  • 12 × 1N4148 diode (DO-35)
  • 1 × EC11 rotary encoder (A/B wired, push left unwired)
  • 1 × 0.91" SSD1306 128 × 32 OLED (I²C, addr 0x3C, pin order GND-VCC-SCL-SDA)
  • 4 × M3 × 16 mm SHCS bolt
  • 4 × M3 × 5 × 4 mm brass heatset insert
  • 1 × 3D-printed top plate (production/Top.stl)
  • 1 × 3D-printed bottom tray (production/Bottom.stl)

Repository layout

text
├── README.md
├── LICENSE
├── cad/
│   ├── assembled-model.step              # full assembly (Hackpad spec)
│   └── assembled-model.stl               # same, STL (GitHub interactive viewer)
├── pcb/
│   ├── hackpad.kicad_pro                 # KiCad project
│   ├── hackpad.kicad_sch                 # schematic stub (canonical viz in assets/schematic.png)
│   ├── hackpad.kicad_pcb                 # placed + matrix-routed board
│   ├── netlist.csv                       # canonical net list
│   ├── placement.csv                     # per-part X/Y/rotation
│   ├── DESIGN_NOTES.md                   # build variants / pin budget reasoning
│   └── HOW_TO_FINISH.md                  # 5-min interactive routing checklist
├── firmware/
│   ├── README.md
│   └── KMK/
│       ├── main.py                       # KMK firmware (matrix + encoder + OLED, 3 layers)
│       ├── code.py                       # CircuitPython entry point
│       └── boot.py                       # boot-time config
├── production/
│   ├── gerbers.zip                       # for JLCPCB (2 layers, 1.6 mm)
│   ├── Top.step / Top.stl                # top plate
│   ├── Bottom.step / Bottom.stl          # bottom tray
│   ├── M3x16_Screw.step / .stl           # individual screw model (used x4)

Submitting to Hackpad

This repo matches the Hackpad submission requirements:

  • PCB ≤ 100 × 100 mm ✅ (this board is 95 × 95 mm)
  • < 16 inputs ✅ (13: 12 keys + 1 encoder)
  • 2-layer PCB ✅
  • Through-hole XIAO RP2040 ✅
  • All-3D-printed case ✅
  • Folder layout: cad/, pcb/, firmware/, production/, README.md ✅ (matches the Orpheuspad reference)

Submission steps:

  1. Post a ship in #hackpad-ships on the Hack Club Slack (link to this repo + photos from assets/).
  2. Fill out the submission form: https://forms.hackclub.com/hackpad-submission.
  3. Reviewed by @alexren. On approval you receive the kit + a $15 grant for JLCPCB PCB fab + a free 3D-printed case from another Hack Clubber, plus optionally $18 for a soldering iron.

Regenerating from source

bash
# PCB (uses KiCad 9 bundled Python — pcbnew API)
/Applications/KiCad.app/Contents/Frameworks/Python.framework/Versions/Current/bin/python3 build_scripts/build_pcb.py

# Case + screws + assembled model (pip install cadquery)
python3 build_scripts/build_case.py

# Schematic (pip install schemdraw cairosvg; cairo from Homebrew)
DYLD_FALLBACK_LIBRARY_PATH=/opt/homebrew/lib python3 build_scripts/build_schematic.py

# Mockup PNG (pip install cadquery trimesh matplotlib)
python3 build_scripts/build_mockup.py

# Gerbers + drill files, bundled to production/gerbers.zip
mkdir -p /tmp/gerbers && \
  /Applications/KiCad.app/Contents/MacOS/kicad-cli pcb export gerbers \
    --output /tmp/gerbers/ \
    --layers "F.Cu,B.Cu,F.Silkscreen,B.Silkscreen,F.Mask,B.Mask,Edge.Cuts" \
    pcb/hackpad.kicad_pcb && \
  /Applications/KiCad.app/Contents/MacOS/kicad-cli pcb export drill \
    --output /tmp/gerbers/ --excellon-separate-th pcb/hackpad.kicad_pcb && \
  ( cd /tmp/gerbers && zip /path/to/production/gerbers.zip *.gtl *.gbl *.gto *.gbo *.gts *.gbs *.gm1 *.drl )

License

MIT.

Parts

32
QtyValueFootprintReferences
121N4148D_DO-35_SOD27_P7.62mm_HorizontalD1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12
12MXSW_Cherry_MX_1.00u_PCBSW1, SW2, SW3, SW4, SW5, SW6, SW7, SW8, SW9, SW10, SW11, SW12
4M3MountingHole_3.2mm_M3MH1, MH2, MH3, MH4
1EC11RotaryEncoder_Alps_EC11E_Vertical_H20mmENC1
1OLEDPinHeader_1x04_P2.54mm_VerticalJ3
1XIAO_LPinHeader_1x07_P2.54mm_VerticalJ1
1XIAO_RPinHeader_1x07_P2.54mm_VerticalJ2

Questions

How big is the Hackpad PCB?

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

What parts does the Hackpad use?

32 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.

Where can I download the Hackpad KiCad files?

From the rishith-c/hackpad repository on GitHub, at the commit this page was made from: the board is pcb/hackpad.kicad_pcb and its schematic pcb/hackpad.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Hackpad 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

  • 2 layers50 × 23.2 mmAnalog, the printed circuit board in 3D

    Analog

    hoglet67/RGBtoHDMI

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

    32 parts1kGPL-3.0
  • 2 layers136.8 × 54.2 mmRetropie zero, the printed circuit board in 3D

    Retropie zero

    hackclub/OnBoard

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

    32 parts915
  • 2 layersMooltipass top, the printed circuit board in 3D

    Mooltipass top

    limpkin/mooltipass

    Github repository dedicated to the mooltipass project

    32 parts531
  • 2 layers16 × 20 mmESPKey, the printed circuit board in 3D

    ESPKey

    octosavvi/ESPKey

    Wiegand data logger, replay device and micro door-controller

    32 parts353GPL-2.0
  • 2 layers82 × 40.9 mmDisplay7447, the printed circuit board in 3D

    Display7447

    zmaker/arduino_cookbook

    gli sketch del nuovo progetto Arduino Cookbook e dei video di YouTube

    32 parts269
  • 2 layers40 × 38 mmShield, the printed circuit board in 3D

    Shield

    murexrobotics/electrical

    Highly integrated electronics design and printed circuit boards (PCBs) for the MATE ROV Competition. Attempt the impossible.

    32 parts192MIT
  • 2 layers47 × 39 mmQrss clock tx, the printed circuit board in 3D

    Qrss clock tx

    swharden/AVR-projects

    A collection of standalone AVR projects written in C

    32 parts184MIT
  • 2 layers30.9 × 63 mmStm32-io extend, the printed circuit board in 3D

    Stm32-io extend

    hardenedlinux/cheap-pcb

    Cheap PCB: Better understanding the current status of hardware supply chain

    32 parts170CC0-1.0