
Passive rpi hub75-adapter
hzeller/rpi-rgb-led-matrix
Controlling up to three chains of 64x64, 32x32, 16x32 or similar RGB LED displays using Raspberry Pi GPIO

A scratch project for learning how to use git with KiCad. The board itself is throwaway; the point is the workflow around it.
KiCad git tests is an open-source printed circuit board by Alex-Hermeling, from the Alex-Hermeling/KiCad-git-tests repository on GitHub. It is a 2-layer board of 23 × 11.8 mm with 2 parts on 3 nets, routed with 2 tracks and 0 vias.
Its parts include 1 resistor and 1 diode.
A scratch project for learning how to use git with KiCad. The board itself is throwaway; the point is the workflow around it.
Everything below was worked out while setting this repo up, including the mistakes — those are recorded at the bottom so they don't get repeated.
KiCad's real design files are text s-expressions, which git handles well. KiCad also scatters caches, locks and binary backups through the project directory, which git handles badly. The whole discipline is keeping the second group out.
| File | What it is |
|---|---|
*.kicad_pro | Project settings, design rules, net classes |
*.kicad_sch | Schematic — text, diffable |
*.kicad_pcb | Board layout — text, diffable |
*.kicad_dru | Custom design rules, if present |
Custom *.kicad_sym / *.kicad_mod | Project-specific symbols and footprints |
.gitignore)| Pattern | Why |
|---|---|
*.lck, ~*.lck | Lock file written while the project is open. Contains your hostname and username. Collaborators would fight over it. |
*.kicad_prl | Local settings — window layout, visible layers, last zoom. Per-user, not per-project. Churns on every open and close. |
*-backups/ | KiCad's automatic backup zips. Binary, rewritten on every save, undiffable. The single biggest cause of a bloated KiCad repo. |
_autosave-*, *.bak, *-bak | Crash-recovery leftovers |
fp-info-cache | Generated footprint cache |
*.net | Netlists — regenerated from the schematic on demand |
gerbers/, *.gbr, *.drl, *.pos, … | Fabrication output. Derived artifacts; regenerate them from a tagged commit instead. |
The rule of thumb: if KiCad can regenerate it, don't commit it. The exception worth considering is fabrication output for a revision you actually ordered — some people commit those deliberately, tagged, as a record of what was built.
.gitattributes marks the KiCad formats as text with LF endings so git never
misdetects one as binary and refuses to diff it, and marks zips and STEP files as
genuinely binary.
.gitignore only stops an accidental git add .. A git add -f or a Git GUI
can still commit these files, so there are two checks on top of it. Both use the
same rules, in .github/scripts/check-repo-files.sh:
| Result | Files |
|---|---|
| ❌ Blocked | *.lck, *.kicad_prl, *-backups/, _autosave-*, *.bak / *-bak, fp-info-cache, .DS_Store / Thumbs.db |
| ⚠️ Warning only | Gerbers (*.gbr, *.gtl, …), drill files, *.pos / *-pos.csv, *-bom.csv, *.zip, *.net, anything in gerbers/, production/, fab/, kibot-output/ |
On pull requests into main, .github/workflows/repo-hygiene.yml runs the
Repo file check. It fails if the PR adds a blocked file. For fabrication
output it passes, but posts a PR comment asking the reviewer to confirm the
files were committed on purpose. Deleting a bad file never trips the check.
Locally, .githooks/pre-commit refuses the commit for blocked files and
prints a warning for fab output. Turn it on once per clone:
git config core.hooksPath .githooksTo skip it once, on purpose: git commit --no-verify.
If a blocked file does get in, remove it from git and keep your local copy with
git rm --cached -- <file>, then commit.
One-time GitHub setup: in Settings → Rules → Rulesets (or Settings →
Branches), require pull requests for main and add Repo file check as a
required status check. Without that, a PR with a failing check can still be
merged, and direct pushes to main skip the check entirely.
KiCad holds edits in memory and writes on save. Committing mid-edit captures a half-state that doesn't match what's on your screen. Closing also clears the lock file.
.kicad_sch and .kicad_pcb share net and footprint identity. A commit with a
schematic change but no corresponding layout update is a broken state you cannot
cleanly return to. One logical change = one commit spanning both files.
.kicad_pcbThis is the big one, and it surprises anyone arriving from software git.
Because the files are text, git will happily merge two divergent layouts — and can produce a syntactically valid file with nonsense geometry: overlapping footprints, traces to nowhere, silently dropped zones. That is strictly worse than a conflict, because nothing warns you.
So:
Version control here is excellent for history, review and rollback. It is not reliable for parallel layout editing.
# after saving and closing KiCad
git status # confirm only design files changed
git diff # review — kicad files are readable text
git add -A
git commit -m "Add 3V3 regulator and decoupling"
git pushTag revisions you actually send to fabrication:
git tag -a rev-a -m "Sent to JLCPCB 2026-09-12"
git push --tagsA tag is what makes "which files did we build?" answerable a year later.
cd ~/KiCad/projects/KiCad-git-tests
git init
git branch -m master main # match GitHub's default
# ... create .gitignore and .gitattributes ...
git add .
git commit -m "Initial commit"
git remote add origin git@github.com:Alex-Hermeling/KiCad-git-tests.git
git push -u origin main| Workflow | Trigger | Produces |
|---|---|---|
.github/workflows/kicad-export.yml | push to main | Schematic SVG/PDF, PCB top/bottom PNG — uploaded as an artifact and published to the previews branch |
.github/workflows/kicad-diff.yml | pull request into main | An interactive KiRi diff of the schematic and PCB vs main, linked from a PR comment (updated on every push). Red/green PDFs are uploaded as an artifact. |
.github/workflows/kicad-pages.yml | started by kicad-diff.yml | Publishes the KiRi sites to GitHub Pages |
.github/workflows/repo-hygiene.yml | pull request into main | Fails on lock/backup/personal files and warns on fab output (see section 1) |
Each open PR gets its own page at
https://alex-hermeling.github.io/KiCad-git-tests/pr-<number>/. The sites are
stored on the pr-diffs branch and removed automatically when the PR is closed.
The site root lists the open PRs.
KiBot settings live in .kibot/config.yml (previews) and .kibot/config_diff.yml (diff).
mainThe images below come from the previews branch, which the export workflow
overwrites on every run. They appear after the first run.
Schematic (PDF)
PCB
| Top | Bottom |
|---|---|
![]() | ![]() |
| Qty | Value | Footprint | References |
|---|---|---|---|
| 1 | LED_Dual_Bidirectional | LED_SMD:LED_1812_4532Metric_Pad1.30x3.40mm_HandSolder | D1 |
| 1 | R | Resistor_SMD:R_0612_1632Metric | R1 |

hzeller/rpi-rgb-led-matrix
Controlling up to three chains of 64x64, 32x32, 16x32 or similar RGB LED displays using Raspberry Pi GPIO


adamws/kicad-kbplacer
KiCad plugin for automatic keyboard's key placement and routing

Luos-io/luos_engine
Open-source and real-time orchestrator for cyber-physical-systems, to easily design, test and deploy embedded applications and digital twins.

NVNTLabs/switch2-SDEX2M2
Micro SD Express to M.2 NVME Adapter for Nintendo Switch 2

BlueSCSI/BlueSCSI-v2
BlueSCSI v2/Ultra - an open source, open hardware, SCSI emulator using the Pi Pico PR2040 and Pico 2 RP2350

ohmtech-rdi/eurorack-blocks
Software to Hardware Prototyping for Eurorack using C++, Max/Gen~ or Faust

It measures 23 × 11.8 mm and has 2 copper layers, 1.6 mm thick.
2 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.
From the Alex-Hermeling/KiCad-git-tests repository on GitHub, at the commit this page was made from: the board is KiCad-git-tests.kicad_pcb and its schematic KiCad-git-tests.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask Alex-Hermeling before reusing the design.