Skip to the content
2 layers86.2 × 74.1 mmA7s backplane v2, the printed circuit board in 3D

A7s backplane v2

skitzo2000/cyberdecks18

Cyberdeck component research — 2026 buyer's guides for compute, displays, input, power, networking/radio, and chassis.

Size
86.2 × 74.1 mm
Copper layers
2
Thickness
1.6 mm
Parts
26
Nets
47
Pads
160
Tracks, vias
0, 0
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
20 May 2026
Updated
12 Jul 2026

Overview

A7s backplane v2 is an open-source printed circuit board by skitzo2000, from the skitzo2000/cyberdecks repository on GitHub. It is a 2-layer board of 86.2 × 74.1 mm with 26 parts on 47 nets.

It is built around the RP2040-ZERO. Its parts include 11 connectors, 4 switches, 2 capacitors and 2 fuses. It belongs with the RP2040 boards of this library.

Main components

1

README

backplane/kicad/pipeline/README.md

How the v2 board was made (reproducible pipeline)

This documents exactly how kicad/a7s_backplane_routed.kicad_pcb (the current v2 board) was produced, so it can be reproduced or audited. The one-off scripts for each step are in scripts/.

The intermediate boards these steps produced (a7s_backplane.kicad_pcb build output, _place, _hdrfix, _v2 + its .dsn/.ses) and the _render source board are archived in ../../v1/kicad/ to keep kicad/ to the v2 deliverable. The scripts below use the kicad/ paths as originally run — point them at ../../v1/kicad/ (or regenerate) to reproduce.

Key fact: v2 was not built fresh from build_pcb.py. Its auto-placement is a rough netlist dump (parts off-board, everything overlapping). The usable placement was always hand-done in KiCad. So v2 started from the previous routed board (v1/kicad/a7s_backplane_render.kicad_pcb) and was corrected + re-placed + re-routed. build_pcb.py was only used for the header-orientation fix logic and stays the netlist→initial-placement generator.

Toolchain

ToolHow it's runFor
pcbnew (KiCad 10 Python)tools/kpython <script> (sets PYTHONPATH/KICAD_FP/KICAD_SYM from the nix store)all board edits
kicad-clion $PATHDRC, gerbers, drill, renders, sch export
freerouting 2.2.4freerouting on $PATHautorouting
SKiDL 2.2.3docker run --rm -e HOME=/tmp -v "$PWD":/work -w /work a7s-skidl python3 …netlist
kiutils (pip)in a venv, with KICAD_SYM setgenerating the .kicad_sch

The pipeline (in order)

Run each scripts/NN_*.py with tools/kpython unless noted. Filenames are hardcoded in the scripts — read the top of each before running.

0. Netlist (only if connectivity changed). docker run … a7s-skidl python3 a7s_backplane_skidl.py → a7s_backplane.net. The netlist is the connectivity source of truth for every step below.

1. Fix the header mate + make a clean placement canvas — scripts/01_fix_headers_zero_net.py Loads the render board; re-orients J1 → north / J2 → south, centered between their mounting holes, mirrored E-W (the DOA-shorting bug fix); strips all tracks and zeroes all pad nets so you can place freely without a ratsnest. Verifies J1-pin1 aligns E-W with J2-pin15 and that the headers clear the mounting holes.

2. Group logical assemblies — scripts/02a_group_assemblies.py then scripts/02b_group_singles.py Puts each logical unit in a KiCad PCB_GROUP (A7S = J1+J2+H1–H4, RP2040, TFT, BUTTONS, RADIO1/2, JOY, ENC, BTN, each cap/fuse/TP) so a click drags the whole part. Do NOT lock footprints instead — locked footprints become click-through (you select the pad, not the part).

3. Overlay the A7S body + ports as a placement reference — scripts/03_overlay_a7s_ref.py Draws the A7S PCB outline + ETH/USB ports on Dwgs.User, mapped through the 4 mounting holes, and prints the ethernet-edge vs PCB-edge gap. Used to align the A7S 1.75 mm west so the RJ45 edge meets the board edge. (Overlay is removed before fab.)

4. Hand-place in pcbnew. Open the board, drag the groups where they go (arrow keys / M / Ctrl-M "Move Exactly" for precise nudges), save.

