app
Altium Bridge: AI for Altium Designer
Public Made by Adomby adom
Let an AI (Claude, ChatGPT, Codex or any agent) run Altium Designer for you: create symbols and footprints, place parts (also from Altium 365), wire and annotate schematics, Update PCB, set the stack-up and rules, route, pour copper, add mounting holes and stitching vias, run ERC and DRC, and make Gerbers, BOMs and STEP. Free in Hydrogen; bring your own AI and Altium licence.
← Commit history
0.2.62 source (not yet released, needs signing): altium_close {discardChanges} answers Altium Develop's per-document 'Unsaved Changes' with Don't Save (it pressed Save None, which that box lacks, and timed out)
7 files changed
+17−6
CHANGELOG.md+3@@ -1,5 +1,8 @@ # Changelog +## 0.2.62 (2026-10-22)+- `altium_close {discardChanges:true}` answers Altium Designer Develop's per-document "Unsaved Changes" box (Save / Don't Save / Cancel) with Don't Save. It used to press Save None, which that box does not have, and the close timed out with Altium left on the prompt. The discard button is now chosen from the buttons the box has: Save None, OK for "Confirm Not Saving", Don't Save (either apostrophe), or No. Found while checking signed 0.2.61's workspace placement on Develop. Measured after the fix: an unsaved sheet on Develop closed in 6.8 s, and the dialog log shows "Don't Save" pressed.+ ## 0.2.61 (2026-10-22) **Parts from the Altium 365 workspace, placement help, and part swaps.** - `altium_workspace_search {query}` and `altium_workspace_place {sheet, query, pick, x, y, designator}`:
bridge-rs/src/main.rs+1−1@@ -37,7 +37,7 @@ use tiny_http::{Header, Method, Response, Server}; /// Attached to every failed reply (see the /command handler). const REPORT_ISSUES: &str = "If this looks like an altium-bridge BUG (not a refusal you expected), report it: check for a duplicate with `adom-wiki issue list adom/altium-bridge`, then `adom-wiki issue create adom/altium-bridge --title \"<verb>: <one-line symptom>\" --category bug-report --body \"<what you ran, what you expected, what happened, the VERBATIM response JSON (and errorShot if present), bridgeVersion, the Altium version from altium_status, the OS>\"`. A relay, routing, toast or lifecycle problem belongs on adom/adom-bridge instead. Reports from real machines are how this bridge gets correct: three different Altium builds behaved three different ways in one weekend."; -pub const BRIDGE_VERSION: &str = "0.2.61";+pub const BRIDGE_VERSION: &str = "0.2.62"; fn json_response(status: u16, body: &serde_json::Value) -> Response<std::io::Cursor<Vec<u8>>> { let data = serde_json::to_vec(body).unwrap_or_else(|_| b"{}".to_vec());
bridge-rs/src/misc.rs+9−1@@ -498,7 +498,15 @@ pub fn close(args: &Value) -> Value { // Leaving the second press to the next poll leaves Altium sitting // modal — and a modal Altium disables its own main window, which is // the orphan state above. So finish the exchange here.- let button = if title.contains("not saving") { "OK" } else { "Save None" };+ // the discard button the box has: Save None (Confirm Save Locally), OK (Confirm Not+ // Saving), Don't Save (Altium Designer Develop's per-document "Unsaved Changes", measured+ // 2026-10-22: pressing Save None there did nothing and the close timed out), or No+ let labels: Vec<String> = d.get("buttons").and_then(|b| b.as_array()).map(|a| a.iter().filter_map(|x| x.as_str()).map(str::to_string).collect()).unwrap_or_default();+ let has = |want: &str| labels.iter().find(|l| l.replace('\u{2019}', "'").trim().eq_ignore_ascii_case(want)).cloned();+ let button_owned = if title.contains("not saving") { Some("OK".to_string()) }+ else { has("Save None").or_else(|| has("Don't Save")).or_else(|| has("Dont Save")).or_else(|| has("No")) };+ let Some(button_owned) = button_owned else { continue };+ let button = button_owned.as_str(); let r = dialogs::press(hw, button); dialogs::note_event(json!({"title": d.get("title"), "category": "save_prompt_discarded", "pressed": button, "ok": r.get("success"), "note": "altium_close {discardChanges:true}: the caller declared the modified documents its own"}));
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "altium-bridge",- "version": "0.2.61",+ "version": "0.2.62", "type": "app", "description": "Skills for your container so your AI knows how to drive the Altium Designer bridge (altium_* verbs). The bridge runtime itself is the release zip; Adom Bridge loads that.", "tags": [
page.json+1−1@@ -4,7 +4,7 @@ "type": "app", "title": "Altium - the Altium Bridge", "brief": "Adom Bridge for Altium Designer: a resident DelphiScript agent gives the AI eval, the 1,100-command process launcher, all 8 EDA surfaces with screenshots, compile/ERC, DRC, OutJob outputs, native SchLib/PcbLib authoring with STEP 3D bodies, and dialog handling by PID.",- "version": "0.2.61",+ "version": "0.2.62", "hero": { "type": "image", "path": "screenshots/hero.png"
src/BRIDGE_VERSION+1−1@@ -1 +1 @@-0.2.61+0.2.62
src/bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "altium", "displayName": "Altium Designer",- "version": "0.2.61",+ "version": "0.2.62", "description": "Drive Altium Designer from Adom: a resident DelphiScript agent (eval + the 1,100-command process launcher), the X2 -R command line, UIA over the VCL shell, dialogs by PID, screenshots of every Altium window, and Altium 365.", "homepage": "https://wiki.adom.inc/adom/altium-bridge", "docs": "https://wiki.adom.inc/adom/altium-bridge",