Skip to the content
2 layers250.2 × 84.2 mmGemini panel, the printed circuit board in 3D

Schematics, pcbs, layout files for all my keyboard projects

Size
250.2 × 84.2 mm
Copper layers
2
Thickness
1.6 mm
Parts
151
Nets
124
Pads
851
Tracks, vias
3,195, 242
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
8 May 2026
Updated
18 Aug 2026

Overview

Gemini panel is an open-source printed circuit board by thanoslabs, from the thanoslabs/keyboards repository on GitHub. It is a 2-layer board of 250.2 × 84.2 mm with 151 parts on 124 nets, routed with 3,195 tracks and 242 vias.

It is built around the 74AHCT1G125SE, 1N4148W and SK6812MINI-E, with the B5819W, MCP1700-3302E/TT and MCP23017-E/SO among its other parts. It belongs with the RP2040 boards of this library.

Main components

6

README

README.md

keyboards

Schematics, pcbs, layout files for all my keyboard projects

Structure

  • design/ — original keyboard designs, one folder per board with layout/ (KLE, keymap, VIA), pcb/ (KiCad), case/ (3DP CAD), and firmware/ (QMK/VIA builds) inside
    • gemini/ — split staggered 40% that docks into a regular 40%
  • commissions/ — VIA/layout files for boards built for others
  • docs/ — GitHub Pages site with interactive design docs, deployed by .github/workflows/pages.yml on every push to main that touches docs/ (one-time setup: Settings → Pages → Source → GitHub Actions)
  • tools/release/ — kb_release.py, the release bundler (see below)

Releases

Every merge to main that touches design/<board>/ publishes a GitHub release for that board: .github/workflows/release.yml. Each release is a manufacturing bundle — a self-contained snapshot of one version, so a fab house or a future me can build the board from a single download without checking out the repo:

  • layout/ — KLE, keymap, VIA
  • pcb/ — the KiCad projects, footprint library, placement CSVs, generators
  • pcb/fab/<project>-gerbers.zip — gerbers + Excellon drill, plotted by kicad-cli at build time; this is the file you upload to JLCPCB/PCBWay
  • pcb/fab/<project>-bom-jlc.csv, -cpl-jlc.csv — BOM and placement in JLCPCB's column format; -bom-pcbway.csv carries MPNs for PCBWay
  • pcb/fab/<project>-cpl.csv, -drc.json — KiCad's own placement export (everything else is derived from it) and the DRC report as built
  • ASSEMBLY.md — what gets machine-placed, what's fitted by hand, and the DFM checks to clear before ordering assembly
  • case/stl/, case/step/ — case pieces
  • firmware/ — QMK/VIA definitions and any built images
  • MANIFEST.json, SHA256SUMS, RELEASE.md

Some of that duplicates the repo, deliberately: a release pins each file to the version it was built with.

Versioning

Semver per keyboard, held as <board>-v<x.y.z> git tags — gemini-v0.2.1 is independent of any other board. First release of a board is 0.1.0.

HowBump
Merge to main touching design/<board>/patch
…with [minor] or [major] in a commit messageminor / major
…with [skip release] in a commit messagenone — run does nothing
Actions → Release keyboards → Run workflowpick the board, the bump level, or an exact x.y.z; dry_run builds and uploads the bundle as a workflow artifact without tagging or publishing

Building a bundle locally

text
python3 tools/release/kb_release.py bundle --board gemini --version 0.1.0
# → dist/gemini-v0.1.0/ and dist/gemini-v0.1.0.zip

Needs kicad-cli on PATH (or KICAD_CLI set) for the gerbers; pass --skip-pcb for a source-only bundle. Only files tracked by git go in, so venvs and KiCad backups never leak into a release.

Assembly (PCBA) files