5. Re-apply the nets — scripts/04_reapply_nets.py Copies connectivity from the render board back onto the placed board by (ref, pin) — position-independent, so it doesn't matter where parts moved. Writes a7s_backplane_v2.kicad_pcb.

6. Export DSN → route → import SES.

sh
tools/kpython -c "import pcbnew;b=pcbnew.LoadBoard('kicad/a7s_backplane_v2.kicad_pcb');pcbnew.ExportSpecctraDSN(b,'kicad/a7s_backplane_v2.dsn')"
freerouting -de kicad/a7s_backplane_v2.dsn -do kicad/a7s_backplane_v2.ses -mp 15    # MUST be foreground
tools/kpython -c "import pcbnew;b=pcbnew.LoadBoard('kicad/a7s_backplane_v2.kicad_pcb');pcbnew.ImportSpecctraSES(b,'kicad/a7s_backplane_v2.ses');pcbnew.SaveBoard('kicad/a7s_backplane_routed.kicad_pcb',b)"

7. Restore the board outline — scripts/07_restore_edge_cuts.py ImportSpecctraSES silently drops Edge.Cuts segments; this re-adds the south + west edges to close the rectangle. Always re-verify the outline after a route round-trip.

8. Silkscreen labels — scripts/08_silk_labels.py Adds a net/function label tight to every pin (Flipper-header style: ~1.5 mm off the pad, 0.8 mm font), grounds ringed. Back-side parts on B.SilkS (mirrored), TFT on F.SilkS. Single-column connectors label to the interior side; button rows label above.

8b. Credits + easter-egg silkscreen — scripts/08b_silk_credits.py Adds the v2 free-text silk: title/designer block (back, right of the RP2040), special-thanks block (back, left of the RP2040), Flipper-footprint credit (back, behind J12 — the front strip under the J12 pin labels is occupied, the labels are rotated vertical), brand/rev line + HACK THE PLANET (front bottom edge, the visible strip below the buttons), RIP REV 1 memorial (back, between the fuses and J2). All back text is SetMirrored(True). Verified zero new DRC violations vs. the pre-credits baseline.

8c. Logo footprints (silkscreen art) — scripts/08c_logo_footprints.py Traced into a7s.pretty: Amnesia Labs brain (AMNESIA_BRAIN_W20 20×17.4 mm / _W12 12×10.4 mm) and DEF CON 34 jack (DC34_JACK_W30 30 mm / _W20 20 mm — 20 mm is the floor for that art). Full magick/potrace recipes in the script header. pcbnew's Import Graphics crashes on complex SVGs — always use this offline bitmap→potrace→footprint route. fp_poly keeps only ONE outline per shape — emit one PCB_SHAPE per fractured outline or disjoint islands silently vanish on save.

9. Schematic (.kicad_sch) — scripts/09_gen_schematic.py (a copy of tools/gen_kicad_schematic.py) Generates the editable a7s_backplane.kicad_sch from the netlist with kiutils: every component as its stock symbol (RP2040 as a custom box), a global net-label on a wire stub off each pin. Needs the kiutils venv + KICAD_SYM.

10. DRC + fab + renders.

sh
kicad-cli pcb drc --format json --severity-error --severity-warning -o drc.json kicad/a7s_backplane_routed.kicad_pcb
kicad-cli pcb export gerbers -o kicad/fab_v2/ kicad/a7s_backplane_routed.kicad_pcb
kicad-cli pcb export drill --format excellon --excellon-separate-th -o kicad/fab_v2/ kicad/a7s_backplane_routed.kicad_pcb
kicad-cli pcb render --side top    --quality high -o kicad/renders/routed_top.png    kicad/a7s_backplane_routed.kicad_pcb
kicad-cli pcb render --side bottom --quality high -o kicad/renders/routed_bottom.png kicad/a7s_backplane_routed.kicad_pcb

Gotchas (each cost real time)

  • freerouting only routes when launched FOREGROUND. nohup/background dies silently. It went 96 → 0 unrouted in ~30 s foreground.
  • ImportSpecctraSES silently drops Edge.Cuts — re-run step 7 and check the outline is closed.
  • Never lock footprints for hand-placement — locked = click-through (grabs the pad, not the part). Use PCB_GROUPs (step 2).
  • pcbnew's process name is the full nix path, so pgrep -x pcbnew false-negatives — match bin/pcbnew. Launch with nohup pcbnew <file> &.
  • DRC courtyard "errors" are benign — the TFT (J3) footprint courtyard is the whole floating display, so every part beneath it flags pth_inside_courtyard. Not collisions.
  • kiutils quirks (schematic gen): Font(height=,width=) — the 1st positional arg is face; unit sub-symbols must be Part (kiutils appends _unitId_styleId), no lib prefix on units. SKiDL's own generate_schematic() is broken.
  • Do not re-run build_pcb.py on a placed/routed board — it emits a rough placed-but-unrouted board and discards the hand-placement + routing.

