

Mad RP2040
Fast, trustworthy PCB visual and geometric diff tool (Rust). Successor to gerber-diff.
- Size
- 77.2 × 86.4 mm
- Copper layers
- 4
- Thickness
- 1.2 mm
- Parts
- 117
- Nets
- 105
- Pads
- 470
- Tracks, vias
- 952, 218
- Pours
- 7
- Routed
- Yes
- KiCad
- KiCad 9.0 (file 20241229)
- Created
- 14 Jun 2026
- Updated
- 6 Nov 2026
Overview
Mad RP2040 is an open-source printed circuit board by Cimos, from the Cimos/etchy repository on GitHub, published under the Apache-2.0 licence. It is a 4-layer board of 77.2 × 86.4 mm with 117 parts on 105 nets, routed with 952 tracks and 218 vias.
It is built around the SC0914(13), W25Q128JVSIQ and ECMF02-2AMX6, with the NCP1117LPST33T3G-MS, 1N4148W and SK6812MINI-E among its other parts. Its parts include 38 diodes, 22 capacitors, 17 switches, 14 resistors and 5 ICs. It belongs with the RP2040 boards of this library.
Main components
12SC0914(13)
QFN-56(7x7)-40℃~+85℃@(TC) 1.8V~3.3V 12bit 133MHz 264KB 30 32 Bit ARM Cortex-M0+ Built-in+External External QFN-56(7x7) Microcontrollers (MCU/MPU/SOC) ROHSRaspberry PiMicrocontrollers (MCU/MPU/SOC)W25Q128JVSIQ
SOIC-8-208mil-40℃~+85℃ 100,000 cycles 120ms@(32KB) 128Mbit 133MHz 1uA 2.7V~3.6V 20 Years 3ms Power-on reset、Hardware write protection、Software write protection、Write enable latch、Absolute write protection SPI SOIC-8-208mil NOR FLASH ROHSWinbondNOR FLASHECMF02-2AMX6
UFQFN-6(1.5x1.7)-40℃~+85℃ 2 2.5Ω 200mA UFQFN-6(1.5x1.7) Common Mode Filters ROHSSTMicroelectronicsCommon Mode FiltersNCP1117LPST33T3G-MS
SOT-223-20℃~+125℃@(Ta) 1 1.4V@(1A) 12mA 15V 1A 3.235V~3.365V Fixed Positive SOT-223 Voltage Regulators - Linear, Low Drop Out (LDO) Regulators ROHSMSKSEMIVoltage Regulators - Linear, Low Drop Out (LDO) Regulators1N4148W
SOD-123150mA 1A 1V@50mA 1uA@75V 400mW 4ns 75V Independent SOD-123 Switching Diodes ROHSSTMicroelectronicsSwitching DiodesSK6812MINI-E
SMD-40℃~+85℃ 0.6mA 1.78mm 120mcd~240mcd 120° 160mcd~320mcd 1kHz 2.8mm 2000V 3.2mm 3.7V~5.5V 460nm~470nm 515nm~525nm 620nm~625nm 800Kbit/s 815mcd~1275mcd Semi-transparent lens SMD RGB LEDs(Built-in IC) ROHSOPSCO OptoelectronicsRGB LEDs(Built-In IC)CC0603KPX7R9BB104
0603100nF 50V X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHSYAGEOMultilayer Ceramic Capacitors MLCC - SMD/SMTCPG151101S11
SMDSMD Mechanical Keyboard Shaft ROHSKailhMechanical Keyboard ShaftCC0805KKX5R8BB106
080510uF 25V X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHSYAGEOMultilayer Ceramic Capacitors MLCC - SMD/SMTRC0603FR-0710KL
UncategorisedUnknown makerRC0603FR-071KL
UncategorisedUnknown makerCC0603KRX5R8BB105
06031uF 25V X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHSYAGEOMultilayer Ceramic Capacitors MLCC - SMD/SMT
README
README.md
etchy
Status: v0.1 — usable. Diffs real Gerber + Excellon fab packs across the CLI, a native desktop viewer, and a web viewer, with prebuilt binaries and a distroless container. The Python predecessor is frozen at Cimos/Gerber-Diff-Tool (v0.11).
etchy is a fast, trustworthy, open-source PCB visual + geometric diff tool. Point it at two revisions of a board's fab output and it shows — and measures — exactly what changed.
Quickstart
etchy old/ new/ # terminal summary; exit 0 = no diff, 1 = diff, 2 = error
etchy old/ new/ --html diff.html # a single self-contained HTML report
etchy old/ new/ --svg out/ # one SVG overlay per changed layer
etchy old/ new/ --format json # machine-readable magnitudes (schema v1)Try it right now — the repo ships two revisions of a real board (the open Mad_RP2040, Gerbers + Excellon drills):
etchy crates/etchy-gui/assets/demo/old crates/etchy-gui/assets/demo/new --html diff.html
# 10 of 13 layers changed; +213.29638 / -448.70036 mm² (967+/863- regions)
# Open diff.html to see every overlayDiff two committed revisions straight from git, no checkout:
etchy v0.11 HEAD fab/ # <refA> <refB> [subdir]Gate CI on the magnitude and location of change:
# exit 1 only if copper changed by more than 0.5 mm²; silkscreen churn is ignored
etchy old/ new/ --gate-layers copper --fail-on-area 0.5Every PR that touches Gerbers gets a layer-by-layer diff comment — five lines
add the Action to a repo (full recipe in
docs/ci-recipes/etchy-pr-diff.yml):
- uses: Cimos/etchy@v0.2.0
with:
old: fab/rev-a
new: fab/rev-b
comment: trueThe job grants pull-requests: write; etchy supplies its own token and posts a
sticky per-layer table (added / removed mm² and region counts).
PDF diff — schematic PDFs get a page-by-page pixel diff (builds with
--features pdf; release binaries ship it on):
etchy old.pdf new.pdf --out overlays/ # per-page table + one overlay PNG per page
etchy old.pdf new.pdf --dpi 300 # crisper rasterization (default 150 DPI)Install
-
From source —
cargo install --path crates/etchy-cli(needs a Rust toolchain). -
Container (headless CLI, distroless, ~11 MB):
sh docker pull ghcr.io/cimos/etchy:v0.2.0 docker run --rm -v "$PWD:/work" ghcr.io/cimos/etchy:v0.2.0 --format summary /work/old /work/newOr build it yourself with
docker build -t etchy .. -
Prebuilt binaries —
etchy-cli-…archives for Linux, macOS and Windows, plus aSHA256SUMSfile, are on the Releases page.
The desktop viewer is a separate binary — etchy-gui <old> <new> — with a
changed-first layer list, Overlay / Old / New / Split / Swipe modes, pan /
zoom / fit, a settings panel, an Open-A / Open-B loader (folder, .zip, or
drag-and-drop), and a Help menu. A web viewer build also exists (see deploy/).
Install the viewer from the Releases page: etchy-viewer-…
as a Windows .msi, a macOS .dmg (Apple Silicon), or a Linux .AppImage /
.deb. The installers also put the etchy command-line tool on your PATH
(not the AppImage). On macOS, brew install --cask cimos/etchy/etchy also works. The
installers are not code-signed yet, so Windows SmartScreen and macOS Gatekeeper
ask once before the first run.
What it does
- Visual + geometric diff of Gerber (RS-274X/X2), Excellon drill, and
pick-and-place (centroid) revisions: a per-layer polygon boolean diff
(
added = B − A,removed = A − B) yields a resolution-independent SVG overlay, a self-contained HTML report, and magnitudes (changed area mm², region count) — all from one computation. Moved / rotated / added / removed components diff as placement markers. - CLI / CI-first: exit codes, per-layer thresholds, git-refs, JSON (schema v1), a GitHub Action + Markdown PR summary; the egui viewer is the second surface.
- Same-board revisions only — fails loud on mismatched boards, never a garbage
diff. Trustworthy: a golden corpus plus property and fuzz tests, and no
silent misses — see
docs/TRUST.md. - Ships as small static binaries and a distroless container.
Non-goals: net/connectivity diff, BOM/component diff, DRC, IPC-2581 / ODB++ ingestion, and native schematic files. (Pick-and-place is diffed as placement geometry — where parts sit — not a BOM/component list.)
Planned: reading KiCad .kicad_pcb boards directly (0.3.0), then Altium
.PcbDoc, with a list of changed objects alongside the layer diff
(#122, spec).
Documentation
docs/TRUST.md— the trust model + limitations: what etchy guarantees, and what it deliberately doesn't do.docs/ci-recipes/etchy-pr-diff.yml— drop-in GitHub Action recipe for gating a PR on a board diff.docs/ci-recipes/gitlab.md— the same for GitLab CI: a.gitlab-ci.ymljob that gates a merge request and posts the summary as an MR note.docs/ROADMAP.md— phased plan to 1.0.docs/DEVELOPER_GUIDE.md— architecture + the verified Rust crate stack.docs/PRODUCT_DISCOVERY.md— the requirements interview behind every decision.deploy/SETUP.md— stand up the hosted web demo + feedback widget on a new machine.
Workspace
| Crate | Role |
|---|---|
etchy-core | the engine: parse → resolve → polygonize → diff → measure → render |
etchy-cli | binary etchy — the primary CLI/CI surface |
etchy-gui | native egui viewer (separate binary; never compiled in headless builds) |
etchy-pdf | schematic-PDF pixel diff (feature-gated; keeps the pure-Rust hayro PDF stack out of the core) |
License
Dual-licensed under either of MIT or Apache-2.0 at your option.
Parts
117| Qty | Value | Footprint | References |
|---|---|---|---|
| 16 | 1N4148W | localLib:D_SOD-123 | D1, D2, D3, D4, D17, D18, D19, D20, D31, D32, D33, D34, D45, D46, D47, D48 |
| 16 | SK6812_MINI_E | Mad_Footprints:SK6812MINI-E | D6, D8, D10, D11, D22, D23, D24, D25, D36, D37, D38, D39, D50, D51, D52, D53 |
| 15 | 100nF | Capacitor_SMD:C_0603_1608Metric | C1, C2, C6, C7, C10, C11, C12, C14, C16, C17, C18, C19, C20, C21, C23 |
| 15 | SW_SPST | kbd:keyswitch_choc12_hotswap_1u | SW2, SW3, SW4, SW6, SW7, SW8, SW9, SW11, SW12, SW13, SW14, SW16, SW17, SW18, SW19 |
| 6 | MountingHole_Pad | MountingHole:MountingHole_2.2mm_M2_DIN965 | H2, H4, H6, H8, H10, H11 |
| 5 | 10uF | Capacitor_SMD:C_0805_2012Metric | C3, C4, C5, C9, C22 |
| 5 | SK6812MINI | Mad_Footprints:SK6812MINI-012 | D13, D15, D16, D41, D43 |
| 4 | 5K1 | Resistor_SMD:R_0603_1608Metric | R1, R2, R3, R4 |
| 4 | Tab | kikit:Tab | T1, T2, T3, T4 |
| 3 | 10K | Resistor_SMD:R_0603_1608Metric | R6, R7, R11 |
| 3 | 51K | Resistor_SMD:R_0603_1608Metric | R8, R9, R15 |
| 2 | 1K | Resistor_SMD:R_0603_1608Metric | R10, R12 |
| 2 | 1uF | Capacitor_SMD:C_0603_1608Metric | C13, C15 |
| 2 | 27R | Resistor_SMD:R_0603_1608Metric | R13, R14 |
| 2 | BLM18PG330SN1D | Inductor_SMD:L_0603_1608Metric | FB1, FB2 |
| 2 | SolderJumper_2_Bridged | Jumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm | JP2, JP3 |
| 1 | 2N7002PV,115 | Package_TO_SOT_SMD:SOT-666 | Q1 |
| 1 | Conn_ARM_SWD_TagConnect_TC2030-NL | Connector_JST:JST_SHL_SM05B-SHLS-TF_1x05-1MP_P1.00mm_Horizontal | J2 |
| 1 | ECMF02-2AMX6 | Mad_Footprints:ST_UQFN-6L_1.5x1.7mm_P0.5mm | U2 |
| 1 | ECS-2520MVLC-120-CN | Oscillator:Oscillator_SMD_ECS_2520MV-xxx-xx-4Pin_2.5x2.0mm | X1 |
| 1 | EVPAA202K | Mad_Footprints:EVP-AA202K | SW100 |
| 1 | Fiducial | Fiducial:Fiducial_0.75mm_Mask1.5mm | FID1 |
| 1 | NCP1117-3.3 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | U3 |
| 1 | PCB | Mad_Footprints:BOM | U1 |
| 1 | RB520S30 | Diode_SMD:D_SOD-523 | D7 |
| 1 | RP2040 | Package_DFN_QFN:QFN-56-1EP_7x7mm_P0.4mm_EP3.2x3.2mm | U5 |
| 1 | RotaryEncoder_Switch | kbd:keyswitch_choc12_hotswap_1u_rotary_encoder_ec12 | SW1 |
| 1 | Split Hand Detect Selector | Jumper:SolderJumper-3_P1.3mm_Bridged12_RoundedPad1.0x1.5mm | JP1 |
| 1 | TRS | Connector_JST:JST_GH_SM03B-GHS-TB_1x03-1MP_P1.25mm_Horizontal | J3 |
| 1 | USB_C_Receptacle | Connector_USB:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal | J1 |
| 1 | W25Q128JVSIQ | Mad_Footprints:SOIC-8_5.23x5.23mm_P1.27mm | U4 |
Questions
How big is the Mad RP2040 PCB?
It measures 77.2 × 86.4 mm and has 4 copper layers, 1.2 mm thick.
What parts does the Mad RP2040 use?
117 parts, built around the SC0914(13), W25Q128JVSIQ, ECMF02-2AMX6 and NCP1117LPST33T3G-MS. 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 Mad RP2040 KiCad files?
From the Cimos/etchy repository on GitHub, at the commit this page was made from: the board is corpus/native/kicad/mad_rp2040/old/Mad_RP2040.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.
Can I use the Mad RP2040 design in my own project?
Its repository publishes it under the Apache-2.0 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 layers10.6 × 21.8 mm

- 4 layers113.4 × 29.3 mm

PCB Mere V1
CaptainDJMax/2627_Projet3AMSC_Index_Stellaire
Ceci est notre projet sur l'index stellaire
80 partsMIT - 2 layers156 × 156 mm

Master board
roboryman/prototroller
A full-stack modular controller that is feature-rich, usable, responsive, and robust. Can be used for any HID-compliant purpose, but we focus on developing swappable modules that can form customizable gamepads.
83 parts9MIT - 6 layers162 × 171 mm

Adc board prot
bcancinov/4-channel-adc-module
4 Channel ADC module for detector controller prototype
383 parts1 - 4 layers34 × 30 mm

Autorouted
tokla-chiya/VL53L9_KICAD
Open VL53L9.kicadpro in KiCad, then open VL53L9.kicadsch. The schematic is complete; the PCB is still empty and needs placement/routing.
32 parts - 4 layers75 × 55 mm

Eos epu up5k
embeddedos-org/eCAD-Hardware-Products
Hardware designs + EE docs + Board datasheets of Multiple products
145 parts8MIT - 6 layers82 × 155 mm

- 4 layers70 × 70 mm

Blue interface board
BetzDrive/interface-board
Power and signal conditioning board for the Betz Drive system
130 parts5