The boards are script-generated and have no schematic, so the BOM can't come out of KiCad. design/<board>/pcb/parts.csv is the source of truth instead: one rule per part, matched against every footprint on the board at release time. A footprint that matches no rule fails the build rather than quietly vanishing from the BOM — which matters here, because the switch footprints carry keycap legends (T, Space) in their Value field and a naive value-based BOM would list 22 one-off parts instead of 43 sockets.

Rules also mark parts hand (the Pico, which sits on headers and can't be machine-placed) so they stay out of the BOM and CPL but still get written up in ASSEMBLY.md, and carry a per-part rotation offset for parts whose orientation in JLCPCB's library differs from the footprint's.

Parts

151
QtyValueFootprintReferences
431N4148WD_SOD-123L_D00, L_D01, L_D02, L_D03, L_D04, L_D05, L_D10, L_D11, L_D12, L_D13, L_D14, L_D15, L_D20, L_D21, L_D22, L_D23 +27
43SK6812MINI-ELED_SK6812MINI-E_3.2x2.8mm_P1.5mm_ReverseMountL_LED00, L_LED01, L_LED02, L_LED03, L_LED04, L_LED05, L_LED10, L_LED11, L_LED12, L_LED13, L_LED14, L_LED15, L_LED20, L_LED21, L_LED22, L_LED23 +27
21uFC_0603_1608MetricR_C2, R_C3
24k7R_0603_1608MetricL_R1, L_R2
25k1R_0603_1608MetricL_R3, L_R4
2AltSW_MX_HS_CPG151101S11_1.25uL_SW32, R_SW32
2CtrlSW_MX_HS_CPG151101S11_1.25uL_SW30, R_SW33
2Logo_GeminiLogo_GeminiL_G1, R_G1
2SpaceSW_MX_HS_CPG151101S11_1uL_SW33, R_SW30
2USB-C linkHRO-TYPE-C-31-M-12-AssemblyL_J1, R_J1
2stab 2.75uSTAB_MX_2.75uL_ST_SW33, R_ST_SW30
1,SW_MX_HS_CPG151101S11_1uR_SW22
1.SW_MX_HS_CPG151101S11_1uR_SW23
1100nFC_0603_1608MetricR_C1
174AHCT1G125SOT-23-5L_U2
1;SW_MX_HS_CPG151101S11_1uR_SW14
1ASW_MX_HS_CPG151101S11_1uL_SW11
1BSW_MX_HS_CPG151101S11_1uL_SW25
1B5819WD_SOD-123L_DV1
1BkspSW_MX_HS_CPG151101S11_1.5uR_SW05
1CSW_MX_HS_CPG151101S11_1uL_SW23
1DSW_MX_HS_CPG151101S11_1uL_SW13
1ESW_MX_HS_CPG151101S11_1uL_SW03
1EnterSW_MX_HS_CPG151101S11_1.25uR_SW15
1Esc/CtrlSW_MX_HS_CPG151101S11_1.5uL_SW10
1FSW_MX_HS_CPG151101S11_1uL_SW14
1FnSW_MX_HS_CPG151101S11_1.25uR_SW31
1GSW_MX_HS_CPG151101S11_1uL_SW15
1GUISW_MX_HS_CPG151101S11_1uL_SW31
1HSW_MX_HS_CPG151101S11_1uR_SW10
1ISW_MX_HS_CPG151101S11_1uR_SW02
1JSW_MX_HS_CPG151101S11_1uR_SW11
1KSW_MX_HS_CPG151101S11_1uR_SW12
1LSW_MX_HS_CPG151101S11_1uR_SW13
1MSW_MX_HS_CPG151101S11_1uR_SW21
1MCP1700-3302SOT-23R_U2
1MCP23017-E/SOSOIC-28W_7.5x17.9mm_P1.27mmR_U1
1NSW_MX_HS_CPG151101S11_1uR_SW20
1OSW_MX_HS_CPG151101S11_1uR_SW03
1PSW_MX_HS_CPG151101S11_1uR_SW04
1QSW_MX_HS_CPG151101S11_1uL_SW01
1RSW_MX_HS_CPG151101S11_1uL_SW04
1Raspberry Pi PicoRPi_Pico_SMD_THL_U1
1SSW_MX_HS_CPG151101S11_1uL_SW12
1ShiftSW_MX_HS_CPG151101S11_1.75uL_SW20
1ShiftSW_MX_HS_CPG151101S11_1uR_SW24
1TSW_MX_HS_CPG151101S11_1uL_SW05
1TabSW_MX_HS_CPG151101S11_1.25uL_SW00
1USW_MX_HS_CPG151101S11_1uR_SW01
1USB-C hostHRO-TYPE-C-31-M-12-AssemblyL_J2
1USB_DMTestPoint_THTPad_D1.5mm_Drill0.7mmL_TP2
1USB_DPTestPoint_THTPad_D1.5mm_Drill0.7mmL_TP1
1VSW_MX_HS_CPG151101S11_1uL_SW24
1WSW_MX_HS_CPG151101S11_1uL_SW02
1XSW_MX_HS_CPG151101S11_1uL_SW22
1YSW_MX_HS_CPG151101S11_1uR_SW00
1ZSW_MX_HS_CPG151101S11_1uL_SW21
1stab 2.0uSTAB_MX_2uR_ST_SW24

More from thanoslabs/keyboards

2
  • 2 layers127.1 × 84.2 mmGemini left, the printed circuit board in 3D

    Gemini left

    thanoslabs/keyboards

    Schematics, pcbs, layout files for all my keyboard projects

    79 parts
  • 2 layers123.1 × 84.2 mmGemini right, the printed circuit board in 3D

    Gemini right

    thanoslabs/keyboards

    Schematics, pcbs, layout files for all my keyboard projects

    72 parts

Similar boards

  • 2 layers134.8 × 132 mm5x5 Matrix, the printed circuit board in 3D

    5x5 Matrix

    Charles-D-FPU/Lights-out-Matrix

    WIP

    110 parts
  • 2 layers135 × 90 mmCable tester, the printed circuit board in 3D

    Cable tester

    Mykola2/uart-cable-tester

    design.py is the single source of truth: parts, footprints, pin-to-net map and positions. Everything else is generated from it.

    66 parts
  • 2 layers118 × 118 mmInput main, the printed circuit board in 3D

    Input main

    hdh7485/agent-deck

    Physical AI agent controller for Codex, Hermes, OMX, and tmux workflows

    74 parts
  • 2 layers162 × 82 mmAhm panel placed, the printed circuit board in 3D

    Ahm panel placed

    kimaernoudt/custom-ahm-wallpanel

    One board that replaces the hand wiring: the 4 encoders, the 4 scene buttons, all 48 ring LEDs, 4 button LEDs and the MCP23017 sit on it. One 10-wire UEXT cable and one 2-wire 5 V cable go to the Olimex ESP32-POE.

    78 parts
  • 4 layers353.7 × 129.8 mmTokenBoard, the printed circuit board in 3D

    TokenBoard

    h3ll5ur7er/TokenBoard

    You wouldn't vibe code a keyboard.. or would you? uses konnect to interact with KiCad and CADence to model the case

    422 parts
  • 2 layers446.9 × 141.7 mmPerson keyboard, the printed circuit board in 3D

    Person keyboard

    jtljac/person-keyboard

    My personal Keyboard Design

    374 parts
  • 2 layers308.8 × 99.3 mmHem, the printed circuit board in 3D

    Hem

    marcocampione/Hem-keyboard

    A 65% ANSI keyboard PCB with an RP2040 on the board

    302 partsMIT

Questions

How big is the Gemini panel PCB?

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

What parts does the Gemini panel use?

151 parts, built around the 74AHCT1G125SE, 1N4148W, SK6812MINI-E and B5819W. 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 Gemini panel KiCad files?

From the thanoslabs/keyboards repository on GitHub, at the commit this page was made from: the board is design/gemini/pcb/gemini-panel/gemini-panel.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Gemini panel design in my own project?

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