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.72: demo clears stale .lck files (force-killed KiCad left locks that popped File Open Warning and blocked every load) + idempotent warm-up (repeat calls spawned duplicate editor pairs)
5 files changed
+21−7
BRIDGE_VERSION+1−1@@ -1 +1 @@-0.9.71+0.9.72
adom-bridge-kicad-manifest.json+5−5@@ -1,15 +1,15 @@ { "manifest_version": 1, "name": "kicad",- "version": "0.9.71",- "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.71/adom-bridge-kicad-v0.9.71.zip",- "sha256": "1565375de642c42a59e622da75d954de3321801ba5e35700ec061a2389d6c706",- "size": 366198,+ "version": "0.9.72",+ "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.72/adom-bridge-kicad-v0.9.72.zip",+ "sha256": "c821d251d83ffa480741edb2e78cf736e7f47aeb1eadcccd9b9bace54273485d",+ "size": 366463, "verbPrefixes": [ "kicad_" ], "healthEndpoint": "/status",- "released_at": "2026-08-08T23:50:06Z",+ "released_at": "2026-08-09T00:06:13Z", "hero": "https://wiki.adom.inc/blob/app/kicad-bridge/kicad-hero.png", "languages": [ "Python",
adom-bridge-kicad-v0.9.72.zipadded⋯ 1 unchanged line ⋯
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "kicad", "displayName": "KiCad EDA",- "version": "0.9.71",+ "version": "0.9.72", "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@@ -281,6 +281,13 @@ def _prepare(kicad_info: dict) -> dict: fp if r.get("success") else f"{fp}: {r.get('error')}") d = _demo_dir()+ # A force-killed KiCad leaves `~<file>.lck` lockfiles behind; the next open+ # then pops a modal "File Open Warning" and the sheet stays untitled+ # (observed live 2026-08-09: five blocked editor pairs). These are OUR+ # generated files, so clearing stale locks is always safe.+ for lck in d.glob("*.lck"):+ try: lck.unlink()+ except Exception: pass (d / "adom-demo.kicad_sch").write_text(_schematic(), encoding="utf-8") (d / "adom-demo.kicad_pcb").write_text(_board(kicad_info), encoding="utf-8") (d / "adom-demo.kicad_pro").write_text('{"board":{},"meta":{"filename":"adom-demo.kicad_pro","version":1},"schematic":{},"sheets":[]}', encoding="utf-8")@@ -305,6 +312,13 @@ def _warm_kicad(kicad_info: dict, prep: dict) -> dict: Windows still open in the background; this only costs a few seconds. """ import time+ try:+ from .kicad_ui import _find_all_kicad_windows+ titles = [(w.get("title") or "") for w in _find_all_kicad_windows()]+ if any("Schematic Editor" in t for t in titles) and any("PCB Editor" in t for t in titles):+ return {"warmed": True, "eeschema": True, "pcbnew": True, "reused": True}+ except Exception:+ pass # Symbol Editor is hosted inside EESCHEMA and Footprint Editor inside PCBNEW. # Warming only one leaves the other's editor with no host app, which fails as # "Could not open the Footprint Editor via the background (plugin) path".