app
Fusion - the Fusion 360 Bridge
Public Made by Adomby adom
Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.
← Commit history
README.md+195−195@@ -1,202 +1,202 @@-# Reference bridge: Fusion 360 - +# Adom Desktop - Fusion 360 Bridge+    -## Source code + contributing (2026-05) - -The Fusion 360 bridge moved out of `adom-inc/adom-desktop`'s monorepo into its own dedicated repo so the community can extend it without coordinating with Adom Desktop's release cycle. - -### Where the source lives - -The canonical repo is **[`adom-inc/adom-bridge-fusion`](https://github.com/adom-inc/adom-bridge-fusion)** on GitHub. It's private today and will go public after a review pass. - -In the meantime, the full source — code, history, contributing guide, license — is **mirrored on this wiki page**: - -| Download | What it is | How to use | -|---|---|---| -| [`adom-bridge-fusion-source.tar.gz`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop-fusion-bridge/adom-bridge-fusion-source.tar.gz) | Clean source tree, no `.git` directory. ~115 KB. | `tar xzf adom-bridge-fusion-source.tar.gz && cd adom-bridge-fusion/` | -| [`adom-bridge-fusion.bundle`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop-fusion-bridge/adom-bridge-fusion.bundle) | Git bundle with full commit history. ~222 KB. | `git clone https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop-fusion-bridge/adom-bridge-fusion.bundle adom-bridge-fusion && cd adom-bridge-fusion && git log` | - -No GitHub account needed to download either — both URLs are public. - -### How to contribute - -We accept community improvements. Most useful targets right now: - -- **Newer Fusion versions** — when Autodesk ships a major Fusion update, the add-in manifest + API call shapes may need tweaking. Fork-friendly. -- **Additional export formats** — Fusion supports more than what the bridge currently wraps. -- **Linux support** — Fusion 360 runs on macOS; Linux is a non-starter (Autodesk doesn't ship for Linux), but macOS coverage could expand. - -Two contribution paths, depending on your access: - -**With a GitHub account (preferred):** wait until we make the repo public, then fork on GitHub and open a PR. We're aiming to flip the repo public in the next maintenance pass. - -**Without GitHub access (patch-by-email-style, available right now):** Clone the bundle, make your changes, generate a patch with `git format-patch origin/main..HEAD --stdout > my-changes.patch`, and email it to **`[email protected]`**. Adom maintainers will review and apply. - -See `CONTRIBUTING.md` inside the tarball/bundle for the full PR + ship workflow. - -### How shipping works after merge - -1. Maintainer merges your PR into `main` -2. Maintainer tags `v<X.Y.Z>` + runs `bash scripts/release-bridge.sh fusion360` on their box -3. New zip + manifest published to this wiki page (replaces current version) -4. Every Adom Desktop install running v1.7.19+ auto-picks up your change within 4 hours OR immediately via `adom-desktop refresh_bridges` - -No NSIS installer rebuild required. Your code reaches real users in ~30s after merge. - -### License - -MIT — see the `LICENSE` file in the tarball. - - - -The Fusion 360 bridge is one of three reference implementations bundled with Adom Desktop. It's the simplest of the three — a Python HTTP server that passes commands through to a Fusion 360 add-in via a local socket. The add-in does the actual Fusion API work in-process. - -If you're authoring a new third-party bridge, see the [bridge SDK guide](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-bridges) first. Use this page if you're building a bridge to any app that exposes a plugin API the bridge can talk to (Altium, Eagle, SolidWorks add-ins all fit this pattern). - -## Quick facts - -| | | -|---|---| -| Name | `fusion360` | -| Display | Autodesk Fusion 360 | -| Spawn kind | Python (`server.py`) | -| Port | 8773 | -| Verb prefix | `fusion_*` (16 verbs) | -| Source zip | [`fusion360-bridge-v1.0.0.zip`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion360-bridge-v1.0.0.zip) | -| Manifest | [`fusion360-bridge-manifest.json`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion360-bridge-manifest.json) | -| User-facing skill | [`fusion-SKILL.md`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion-SKILL.md) | - -## What it does - -- **Launch + window control** — `fusion_start` (handles the webdeploy glob + waits for the add-in handshake + dismisses the startup picker), `fusion_close_window`, `fusion_dismiss_blocking_dialogs`. -- **Design rules + parameters** — `fusion_apply_instapcb_rules`, `fusion_load_design_rules`. -- **Exports** — `fusion_export_step` / `iges` / `stl` / `3mf` / `usdz` / `obj` / `dxf` / `dwg` / `gerbers`. Each accepts a `{cloudFile, output}` or `{localFile, output}` pair. -- **Cloud tree walk** — `fusion_walk_cloud_tree` (lists hubs/projects/folders/files), `fusion_search_cloud_files` (text search within a hub). - -## `bridge.json` - -```json -{ - "manifest_version": 1, - "name": "fusion360", - "displayName": "Autodesk Fusion 360", - "version": "1.0.0", - "description": "Fusion 360 add-in bridge: design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers), cloud tree walk, search.", - "homepage": "https://github.com/adom-inc/adom-desktop", - "author": "Adom Inc.", - "license": "MIT", - "spawn": { - "kind": "python", - "entrypoint": "server.py", - "port": 8773, - "healthEndpoint": "http://127.0.0.1:8773/status", - "stopMethod": "kill", - "killImageName": "python.exe" - }, - "verbPrefixes": ["fusion_"], - "verbs": [ - "fusion_start", "fusion_close_window", - "fusion_apply_instapcb_rules", "fusion_load_design_rules", - "fusion_export_step", "fusion_export_iges", "fusion_export_stl", "fusion_export_3mf", - "fusion_export_usdz", "fusion_export_obj", "fusion_export_dxf", "fusion_export_dwg", - "fusion_export_gerbers", - "fusion_walk_cloud_tree", "fusion_search_cloud_files", - "fusion_dismiss_blocking_dialogs" - ], - "dependencies": { "python": ">=3.11", "fusion360": ">=2.0.0" }, - "category": "CAD", - "tags": ["fusion360", "autodesk", "cad", "exports"] -} -``` - -## Architecture: passthrough-to-add-in - -This is the cleanest pattern for any host app that runs Python (or any other language) in-process via a plugin API: - -``` -Docker Claude ──HTTP──→ adom-desktop CLI ──WS──→ Adom Desktop GUI - │ - │ spawn fusion bridge process - ▼ - fusion360/server.py (port 8773) - │ - │ socket to add-in - ▼ - Fusion 360 GUI exe + adom-fusion-addin (loaded) - │ - ▼ - Fusion 360 Python API - (in-process) -``` - -The bridge is thin — it accepts JSON commands over HTTP, validates args, forwards to the add-in via a local socket, awaits the response, returns to the caller. The add-in (running inside Fusion's own Python interpreter) does the actual `adsk.fusion.*` API work and serializes the result back. - -This decoupling means: -- The bridge has zero Fusion-SDK dependencies — it's stdlib Python. -- The add-in can be updated independently of the bridge (different version cadences). -- A Fusion crash takes down the add-in only; the bridge stays up and reports "add-in disconnected" until Fusion restarts. - -## Directory layout - -``` -fusion360/ -├── server.py ← HTTP entry + JSON dispatch -├── bridge.json -├── BRIDGE_VERSION -├── fusion_detect.py ← Find FusionLauncher.exe via webdeploy glob -├── fusion_helper.py ← Win32 helpers: launch, wait, dismiss-startup-picker -├── eagle_lbr.py ← .lbr file format support for the Eagle import verbs -├── handlers/ ← One module per verb group -│ ├── exports.py ← All fusion_export_* — POSTs to the add-in -│ ├── cloud_tree.py -│ ├── design_rules.py -│ └── … -├── addin/ ← The Fusion add-in itself (loaded into Fusion's Python) -│ ├── AdomFusionAddin.py -│ ├── AdomFusionAddin.manifest -│ └── commands/ ← One file per command the add-in implements -├── install_addin.py ← Copies addin/ to %APPDATA%\Autodesk\... where Fusion finds it -├── start.bat ← Local dev launcher -└── README.md -``` - -`install_addin.py` is the deployment glue — Fusion only loads add-ins from `%APPDATA%\Autodesk\Autodesk Fusion 360\API\AddIns\<name>\`. After the bridge is installed (or updated), the next `fusion_start` re-runs `install_addin.py` to keep the add-in in sync with whatever version of the bridge shipped. - -## Example: export a Fusion design as STEP - -```bash -# Open Fusion (handles webdeploy + login + startup picker) -adom-desktop fusion_start - -# Walk the cloud tree to find the design -adom-desktop fusion_walk_cloud_tree '{"hub":"YourHub","project":"YourProject"}' - -# Export — bridge → add-in → adsk.fusion.ExportManager → file on disk -adom-desktop fusion_export_step '{"cloudFile":"/YourHub/YourProject/MyDesign.f3d","output":"C:/tmp/MyDesign.step"}' - -# Pull the file back to Docker -adom-desktop pull_file '{"filePaths":["C:/tmp/MyDesign.step"],"saveTo":"/tmp"}' -``` - -## Reference: install the source locally to read - -```bash -curl -L https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion360-bridge-v1.0.0.zip -o /tmp/fusion-bridge.zip -mkdir -p /tmp/fusion-bridge && cd /tmp/fusion-bridge && python3 -c "import zipfile; zipfile.ZipFile('/tmp/fusion-bridge.zip').extractall()" -ls -la -``` - -Read `server.py` for the dispatch pattern (similar to hello sample but with handler dirs), then `handlers/exports.py` for an example of how a bridge passes a request through to a separate process. The `addin/` dir is the OTHER half — what the add-in does in-process inside Fusion. - -## Related - -- **[Bridge SDK guide](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-bridges)** — `bridge.json` schema, packaging recipe, lifecycle -- **[KiCad bridge reference](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-kicad-bridge)** — most complex of the three; multi-instance, reverse-bridge -- **[Puppeteer bridge reference](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-puppeteer-bridge)** — single-instance, Node + Chrome for Testing +## Source code + contributing (2026-05)++The Fusion 360 bridge moved out of `adom-inc/adom-desktop`'s monorepo into its own dedicated repo so the community can extend it without coordinating with Adom Desktop's release cycle.++### Where the source lives++The canonical repo is **[`adom-inc/adom-bridge-fusion`](https://github.com/adom-inc/adom-bridge-fusion)** on GitHub. It's private today and will go public after a review pass.++In the meantime, the full source — code, history, contributing guide, license — is **mirrored on this wiki page**:++| Download | What it is | How to use |+|---|---|---|+| [`adom-bridge-fusion-source.tar.gz`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop-fusion-bridge/adom-bridge-fusion-source.tar.gz) | Clean source tree, no `.git` directory. ~115 KB. | `tar xzf adom-bridge-fusion-source.tar.gz && cd adom-bridge-fusion/` |+| [`adom-bridge-fusion.bundle`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop-fusion-bridge/adom-bridge-fusion.bundle) | Git bundle with full commit history. ~222 KB. | `git clone https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop-fusion-bridge/adom-bridge-fusion.bundle adom-bridge-fusion && cd adom-bridge-fusion && git log` |++No GitHub account needed to download either — both URLs are public.++### How to contribute++We accept community improvements. Most useful targets right now:++- **Newer Fusion versions** — when Autodesk ships a major Fusion update, the add-in manifest + API call shapes may need tweaking. Fork-friendly.+- **Additional export formats** — Fusion supports more than what the bridge currently wraps.+- **Linux support** — Fusion 360 runs on macOS; Linux is a non-starter (Autodesk doesn't ship for Linux), but macOS coverage could expand.++Two contribution paths, depending on your access:++**With a GitHub account (preferred):** wait until we make the repo public, then fork on GitHub and open a PR. We're aiming to flip the repo public in the next maintenance pass.++**Without GitHub access (patch-by-email-style, available right now):** Clone the bundle, make your changes, generate a patch with `git format-patch origin/main..HEAD --stdout > my-changes.patch`, and email it to **`[email protected]`**. Adom maintainers will review and apply.++See `CONTRIBUTING.md` inside the tarball/bundle for the full PR + ship workflow.++### How shipping works after merge++1. Maintainer merges your PR into `main`+2. Maintainer tags `v<X.Y.Z>` + runs `bash scripts/release-bridge.sh fusion360` on their box+3. New zip + manifest published to this wiki page (replaces current version)+4. Every Adom Desktop install running v1.7.19+ auto-picks up your change within 4 hours OR immediately via `adom-desktop refresh_bridges`++No NSIS installer rebuild required. Your code reaches real users in ~30s after merge.++### License++MIT — see the `LICENSE` file in the tarball.++---+++The Fusion 360 bridge is one of three reference implementations bundled with Adom Desktop. It's the simplest of the three — a Python HTTP server that passes commands through to a Fusion 360 add-in via a local socket. The add-in does the actual Fusion API work in-process.++If you're authoring a new third-party bridge, see the [bridge SDK guide](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-bridges) first. Use this page if you're building a bridge to any app that exposes a plugin API the bridge can talk to (Altium, Eagle, SolidWorks add-ins all fit this pattern).++## Quick facts++| | |+|---|---|+| Name | `fusion360` |+| Display | Autodesk Fusion 360 |+| Spawn kind | Python (`server.py`) |+| Port | 8773 |+| Verb prefix | `fusion_*` (16 verbs) |+| Source zip | [`fusion360-bridge-v1.0.0.zip`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion360-bridge-v1.0.0.zip) |+| Manifest | [`fusion360-bridge-manifest.json`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion360-bridge-manifest.json) |+| User-facing skill | [`fusion-SKILL.md`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion-SKILL.md) |++## What it does++- **Launch + window control** — `fusion_start` (handles the webdeploy glob + waits for the add-in handshake + dismisses the startup picker), `fusion_close_window`, `fusion_dismiss_blocking_dialogs`.+- **Design rules + parameters** — `fusion_apply_instapcb_rules`, `fusion_load_design_rules`.+- **Exports** — `fusion_export_step` / `iges` / `stl` / `3mf` / `usdz` / `obj` / `dxf` / `dwg` / `gerbers`. Each accepts a `{cloudFile, output}` or `{localFile, output}` pair.+- **Cloud tree walk** — `fusion_walk_cloud_tree` (lists hubs/projects/folders/files), `fusion_search_cloud_files` (text search within a hub).++## `bridge.json`++```json+{+ "manifest_version": 1,+ "name": "fusion360",+ "displayName": "Autodesk Fusion 360",+ "version": "1.0.0",+ "description": "Fusion 360 add-in bridge: design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers), cloud tree walk, search.",+ "homepage": "https://github.com/adom-inc/adom-desktop",+ "author": "Adom Inc.",+ "license": "MIT",+ "spawn": {+ "kind": "python",+ "entrypoint": "server.py",+ "port": 8773,+ "healthEndpoint": "http://127.0.0.1:8773/status",+ "stopMethod": "kill",+ "killImageName": "python.exe"+ },+ "verbPrefixes": ["fusion_"],+ "verbs": [+ "fusion_start", "fusion_close_window",+ "fusion_apply_instapcb_rules", "fusion_load_design_rules",+ "fusion_export_step", "fusion_export_iges", "fusion_export_stl", "fusion_export_3mf",+ "fusion_export_usdz", "fusion_export_obj", "fusion_export_dxf", "fusion_export_dwg",+ "fusion_export_gerbers",+ "fusion_walk_cloud_tree", "fusion_search_cloud_files",+ "fusion_dismiss_blocking_dialogs"+ ],+ "dependencies": { "python": ">=3.11", "fusion360": ">=2.0.0" },+ "category": "CAD",+ "tags": ["fusion360", "autodesk", "cad", "exports"]+}+```++## Architecture: passthrough-to-add-in++This is the cleanest pattern for any host app that runs Python (or any other language) in-process via a plugin API:++```+Docker Claude ──HTTP──→ adom-desktop CLI ──WS──→ Adom Desktop GUI+ │+ │ spawn fusion bridge process+ ▼+ fusion360/server.py (port 8773)+ │+ │ socket to add-in+ ▼+ Fusion 360 GUI exe + adom-fusion-addin (loaded)+ │+ ▼+ Fusion 360 Python API+ (in-process)+```++The bridge is thin — it accepts JSON commands over HTTP, validates args, forwards to the add-in via a local socket, awaits the response, returns to the caller. The add-in (running inside Fusion's own Python interpreter) does the actual `adsk.fusion.*` API work and serializes the result back.++This decoupling means:+- The bridge has zero Fusion-SDK dependencies — it's stdlib Python.+- The add-in can be updated independently of the bridge (different version cadences).+- A Fusion crash takes down the add-in only; the bridge stays up and reports "add-in disconnected" until Fusion restarts.++## Directory layout++```+fusion360/+├── server.py ← HTTP entry + JSON dispatch+├── bridge.json+├── BRIDGE_VERSION+├── fusion_detect.py ← Find FusionLauncher.exe via webdeploy glob+├── fusion_helper.py ← Win32 helpers: launch, wait, dismiss-startup-picker+├── eagle_lbr.py ← .lbr file format support for the Eagle import verbs+├── handlers/ ← One module per verb group+│ ├── exports.py ← All fusion_export_* — POSTs to the add-in+│ ├── cloud_tree.py+│ ├── design_rules.py+│ └── …+├── addin/ ← The Fusion add-in itself (loaded into Fusion's Python)+│ ├── AdomFusionAddin.py+│ ├── AdomFusionAddin.manifest+│ └── commands/ ← One file per command the add-in implements+├── install_addin.py ← Copies addin/ to %APPDATA%\Autodesk\... where Fusion finds it+├── start.bat ← Local dev launcher+└── README.md+```++`install_addin.py` is the deployment glue — Fusion only loads add-ins from `%APPDATA%\Autodesk\Autodesk Fusion 360\API\AddIns\<name>\`. After the bridge is installed (or updated), the next `fusion_start` re-runs `install_addin.py` to keep the add-in in sync with whatever version of the bridge shipped.++## Example: export a Fusion design as STEP++```bash+# Open Fusion (handles webdeploy + login + startup picker)+adom-desktop fusion_start++# Walk the cloud tree to find the design+adom-desktop fusion_walk_cloud_tree '{"hub":"YourHub","project":"YourProject"}'++# Export — bridge → add-in → adsk.fusion.ExportManager → file on disk+adom-desktop fusion_export_step '{"cloudFile":"/YourHub/YourProject/MyDesign.f3d","output":"C:/tmp/MyDesign.step"}'++# Pull the file back to Docker+adom-desktop pull_file '{"filePaths":["C:/tmp/MyDesign.step"],"saveTo":"/tmp"}'+```++## Reference: install the source locally to read++```bash+curl -L https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion360-bridge-v1.0.0.zip -o /tmp/fusion-bridge.zip+mkdir -p /tmp/fusion-bridge && cd /tmp/fusion-bridge && python3 -c "import zipfile; zipfile.ZipFile('/tmp/fusion-bridge.zip').extractall()"+ls -la+```++Read `server.py` for the dispatch pattern (similar to hello sample but with handler dirs), then `handlers/exports.py` for an example of how a bridge passes a request through to a separate process. The `addin/` dir is the OTHER half — what the add-in does in-process inside Fusion.++## Related++- **[Bridge SDK guide](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-bridges)** — `bridge.json` schema, packaging recipe, lifecycle+- **[KiCad bridge reference](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-kicad-bridge)** — most complex of the three; multi-instance, reverse-bridge+- **[Puppeteer bridge reference](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-puppeteer-bridge)** — single-instance, Node + Chrome for Testing - **[adom-desktop main page](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop)** — install the parent app first