

A7s backplane v2
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
1README
backplane/kicad/pipeline/README.mdHow 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_pcbbuild output,_place,_hdrfix,_v2+ its.dsn/.ses) and the_rendersource board are archived in../../v1/kicad/to keepkicad/to the v2 deliverable. The scripts below use thekicad/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
| Tool | How it's run | For |
|---|---|---|
| pcbnew (KiCad 10 Python) | tools/kpython <script> (sets PYTHONPATH/KICAD_FP/KICAD_SYM from the nix store) | all board edits |
| kicad-cli | on $PATH | DRC, gerbers, drill, renders, sch export |
| freerouting 2.2.4 | freerouting on $PATH | autorouting |
| SKiDL 2.2.3 | docker run --rm -e HOME=/tmp -v "$PWD":/work -w /work a7s-skidl python3 … | netlist |
| kiutils (pip) | in a venv, with KICAD_SYM set | generating 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.
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.
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_pcbGotchas (each cost real time)
- freerouting only routes when launched FOREGROUND.
nohup/background dies silently. It went 96 → 0 unrouted in ~30 s foreground. ImportSpecctraSESsilently 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, sopgrep -x pcbnewfalse-negatives — matchbin/pcbnew. Launch withnohup 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 isface; unit sub-symbols must bePart(kiutils appends_unitId_styleId), no lib prefix on units. SKiDL's owngenerate_schematic()is broken. - Do not re-run
build_pcb.pyon a placed/routed board — it emits a rough placed-but-unrouted board and discards the hand-placement + routing.
Parts
26| Qty | Value | Footprint | References |
|---|---|---|---|
| 4 | MountingHole_2.7mm_M2.5 | MountingHole_2.7mm_M2.5 | H1, H2, H3, H4 |
| 4 | SW_Push | SW_PUSH_6mm | SW1, SW2, SW3, SW4 |
| 2 | 0.1uF | C_Disc_D5.0mm_W2.5mm_P5.00mm | C1, C2 |
| 2 | Conn_01x01 | Pin_D1.0mm_L10.0mm | J5b, J6b |
| 2 | Conn_02x04_Odd_Even | PinSocket_2x04_P2.54mm_Vertical | J5, J6 |
| 2 | MF-R050 0.5A | Fuse_Bourns_MF-RG300 | F1, F2 |
| 2 | TestPoint | TestPoint_Pad_D1.0mm | TP1, TP2 |
| 1 | BTN5_6 | PinHeader_1x03_P2.54mm_Vertical | J11 |
| 1 | Conn_01x14 | TFT_2p8 | J3 |
| 1 | Conn_01x15 | PinSocket_1x15_P2.54mm_Vertical | J2 |
| 1 | Conn_02x15_Odd_Even | PinSocket_2x15_P2.54mm_Vertical | J1 |
| 1 | ENC | PinHeader_1x04_P2.54mm_Vertical | J10 |
| 1 | FLIPPER | FLIPPER-GPIO-18 | J12 |
| 1 | JOY | PinHeader_1x05_P2.54mm_Vertical | J8 |
| 1 | RP2040-Zero | RP2040_Zero | A1 |
Similar boards
- 2 layers132.3 × 94.9 mm

- 2 layers321 × 92.3 mm

- 2 layers255.9 × 99.3 mm

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 mm

- 2 layers54 × 64 mm

DonConIOmini
ravinrabbid/DonCon2040
RP2040 based firmware and hardware for DIY Taiko no Tatsujin Drum Controllers
96 parts66MIT - 2 layers52 × 50 mm

RP2040-TestPatternGenerator VGA
nmur/RP2040-TestPatternGenerator
A simple test pattern generator running on the RP2040 microcontroller
12 parts64GPL-3.0 - 2 layers120 × 40 mm

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 mm

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.