app
KiCad - the KiCad Bridge
Public Made by Adomby adom
Reference implementation of the KiCad bridge: multi-instance Python server, forward path via kicad-cli, reverse path via in-process plugin. Most complex of the three bundled bridges.
← Commit history
v0.9.130: demo beats reordered (design file-opens first, plugin-dependent part beats after) - KiCad starts each process's embedded Python lazily and the plugin needs 1-2 min to bind on 10.0.5; scheduling gives it that time for free
5 files changed
+21−14
BRIDGE_VERSION+1−1@@ -1 +1 @@-0.9.129+0.9.130
adom-bridge-kicad-manifest.json+5−5@@ -1,15 +1,15 @@ { "manifest_version": 1, "name": "kicad",- "version": "0.9.129",- "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.129/adom-bridge-kicad-v0.9.129.zip",- "sha256": "a4c2263511a6c4f953f4110695f26c89e7512ac333f136b725f46fba02f2a355",- "size": 413143,+ "version": "0.9.130",+ "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.130/adom-bridge-kicad-v0.9.130.zip",+ "sha256": "674e14a36048e2843dde2c589e3ed8988a29561677f427a7d57164c6977ef9e4",+ "size": 413375, "verbPrefixes": [ "kicad_" ], "healthEndpoint": "/status",- "released_at": "2026-08-16T18:32:28Z",+ "released_at": "2026-08-16T18:43:05Z", "hero": "https://wiki.adom.inc/blob/app/kicad-bridge/kicad-hero.png", "languages": [ "Python",
adom-bridge-kicad-v0.9.130.zipadded⋯ 1 unchanged line ⋯
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "kicad", "displayName": "KiCad EDA",- "version": "0.9.129",+ "version": "0.9.130", "description": "Reverse bridge for KiCad \u2014 board/schematic introspection, lint via kicad-cli, plugin install, multi-instance probe, in-process DRC.", "homepage": "https://wiki.adom.inc/adom/adom-bridge", "author": "Adom Inc.",
handlers/demo.py+14−7@@ -40,7 +40,14 @@ DEMO_LIB = "Adom" IC_SYM, IC_FP = "AdomDemo_IC", "AdomDemo_SOIC8" R_SYM, R_FP = "AdomDemo_R", "AdomDemo_R0805" -STEPS = ["symbol", "footprint", "footprint3d", "schematic", "board", "board3d"]+# Beat ORDER is a reliability decision, not just a story decision (2026-08-16):+# the design beats (schematic/board/board3d) are plain file-opens that need no+# plugin, while the part beats (symbol/footprint/footprint3d) ride the+# in-process plugin — and KiCad starts each process's embedded Python LAZILY,+# so on 10.0.5 the plugin takes 1-2 minutes to bind after spawn. Running the+# design beats first gives the plugin that time for free; part beats then take+# the fast in-process path instead of racing a cold interpreter.+STEPS = ["schematic", "board", "board3d", "symbol", "footprint", "footprint3d"] # Screenshot labels. `schematic` / `board_2d` / `board_3d` deliberately match the # labels fusion_demo returns, so an AI driving BOTH bridges (Hydrogen's installer does)@@ -356,7 +363,7 @@ def _run_step(kicad_info: dict, step: str, prep: dict) -> dict: except Exception: loaded = True # can't verify — don't fail the beat on the checker return {"ok": bool(r.get("success")) and loaded, "window": "Symbol Editor",- "title": "1/6 · Schematic symbol",+ "title": "4/6 · Schematic symbol", "say": (f"This is the {IC_SYM} symbol, in the user's own KiCad symbol editor. " "The bridge installed it into their Adom library a second ago — no file " "copying, no dialogs."),@@ -367,7 +374,7 @@ def _run_step(kicad_info: dict, step: str, prep: dict) -> dict: if step == "footprint": r = handle_open_footprint_editor(kicad_info, {"libraryName": DEMO_LIB, "footprintName": IC_FP}) return {"ok": bool(r.get("success")), "window": "Footprint Editor",- "title": "2/6 · The footprint for that symbol",+ "title": "5/6 · The footprint for that symbol", "say": (f"Same part, now its land pattern: {IC_FP}. This is what actually gets " "soldered — the symbol is the idea, the footprint is the copper."), "pointOut": ["8 SMD pads on 1.27 mm pitch", "silkscreen outline + the pin-1 dot",@@ -377,7 +384,7 @@ def _run_step(kicad_info: dict, step: str, prep: dict) -> dict: import time; time.sleep(2) r = handle_open_3d_viewer(kicad_info, {"editor": "footprint"}) return {"ok": bool(r.get("success")), "window": "3D Viewer",- "title": "3/6 · That part in 3D",+ "title": "6/6 · That part in 3D", "say": ("And here is the same footprint in three dimensions" + (", with the real SOIC-8 body from KiCad's own 3D model library." if has3d else " — pads only; KiCad's bundled 3D models weren't found.")),@@ -387,7 +394,7 @@ def _run_step(kicad_info: dict, step: str, prep: dict) -> dict: if step == "schematic": r = handle_open_schematic(kicad_info, {"filePath": prep["schematic"]}) return {"ok": bool(r.get("success")), "window": "Schematic Editor",- "title": "4/6 · A schematic using it",+ "title": "1/6 · A schematic using it", "say": ("Now a real schematic sheet: the demo IC as U1 with two 10k resistors, " "R1 and R2. The bridge generated and opened this project itself."), "pointOut": ["U1 plus R1/R2, each properly annotated",@@ -396,7 +403,7 @@ def _run_step(kicad_info: dict, step: str, prep: dict) -> dict: if step == "board": r = handle_open_board(kicad_info, {"filePath": prep["board"]}) return {"ok": bool(r.get("success")), "window": "PCB Editor",- "title": "5/6 · The 2D board layout",+ "title": "2/6 · The 2D board layout", "say": ("The PCB side: the same three parts placed on a 70 by 40 millimetre " "board outline, copper, silkscreen and courtyards all real."), "pointOut": ["the SOIC-8 land pattern and two 0805 resistors",@@ -407,7 +414,7 @@ def _run_step(kicad_info: dict, step: str, prep: dict) -> dict: import time; time.sleep(2) r = handle_open_3d_viewer(kicad_info, {"editor": "pcb"}) return {"ok": bool(r.get("success")), "window": "3D Viewer",- "title": "6/6 · The whole board in 3D",+ "title": "3/6 · The whole board in 3D", "say": ("And the finished board in 3D — this is the payoff: from a symbol to a " "rendered assembly, every step driven from the cloud on the user's own " "machine."),