Parts

26
QtyValueFootprintReferences
4MountingHole_2.7mm_M2.5MountingHole_2.7mm_M2.5H1, H2, H3, H4
4SW_PushSW_PUSH_6mmSW1, SW2, SW3, SW4
20.1uFC_Disc_D5.0mm_W2.5mm_P5.00mmC1, C2
2Conn_01x01Pin_D1.0mm_L10.0mmJ5b, J6b
2Conn_02x04_Odd_EvenPinSocket_2x04_P2.54mm_VerticalJ5, J6
2MF-R050 0.5AFuse_Bourns_MF-RG300F1, F2
2TestPointTestPoint_Pad_D1.0mmTP1, TP2
1BTN5_6PinHeader_1x03_P2.54mm_VerticalJ11
1Conn_01x14TFT_2p8J3
1Conn_01x15PinSocket_1x15_P2.54mm_VerticalJ2
1Conn_02x15_Odd_EvenPinSocket_2x15_P2.54mm_VerticalJ1
1ENCPinHeader_1x04_P2.54mm_VerticalJ10
1FLIPPERFLIPPER-GPIO-18J12
1JOYPinHeader_1x05_P2.54mm_VerticalJ8
1RP2040-ZeroRP2040_ZeroA1

Similar boards

  • 2 layers132.3 × 94.9 mmCheapino, the printed circuit board in 3D

    Cheapino

    tompi/cheapino

    An affordable split 36 keys keyboard

    59 parts1.2kCC-BY-4.0
  • 2 layers321 × 92.3 mmMx40, the printed circuit board in 3D

    Mx40

    zzeneg/stront

    Split keyboards with 38 or 40 keys, LCD display and Cirque trackpad

    181 parts353MIT
  • 2 layers255.9 × 99.3 mmZerosprey42, the printed circuit board in 3D

    Zerosprey42

    beekeeb/zerosprey42

    Zerosprey42 Keyboard is a wired, beginner friendly, choc hotswap, MonoBlockSplit (Unibody), column-staggered, DIY mechanical keyboard.

    96 parts140
  • 2 layers146.3 × 69.5 mmStress, the printed circuit board in 3D

    Stress

    GroooveBob/Stress

    Pocket Arcade Fight Pad

    22 parts102MIT
  • 2 layers54 × 64 mmDonConIOmini, the printed circuit board in 3D

    DonConIOmini

    ravinrabbid/DonCon2040

    RP2040 based firmware and hardware for DIY Taiko no Tatsujin Drum Controllers

    96 parts66MIT
  • 2 layers52 × 50 mmRP2040-TestPatternGenerator VGA, the printed circuit board in 3D

    RP2040-TestPatternGenerator VGA

    nmur/RP2040-TestPatternGenerator

    A simple test pattern generator running on the RP2040 microcontroller

    12 parts64GPL-3.0
  • 2 layers120 × 40 mmBuinchiez40, the printed circuit board in 3D

    Buinchiez40

    ChrisChrisLoLo/bunchiez40

    A pocket keyboard that makes use of mouse switches to achieve a miniscule size

    90 parts56GPL-3.0
  • 2 layers305.2 × 76.2 mmSoroka, the printed circuit board in 3D

    Soroka

    kapee1/soroka

    40% DIY-keyboard with base kit support

    126 parts47Unlicense

Questions

How big is the A7s backplane v2 PCB?

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

What parts does the A7s backplane v2 use?

26 parts, built around the RP2040-ZERO. 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 A7s backplane v2 KiCad files?

From the skitzo2000/cyberdecks repository on GitHub, at the commit this page was made from: the board is backplane/kicad/pipeline/a7s_backplane_v2.kicad_pcb and its schematic backplane/a7s_backplane.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the A7s backplane v2 design in my own project?

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