← Commit history

hero -> billboard

John Lauer ·303d88fb2f ·4mo ago ·parent f31b333
1 file changed +5−5
page.json+5−5
@@ -3,7 +3,7 @@   "type": "app",   "slug": "adom-desktop-fusion-bridge",   "title": "Adom Desktop - Fusion 360 Bridge",-  "brief": "Reference implementation of the Fusion 360 bridge — thin Python HTTP server that passes commands through to a Fusion add-in via local socket. The pattern for any host app that exposes a plugin API.",+  "brief": "Reference implementation of the Fusion 360 bridge \u2014 thin Python HTTP server that passes commands through to a Fusion add-in via local socket. The pattern for any host app that exposes a plugin API.",   "version": "1.0.0",   "tags": [],   "license": "MIT",@@ -22,7 +22,7 @@     "fork the fusion bridge",     "fusion bridge architecture"   ],-  "discovery_pitch": "Reference implementation of the Fusion 360 bridge — thin Python server that passes commands through to a Fusion add-in via local socket. The canonical pattern for any host app that exposes a plugin API (Altium, SolidWorks, Eagle, etc.).",+  "discovery_pitch": "Reference implementation of the Fusion 360 bridge \u2014 thin Python server that passes commands through to a Fusion add-in via local socket. The canonical pattern for any host app that exposes a plugin API (Altium, SolidWorks, Eagle, etc.).",   "sample_prompts": [     {       "label": "Read fusion bridge source",@@ -34,7 +34,7 @@     },     {       "label": "Add a new fusion verb",-      "prompt": "Help me add a new fusion_export_glb verb — bridge side AND add-in side"+      "prompt": "Help me add a new fusion_export_glb verb \u2014 bridge side AND add-in side"     },     {       "label": "Walk cloud tree",@@ -51,7 +51,7 @@     "install_hint": "",     "version_cmd": ""   },-  "readme": "# Reference bridge: Fusion 360\r\n\r\n## Source code + contributing (2026-05)\r\n\r\nThe 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.\r\n\r\n### Where the source lives\r\n\r\nThe 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.\r\n\r\nIn the meantime, the full source — code, history, contributing guide, license — is **mirrored on this wiki page**:\r\n\r\n| Download | What it is | How to use |\r\n|---|---|---|\r\n| [`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/` |\r\n| [`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` |\r\n\r\nNo GitHub account needed to download either — both URLs are public.\r\n\r\n### How to contribute\r\n\r\nWe accept community improvements. Most useful targets right now:\r\n\r\n- **Newer Fusion versions** — when Autodesk ships a major Fusion update, the add-in manifest + API call shapes may need tweaking. Fork-friendly.\r\n- **Additional export formats** — Fusion supports more than what the bridge currently wraps.\r\n- **Linux support** — Fusion 360 runs on macOS; Linux is a non-starter (Autodesk doesn't ship for Linux), but macOS coverage could expand.\r\n\r\nTwo contribution paths, depending on your access:\r\n\r\n**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.\r\n\r\n**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.\r\n\r\nSee `CONTRIBUTING.md` inside the tarball/bundle for the full PR + ship workflow.\r\n\r\n### How shipping works after merge\r\n\r\n1. Maintainer merges your PR into `main`\r\n2. Maintainer tags `v<X.Y.Z>` + runs `bash scripts/release-bridge.sh fusion360` on their box\r\n3. New zip + manifest published to this wiki page (replaces current version)\r\n4. Every Adom Desktop install running v1.7.19+ auto-picks up your change within 4 hours OR immediately via `adom-desktop refresh_bridges`\r\n\r\nNo NSIS installer rebuild required. Your code reaches real users in ~30s after merge.\r\n\r\n### License\r\n\r\nMIT — see the `LICENSE` file in the tarball.\r\n\r\n---\r\n\r\n\r\nThe 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.\r\n\r\nIf 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).\r\n\r\n## Quick facts\r\n\r\n| | |\r\n|---|---|\r\n| Name | `fusion360` |\r\n| Display | Autodesk Fusion 360 |\r\n| Spawn kind | Python (`server.py`) |\r\n| Port | 8773 |\r\n| Verb prefix | `fusion_*` (16 verbs) |\r\n| Source zip | [`fusion360-bridge-v1.0.0.zip`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion360-bridge-v1.0.0.zip) |\r\n| Manifest | [`fusion360-bridge-manifest.json`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion360-bridge-manifest.json) |\r\n| User-facing skill | [`fusion-SKILL.md`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion-SKILL.md) |\r\n\r\n## What it does\r\n\r\n- **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`.\r\n- **Design rules + parameters** — `fusion_apply_instapcb_rules`, `fusion_load_design_rules`.\r\n- **Exports** — `fusion_export_step` / `iges` / `stl` / `3mf` / `usdz` / `obj` / `dxf` / `dwg` / `gerbers`. Each accepts a `{cloudFile, output}` or `{localFile, output}` pair.\r\n- **Cloud tree walk** — `fusion_walk_cloud_tree` (lists hubs/projects/folders/files), `fusion_search_cloud_files` (text search within a hub).\r\n\r\n## `bridge.json`\r\n\r\n```json\r\n{\r\n  \"manifest_version\": 1,\r\n  \"name\": \"fusion360\",\r\n  \"displayName\": \"Autodesk Fusion 360\",\r\n  \"version\": \"1.0.0\",\r\n  \"description\": \"Fusion 360 add-in bridge: design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers), cloud tree walk, search.\",\r\n  \"homepage\": \"https://github.com/adom-inc/adom-desktop\",\r\n  \"author\": \"Adom Inc.\",\r\n  \"license\": \"MIT\",\r\n  \"spawn\": {\r\n    \"kind\": \"python\",\r\n    \"entrypoint\": \"server.py\",\r\n    \"port\": 8773,\r\n    \"healthEndpoint\": \"http://127.0.0.1:8773/status\",\r\n    \"stopMethod\": \"kill\",\r\n    \"killImageName\": \"python.exe\"\r\n  },\r\n  \"verbPrefixes\": [\"fusion_\"],\r\n  \"verbs\": [\r\n    \"fusion_start\", \"fusion_close_window\",\r\n    \"fusion_apply_instapcb_rules\", \"fusion_load_design_rules\",\r\n    \"fusion_export_step\", \"fusion_export_iges\", \"fusion_export_stl\", \"fusion_export_3mf\",\r\n    \"fusion_export_usdz\", \"fusion_export_obj\", \"fusion_export_dxf\", \"fusion_export_dwg\",\r\n    \"fusion_export_gerbers\",\r\n    \"fusion_walk_cloud_tree\", \"fusion_search_cloud_files\",\r\n    \"fusion_dismiss_blocking_dialogs\"\r\n  ],\r\n  \"dependencies\": { \"python\": \">=3.11\", \"fusion360\": \">=2.0.0\" },\r\n  \"category\": \"CAD\",\r\n  \"tags\": [\"fusion360\", \"autodesk\", \"cad\", \"exports\"]\r\n}\r\n```\r\n\r\n## Architecture: passthrough-to-add-in\r\n\r\nThis is the cleanest pattern for any host app that runs Python (or any other language) in-process via a plugin API:\r\n\r\n```\r\nDocker Claude ──HTTP──→ adom-desktop CLI ──WS──→ Adom Desktop GUI\r\n                                                       │\r\n                                                       │ spawn fusion bridge process\r\n                                                       ▼\r\n                                            fusion360/server.py (port 8773)\r\n                                                       │\r\n                                                       │ socket to add-in\r\n                                                       ▼\r\n                                  Fusion 360 GUI exe + adom-fusion-addin (loaded)\r\n                                                       │\r\n                                                       ▼\r\n                                            Fusion 360 Python API\r\n                                                  (in-process)\r\n```\r\n\r\nThe 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.\r\n\r\nThis decoupling means:\r\n- The bridge has zero Fusion-SDK dependencies — it's stdlib Python.\r\n- The add-in can be updated independently of the bridge (different version cadences).\r\n- A Fusion crash takes down the add-in only; the bridge stays up and reports \"add-in disconnected\" until Fusion restarts.\r\n\r\n## Directory layout\r\n\r\n```\r\nfusion360/\r\n├── server.py           ← HTTP entry + JSON dispatch\r\n├── bridge.json\r\n├── BRIDGE_VERSION\r\n├── fusion_detect.py    ← Find FusionLauncher.exe via webdeploy glob\r\n├── fusion_helper.py    ← Win32 helpers: launch, wait, dismiss-startup-picker\r\n├── eagle_lbr.py        ← .lbr file format support for the Eagle import verbs\r\n├── handlers/           ← One module per verb group\r\n│   ├── exports.py      ← All fusion_export_* — POSTs to the add-in\r\n│   ├── cloud_tree.py\r\n│   ├── design_rules.py\r\n│   └── …\r\n├── addin/              ← The Fusion add-in itself (loaded into Fusion's Python)\r\n│   ├── AdomFusionAddin.py\r\n│   ├── AdomFusionAddin.manifest\r\n│   └── commands/       ← One file per command the add-in implements\r\n├── install_addin.py    ← Copies addin/ to %APPDATA%\\Autodesk\\... where Fusion finds it\r\n├── start.bat           ← Local dev launcher\r\n└── README.md\r\n```\r\n\r\n`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.\r\n\r\n## Example: export a Fusion design as STEP\r\n\r\n```bash\r\n# Open Fusion (handles webdeploy + login + startup picker)\r\nadom-desktop fusion_start\r\n\r\n# Walk the cloud tree to find the design\r\nadom-desktop fusion_walk_cloud_tree '{\"hub\":\"YourHub\",\"project\":\"YourProject\"}'\r\n\r\n# Export — bridge → add-in → adsk.fusion.ExportManager → file on disk\r\nadom-desktop fusion_export_step '{\"cloudFile\":\"/YourHub/YourProject/MyDesign.f3d\",\"output\":\"C:/tmp/MyDesign.step\"}'\r\n\r\n# Pull the file back to Docker\r\nadom-desktop pull_file '{\"filePaths\":[\"C:/tmp/MyDesign.step\"],\"saveTo\":\"/tmp\"}'\r\n```\r\n\r\n## Reference: install the source locally to read\r\n\r\n```bash\r\ncurl -L https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion360-bridge-v1.0.0.zip -o /tmp/fusion-bridge.zip\r\nmkdir -p /tmp/fusion-bridge && cd /tmp/fusion-bridge && python3 -c \"import zipfile; zipfile.ZipFile('/tmp/fusion-bridge.zip').extractall()\"\r\nls -la\r\n```\r\n\r\nRead `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.\r\n\r\n## Related\r\n\r\n- **[Bridge SDK guide](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-bridges)** — `bridge.json` schema, packaging recipe, lifecycle\r\n- **[KiCad bridge reference](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-kicad-bridge)** — most complex of the three; multi-instance, reverse-bridge\r\n- **[Puppeteer bridge reference](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-puppeteer-bridge)** — single-instance, Node + Chrome for Testing\r\n- **[adom-desktop main page](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop)** — install the parent app first\r\n\r\n",+  "readme": "# Reference bridge: Fusion 360\r\n\r\n## Source code + contributing (2026-05)\r\n\r\nThe 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.\r\n\r\n### Where the source lives\r\n\r\nThe 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.\r\n\r\nIn the meantime, the full source \u2014 code, history, contributing guide, license \u2014 is **mirrored on this wiki page**:\r\n\r\n| Download | What it is | How to use |\r\n|---|---|---|\r\n| [`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/` |\r\n| [`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` |\r\n\r\nNo GitHub account needed to download either \u2014 both URLs are public.\r\n\r\n### How to contribute\r\n\r\nWe accept community improvements. Most useful targets right now:\r\n\r\n- **Newer Fusion versions** \u2014 when Autodesk ships a major Fusion update, the add-in manifest + API call shapes may need tweaking. Fork-friendly.\r\n- **Additional export formats** \u2014 Fusion supports more than what the bridge currently wraps.\r\n- **Linux support** \u2014 Fusion 360 runs on macOS; Linux is a non-starter (Autodesk doesn't ship for Linux), but macOS coverage could expand.\r\n\r\nTwo contribution paths, depending on your access:\r\n\r\n**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.\r\n\r\n**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.\r\n\r\nSee `CONTRIBUTING.md` inside the tarball/bundle for the full PR + ship workflow.\r\n\r\n### How shipping works after merge\r\n\r\n1. Maintainer merges your PR into `main`\r\n2. Maintainer tags `v<X.Y.Z>` + runs `bash scripts/release-bridge.sh fusion360` on their box\r\n3. New zip + manifest published to this wiki page (replaces current version)\r\n4. Every Adom Desktop install running v1.7.19+ auto-picks up your change within 4 hours OR immediately via `adom-desktop refresh_bridges`\r\n\r\nNo NSIS installer rebuild required. Your code reaches real users in ~30s after merge.\r\n\r\n### License\r\n\r\nMIT \u2014 see the `LICENSE` file in the tarball.\r\n\r\n---\r\n\r\n\r\nThe Fusion 360 bridge is one of three reference implementations bundled with Adom Desktop. It's the simplest of the three \u2014 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.\r\n\r\nIf 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).\r\n\r\n## Quick facts\r\n\r\n| | |\r\n|---|---|\r\n| Name | `fusion360` |\r\n| Display | Autodesk Fusion 360 |\r\n| Spawn kind | Python (`server.py`) |\r\n| Port | 8773 |\r\n| Verb prefix | `fusion_*` (16 verbs) |\r\n| Source zip | [`fusion360-bridge-v1.0.0.zip`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion360-bridge-v1.0.0.zip) |\r\n| Manifest | [`fusion360-bridge-manifest.json`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion360-bridge-manifest.json) |\r\n| User-facing skill | [`fusion-SKILL.md`](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion-SKILL.md) |\r\n\r\n## What it does\r\n\r\n- **Launch + window control** \u2014 `fusion_start` (handles the webdeploy glob + waits for the add-in handshake + dismisses the startup picker), `fusion_close_window`, `fusion_dismiss_blocking_dialogs`.\r\n- **Design rules + parameters** \u2014 `fusion_apply_instapcb_rules`, `fusion_load_design_rules`.\r\n- **Exports** \u2014 `fusion_export_step` / `iges` / `stl` / `3mf` / `usdz` / `obj` / `dxf` / `dwg` / `gerbers`. Each accepts a `{cloudFile, output}` or `{localFile, output}` pair.\r\n- **Cloud tree walk** \u2014 `fusion_walk_cloud_tree` (lists hubs/projects/folders/files), `fusion_search_cloud_files` (text search within a hub).\r\n\r\n## `bridge.json`\r\n\r\n```json\r\n{\r\n  \"manifest_version\": 1,\r\n  \"name\": \"fusion360\",\r\n  \"displayName\": \"Autodesk Fusion 360\",\r\n  \"version\": \"1.0.0\",\r\n  \"description\": \"Fusion 360 add-in bridge: design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers), cloud tree walk, search.\",\r\n  \"homepage\": \"https://github.com/adom-inc/adom-desktop\",\r\n  \"author\": \"Adom Inc.\",\r\n  \"license\": \"MIT\",\r\n  \"spawn\": {\r\n    \"kind\": \"python\",\r\n    \"entrypoint\": \"server.py\",\r\n    \"port\": 8773,\r\n    \"healthEndpoint\": \"http://127.0.0.1:8773/status\",\r\n    \"stopMethod\": \"kill\",\r\n    \"killImageName\": \"python.exe\"\r\n  },\r\n  \"verbPrefixes\": [\"fusion_\"],\r\n  \"verbs\": [\r\n    \"fusion_start\", \"fusion_close_window\",\r\n    \"fusion_apply_instapcb_rules\", \"fusion_load_design_rules\",\r\n    \"fusion_export_step\", \"fusion_export_iges\", \"fusion_export_stl\", \"fusion_export_3mf\",\r\n    \"fusion_export_usdz\", \"fusion_export_obj\", \"fusion_export_dxf\", \"fusion_export_dwg\",\r\n    \"fusion_export_gerbers\",\r\n    \"fusion_walk_cloud_tree\", \"fusion_search_cloud_files\",\r\n    \"fusion_dismiss_blocking_dialogs\"\r\n  ],\r\n  \"dependencies\": { \"python\": \">=3.11\", \"fusion360\": \">=2.0.0\" },\r\n  \"category\": \"CAD\",\r\n  \"tags\": [\"fusion360\", \"autodesk\", \"cad\", \"exports\"]\r\n}\r\n```\r\n\r\n## Architecture: passthrough-to-add-in\r\n\r\nThis is the cleanest pattern for any host app that runs Python (or any other language) in-process via a plugin API:\r\n\r\n```\r\nDocker Claude \u2500\u2500HTTP\u2500\u2500\u2192 adom-desktop CLI \u2500\u2500WS\u2500\u2500\u2192 Adom Desktop GUI\r\n                                                       \u2502\r\n                                                       \u2502 spawn fusion bridge process\r\n                                                       \u25bc\r\n                                            fusion360/server.py (port 8773)\r\n                                                       \u2502\r\n                                                       \u2502 socket to add-in\r\n                                                       \u25bc\r\n                                  Fusion 360 GUI exe + adom-fusion-addin (loaded)\r\n                                                       \u2502\r\n                                                       \u25bc\r\n                                            Fusion 360 Python API\r\n                                                  (in-process)\r\n```\r\n\r\nThe bridge is thin \u2014 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.\r\n\r\nThis decoupling means:\r\n- The bridge has zero Fusion-SDK dependencies \u2014 it's stdlib Python.\r\n- The add-in can be updated independently of the bridge (different version cadences).\r\n- A Fusion crash takes down the add-in only; the bridge stays up and reports \"add-in disconnected\" until Fusion restarts.\r\n\r\n## Directory layout\r\n\r\n```\r\nfusion360/\r\n\u251c\u2500\u2500 server.py           \u2190 HTTP entry + JSON dispatch\r\n\u251c\u2500\u2500 bridge.json\r\n\u251c\u2500\u2500 BRIDGE_VERSION\r\n\u251c\u2500\u2500 fusion_detect.py    \u2190 Find FusionLauncher.exe via webdeploy glob\r\n\u251c\u2500\u2500 fusion_helper.py    \u2190 Win32 helpers: launch, wait, dismiss-startup-picker\r\n\u251c\u2500\u2500 eagle_lbr.py        \u2190 .lbr file format support for the Eagle import verbs\r\n\u251c\u2500\u2500 handlers/           \u2190 One module per verb group\r\n\u2502   \u251c\u2500\u2500 exports.py      \u2190 All fusion_export_* \u2014 POSTs to the add-in\r\n\u2502   \u251c\u2500\u2500 cloud_tree.py\r\n\u2502   \u251c\u2500\u2500 design_rules.py\r\n\u2502   \u2514\u2500\u2500 \u2026\r\n\u251c\u2500\u2500 addin/              \u2190 The Fusion add-in itself (loaded into Fusion's Python)\r\n\u2502   \u251c\u2500\u2500 AdomFusionAddin.py\r\n\u2502   \u251c\u2500\u2500 AdomFusionAddin.manifest\r\n\u2502   \u2514\u2500\u2500 commands/       \u2190 One file per command the add-in implements\r\n\u251c\u2500\u2500 install_addin.py    \u2190 Copies addin/ to %APPDATA%\\Autodesk\\... where Fusion finds it\r\n\u251c\u2500\u2500 start.bat           \u2190 Local dev launcher\r\n\u2514\u2500\u2500 README.md\r\n```\r\n\r\n`install_addin.py` is the deployment glue \u2014 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.\r\n\r\n## Example: export a Fusion design as STEP\r\n\r\n```bash\r\n# Open Fusion (handles webdeploy + login + startup picker)\r\nadom-desktop fusion_start\r\n\r\n# Walk the cloud tree to find the design\r\nadom-desktop fusion_walk_cloud_tree '{\"hub\":\"YourHub\",\"project\":\"YourProject\"}'\r\n\r\n# Export \u2014 bridge \u2192 add-in \u2192 adsk.fusion.ExportManager \u2192 file on disk\r\nadom-desktop fusion_export_step '{\"cloudFile\":\"/YourHub/YourProject/MyDesign.f3d\",\"output\":\"C:/tmp/MyDesign.step\"}'\r\n\r\n# Pull the file back to Docker\r\nadom-desktop pull_file '{\"filePaths\":[\"C:/tmp/MyDesign.step\"],\"saveTo\":\"/tmp\"}'\r\n```\r\n\r\n## Reference: install the source locally to read\r\n\r\n```bash\r\ncurl -L https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/fusion360-bridge-v1.0.0.zip -o /tmp/fusion-bridge.zip\r\nmkdir -p /tmp/fusion-bridge && cd /tmp/fusion-bridge && python3 -c \"import zipfile; zipfile.ZipFile('/tmp/fusion-bridge.zip').extractall()\"\r\nls -la\r\n```\r\n\r\nRead `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 \u2014 what the add-in does in-process inside Fusion.\r\n\r\n## Related\r\n\r\n- **[Bridge SDK guide](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-bridges)** \u2014 `bridge.json` schema, packaging recipe, lifecycle\r\n- **[KiCad bridge reference](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-kicad-bridge)** \u2014 most complex of the three; multi-instance, reverse-bridge\r\n- **[Puppeteer bridge reference](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-puppeteer-bridge)** \u2014 single-instance, Node + Chrome for Testing\r\n- **[adom-desktop main page](https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop)** \u2014 install the parent app first\r\n\r\n",   "author": {     "id": "695820315b5f1e4db2fcf602",     "name": "Kyle Bergstedt",@@ -62,7 +62,7 @@   },   "hero": {     "type": "image",-    "path": "hero-billboard.png"+    "path": "hero-billboard-v2.png"   },   "metadata": {},   "created_at": "2026-05-28T05:28:44.667Z",