This document captures a real debugging journey of getting:
- Atopile (
ato) - KiCad
- Linux Mint (Ubuntu Noble base)
to work together.
This is not a tutorial written after success.
This is a forensic reconstruction of failure → iteration → understanding → resolution.
Goal:
Make future debugging faster by documenting what actually went wrong.
We explored different approaches for electronics design:
| Approach | Problem |
|---|---|
| KiCad GUI-only | Hard to scale, low reproducibility |
| Python EDA tools | Fragmented ecosystems |
| SPICE-only workflows | No PCB/layout integration |
| Atopile | ✅ Code-first + PCB + BOM + constraints |
Atopile stood out because:
- Code-based hardware design (
.ato) - Declarative design + constraint solving
- Direct KiCad integration
- Automatic BOM and layout updates
We wanted a minimal working example
ato buildthat:
- resolves dependencies
- picks parts
- generates a PCB
- outputs BOM + artifacts
- optionally integrates with KiCad
System:
Linux Mint (based on Ubuntu Noble 24.04)
Python via uv tool install
KiCad initially 7.0.11 → later upgraded to 10.0.3
Atopile installed via:
uv tool install atopile✅ ato build worked
Output:
Build successful! 🚀
Artifacts:
elec/layout/default/default.kicad_pcb
elec/layout/default/default.kicad_pro
This proves:
✅ Atopile core pipeline works independent of KiCad plugin
Repeated warning:
Couldn't install plugin: Could not find KiCad plugin path
Couldn't enable plugin api: KeyErrorNotFound()
Important insight:
⚠️ Build succeeded anyway → plugin is optional, not blocking
We tried:
~/.local/share/kicad/7.0/scripting/plugins
~/Documents/KiCad/7.0/scripting/pluginsAlso:
kicad:
search_paths:Result:
✅ Config accepted
❌ Warning unchanged
From faebryk/libs/kicad/paths.py:
KICAD_VERSION = "9.0"This was the breakthrough.
KiCad version = 9.0
- KiCad 7 → first
- KiCad 10 → later
The path logic:
return [Path(p) / KICAD_VERSION]Meaning:
If you give:
/home/<userName>/.local/share/kicad/10.0/scripting/plugins
It looks for:
/home/<userName>/.local/share/kicad/10.0/scripting/plugins/9.0
→ impossible path
We learned:
Atopile expects base paths, not final plugin directories
Correct:
kicad:
search_paths:
- ~/.local/share/kicad
- ~/.config/kicad
- ~/Documents/KiCadNot:
.../10.0/scripting/plugins
Installed latest KiCad:
sudo add-apt-repository ppa:kicad/kicad-10.0-releases
sudo apt install kicadVerified:
kicad-cli version
→ 10.0.3Because Atopile still used:
KICAD_VERSION = "9.0"We patched:
KICAD_VERSION = "10.0"kicad:
search_paths:
- ~/.local/share/kicad
- ~/.config/kicad
- ~/Documents/KiCad
- /usr/share/kicadmkdir -p ~/.local/share/kicad/10.0/plugins
mkdir -p ~/.local/share/kicad/10.0/scripting/plugins
mkdir -p ~/.config/kicad/10.0KICAD_VERSION = "10.0"Inside KiCad:
Preferences → Plugins → Enable plugin API
Even after fixes:
Couldn't enable plugin api: KeyErrorNotFound()
- Likely requires running KiCad instance
- IPC API interaction not fully initialized
- Not blocking
✅ Safe to ignore for now
✅ ato build works
✅ KiCad project generated
✅ PCB file usable
✅ Full pipeline functional
ato build
kicad ./elec/layout/default/default.kicad_proor:
pcbnew ./elec/layout/default/default.kicad_pcbAtopile builds independently of KiCad plugin
Hardcoded:
KICAD_VERSION = "9.0"→ broke everything subtly
- Not just "existing"
- Must match internal assumptions
We used:
- Copilot
- Gemini
- Claude
Each helped:
| Tool | Strength |
|---|---|
| Gemini | hardware reasoning |
| Claude | high-level structuring |
| Copilot | step-by-step diagnostics |
Without:
ato buildworking first → debugging would be chaotic
Your debugging pattern mirrors hardware constraints:
- Sensor limits → field-of-view
- Software limits → plugin path resolution
Both cases show:
System behavior is governed by hidden assumptions
- Auto-detect KiCad version (not hardcoded)
- Better error message than:
Could not find KiCad plugin path - Show actual paths being checked
- Remove need for manual patching
This journey shows:
Real engineering ≠ following docs
Real engineering = understanding why things fail
Start here:
ato buildThen:
- Ignore plugin at first
- Confirm PCB generation works
- Only then debug KiCad integration
This document is intentionally verbose.
Because debugging is expensive.
Understanding once saves time forever.