

Keyboard
Ergogen keyboard project (KiCad 8) with local preview/edit app
- Size
- 141 × 130.1 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 70
- Nets
- 53
- Pads
- 344
- Tracks, vias
- 894, 75
- Pours
- 2
- Routed
- Yes
- KiCad
- KiCad 10.0 (file 20260206)
- Created
- 16 Aug 2026
- Updated
- 26 Aug 2026
Overview
Keyboard is an open-source printed circuit board by heyjva, from the heyjva/ergogen-keyboard repository on GitHub. It is a 2-layer board of 141 × 130.1 mm with 70 parts on 53 nets, routed with 894 tracks and 75 vias.
Its parts include 30 diodes and 29 switches. It belongs with the keyboards and input boards of this library.
README
README.mdergogen-keyboard
Ergogen keyboard project, migrated to KiCad 8 with a local preview/edit app.
This repo contains the full keyboard definition: a split ergo board with a
matrix, thumb cluster, rotary encoder and its own nice!nano controller per
half. It is a wireless split (independent MCU on each half, e.g. ZMK).
The numpad that used to live in the old heyjva/ergogen fork is not part of
this repo.
Split layout: left + right
One config.yaml generates both halves as separate PCBs via ergogen's
mirror:
- The
points.zones.main/thumbzones carry amirror:block, so ergogen emitsmirror_*points for the right half. pcbs.main_leftselects source points (where: -/mirror_/);pcbs.main_rightselects mirror points (where: /mirror_/) and anchors positioned footprints tomirror_main_*refs.- The right half's side-actuated power/reset switches get
+180°rotation so their actuators face the mirrored board edge. - Both halves share the same net names (P11..P21, P2, etc.). That is safe because they are separate PCBs / separate MCUs — the nets never physically connect across boards.
Ergogen writes output/pcbs/main_left.kicad_pcb and
output/pcbs/main_right.kicad_pcb. The KiCad projects live in:
| Path | Description |
|---|---|
kicad/left/ | Left half KiCad project. Fully routed + DRC-clean (JLCPCB rules). |
kicad/right/ | Right half KiCad project (mirror image). Generated, not yet routed. |
kicad/3d_models/ | Shared STEP/WRL 3D models (symlinked into each half). |
Build/regenerate a half's KiCad project from ergogen output:
node <ergogen> . -o output # regenerate both PCBs
./kicad/build_kicad_project.sh right # (re)build the right-half project
# ./kicad/build_kicad_project.sh left # WARNING: wipes the routed left PCBContents
| Path | Description |
|---|---|
config.yaml | Ergogen definition (KiCad 8, Back-side hotswap, mirrored split). |
key.json | Original KLE source, kept for reference. |
footprints/ceoloide/ | Vendored KiCad 8 footprints used by the board. |
output/ | Generated output (DXF outlines + main_left/main_right PCBs). |
Footprints (KiCad 8)
The board uses these footprints from
ceoloide/ergogen-footprints,
vendored under footprints/ceoloide/:
switch_choc_v1_v2— Kailh Choc hotswap switchesdiode_tht_sod123— per-key diodesmcu_nice_nano— nice!nano controllerencoder_evqwgd001— Panasonic EVQWGD001 rotary encoderbattery_connector_jst_ph_2,power_switch_smd_side,reset_switch_smd_side,mounting_hole_plated
Keys/diodes/MCU/encoder are on the Back (B) side; the side-actuated
power/reset switches are on the Front (F). Each half is non-reversible on
its own; the split mirror is what produces the right half.
Wiring notes (important for firmware)
The matrix uses 7 columns and 4 rows:
- Columns:
P21 P20 P19 P18 P17 P16 P15 - Rows:
P14 P13 P12 P11
The nice!nano does not break out physical pins named P11, P12, P13,
or P17. In config.yaml those logical nets are therefore routed onto spare
physical nice!nano pins, and the nice!view SPI signals are assigned as follows:
| Logical net | Physical nice!nano pin |
|---|---|
P17 (index column) | P4 |
P13 (home row) | P5 |
P12 (top row) | P6 |
P11 (num row) | P7 |
MOSI (display) | P8 |
SCK (display) | P9 |
CS (display) | P3 |
The remaining matrix nets (P21 P20 P19 P18 P16 P15 P14) map 1:1 to the
same-named physical pins. Update your firmware pin map to match the physical
pins above. (In the original fork these four nets were never connected to the
MCU — this project fixes that.)
3D models
The footprints are wired to reference 3D models but the model asset files are
not included here. To see 3D renders in KiCad, drop the appropriate .step /
.wrl files into models/ and point the footprints' *_3dmodel_filename
params at them. 3D models do not render in the browser preview — only in
KiCad.
Previewing & editing locally
The preview/edit app is a patched fork of
ceoloide/ergogen-gui at
heyjva/ergogen-gui. It runs a local
web server and, unlike the stock GUI, includes a "Save to File" button that
writes changes straight back to this repo's config.yaml — and it works in
Firefox / Zen.
One-time setup
# clone both repos as siblings
git clone https://github.com/heyjva/ergogen-keyboard.git
git clone https://github.com/heyjva/ergogen-gui.git
cd ergogen-gui
npm install -g pnpm # if you don't have pnpm
PNPM_CONFIG_BLOCK_EXOTIC_SUBDEPS=false \
ERGOGEN_VERSION=github:ceoloide/ergogen#v4.3.0 \
pnpm install --no-frozen-lockfileRun it
cd ergogen-gui
./start.shThis launches:
- a tiny save-helper on
http://localhost:3001(writesconfig.yaml), and - the GUI on
http://localhost:3000.
Open http://localhost:3000 in Firefox / Zen. The editor auto-loads this
repo's config.yaml. Edit it, then click Save to File (or press
Ctrl/Cmd+S) to write your changes back to config.yaml on disk. Commit with
git as usual.
The save-helper is required because Firefox cannot write local files directly from a web page. It binds to
127.0.0.1only and only ever writes this repo'sconfig.yaml.
If you keep the repos somewhere other than as siblings, point the helper at the file explicitly:
CONFIG_PATH=/absolute/path/to/ergogen-keyboard/config.yaml ./start.shRegenerating outputs from the command line
The GUI is for previewing/editing. To regenerate the DXF/KiCad files on disk
from config.yaml, run Ergogen v4.3.0 against this folder:
# from a checkout of ceoloide/ergogen at branch v4.3.0
node /path/to/ergogen/src/cli.js . -o outputThis reads config.yaml + footprints/ and writes output/.
Complete KiCad project (schematic + PCB)
Ergogen only produces a .kicad_pcb (footprints + net connectivity, no
schematic). The kicad/ folder contains a complete, openable KiCad project
generated from that PCB:
| File | Description |
|---|---|
kicad/keyboard.kicad_pro | KiCad project file (open this) |
kicad/keyboard.kicad_pcb | The PCB (copy of output/pcbs/main.kicad_pcb) |
kicad/keyboard.kicad_sch | Generated schematic |
kicad/keyboard-schematic.pdf | Rendered schematic (preview) |
kicad/gen_schematic.py | Schematic generator (uses KiCad's pcbnew) |
kicad/build_kicad_project.sh | Regenerates the whole project |
Open kicad/keyboard.kicad_pro in KiCad.
About the schematic
The schematic is generated from the PCB's netlist (KiCad has no built-in PCB→schematic reverse). Each component is a real symbol laid out on a grid, and connectivity is expressed with global net labels on each pin (the standard approach for auto-generated keyboard schematics). It's electrically correct and ERC-readable, but laid out on a grid rather than hand-drawn — useful for verification, BOM, and reference, not a pretty hand-routed diagram.
Regenerating the KiCad project
Requires KiCad installed (pcbnew python module + kicad-cli):
# after regenerating output/ with ergogen:
./kicad/build_kicad_project.shNotes / expected DRC warnings
- Unconnected items: the PCB has nets but no routed traces (ergogen doesn't route) — route in KiCad. Not an error.
invalid_outlinefrom ENC1: the EVQWGD001 encoder footprint adds an Edge.Cuts roller cutout that reads as a secondary open contour. Harmless for the design; clean it up in KiCad's Edge.Cuts if desired.- lib_footprint / lib_symbol warnings: footprints are embedded in the PCB and standard KiCad symbol libs are used; these "library not in config" warnings are cosmetic.
JLCPCB design rules
The project is pre-configured for JLCPCB's standard 2-layer, 1oz FR-4 process (their cheapest tier), so DRC catches anything they can't make:
- Numeric constraints live in
kicad/keyboard.kicad_pro(board.design_settings.rules): min track/clearance 0.1 mm, min via 0.45 mm / 0.3 mm drill, min PTH drill 0.3 mm, min hole-to-hole 0.5 mm, min copper-to-edge 0.2 mm, min silk text 1.0 mm. These are JLCPCB's true standard-process minimums for 1oz 2-layer. - The auto-router routes down to these limits (0.1 mm track/space, 0.1 mm hole-to-copper). That is manufacturable at JLCPCB but leaves little margin; the default net class uses a more comfortable 0.25 mm track / 0.1 mm space.
- JLC-specific checks (annular ring, edge clearance, hole-to-hole, silk
width/height, silk-to-pad, SMD pad clearance) are in
kicad/keyboard.kicad_dru. Note the via annular-ring rule is 0.05 mm: 0.45 mm-via/0.3 mm-hole is a standard no-extra-cost JLC via; the 0.13 mm annular guideline applies to component PTH pads, not tented vias. - These files are not overwritten by
build_kicad_project.sh(which only regenerates the.kicad_pcb/.kicad_sch), so the rules persist across rebuilds. The router's "Fix DRC settings after routing" option WILL rewrite the.kicad_proconstraints, so re-check them after routing. - Source: https://jlcpcb.com/capabilities/pcb-capabilities
Run a rules check any time with:
kicad-cli pcb drc kicad/keyboard.kicad_pcb --severity-errorParts
70| Qty | Value | Footprint | References |
|---|---|---|---|
| 30 | ceoloide:diode_tht_sod123 | D1, D2, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23 +14 | |
| 29 | ceoloide:switch_choc_v1_v2 | S1, S2, S10, S11, S12, S13, S14, S15, S16, S17, S18, S19, S20, S21, S22, S23 +13 | |
| 6 | ceoloide:mounting_hole_plated | H1, H2, H3, H4, H5, H6 | |
| 1 | ceoloide:power_switch_smd_side | PWR1 | |
| 1 | ceoloide:reset_switch_smd_side | RST1 | |
| 1 | ceoloide:mcu_nice_nano | MCU1 | |
| 1 | ceoloide:encoder_evqwgd001 | ENC1 | |
| 1 | ceoloide:battery_connector_jst_ph_2 | JST1 |
Questions
How big is the Keyboard PCB?
It measures 141 × 130.1 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Keyboard use?
70 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 Keyboard KiCad files?
From the heyjva/ergogen-keyboard repository on GitHub, at the commit this page was made from: the board is kicad/left/keyboard.kicad_pcb and its schematic kicad/left/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 heyjva before reusing the design.
Similar boards
- 2 layers61.8 × 73.2 mm

- 2 layers47.3 × 52.8 mm

- 2 layers74.3 × 52.8 mm

- 2 layers141 × 88 mm

ErgoSNM Keyboard Right Prototype 1
siderakb/ergo-snm-keyboard
ErgoSNM is a split ergonomic keyboard integrated with trackball, wireless is in beta
70 parts172CERN-OHL-P-2.0 - 2 layers38.1 × 101.6 mm

- 2 layers90 × 100 mm

- 2 layers90 × 140 mm

Drumkid
mattybrad/drumkid
Version 4 was the first successful working design, with full code, schematics, Gerbers, etc available on GitHub.
70 parts137 - 2 layers152.5 × 117.5 mm

Keytartouch
cnlohr/cnhardware
My dumping grounds for all my kicad projects and random hardware bringup.
70 parts114