{
  "schema_version": 1,
  "type": "app",
  "slug": "adom-desktop",
  "title": "Adom Desktop",
  "brief": "Laptop bridge: screenshots, file transfer, notifications, KiCad + Fusion 360 control, real-Chrome (pup) automation. One install gives Claude the main + pup + kicad + fusion skills.",
  "version": "1.8.47",
  "tags": [],
  "license": "MIT",
  "discovery_triggers": [
    "fusion 360",
    "kicad",
    "desktop screenshot",
    "send file to desktop",
    "windows app",
    "bridge to my pc",
    "export step",
    "export glb",
    "export lbr",
    "kicad symbol editor",
    "kicad footprint editor",
    "kicad 3d viewer",
    "fusion electronics",
    "fusion pcb",
    "fusion api",
    "screenshot my pc",
    "screenshot my laptop",
    "screenshot my desktop",
    "screenshot fusion",
    "screenshot kicad",
    "screen grab",
    "send to laptop",
    "copy to my pc",
    "file transfer to desktop",
    "desktop notification",
    "toast notification",
    "notify on windows",
    "list windows",
    "which apps are open",
    "bring window to front",
    "focus window",
    "launch kicad",
    "open in kicad",
    "open schematic",
    "open board",
    "open symbol",
    "open footprint",
    "run drc",
    "install kicad library",
    "sym-lib-table",
    "fp-lib-table",
    "launch fusion",
    "open in fusion",
    "open design",
    "f3d",
    "f3z",
    "open cloud file",
    "dismiss recovery",
    "kicad_send_key",
    "kicad_click",
    "kicad_window_info",
    "kicad_screenshot_all",
    "pup",
    "puppeteer",
    "browser automation",
    "headless browser",
    "chrome from docker",
    "debug in real browser",
    "visual debug",
    "browser screenshot",
    "browser_open_window",
    "browser_screenshot",
    "browser_eval",
    "browser_reload",
    "browser_navigate",
    "browser_errors",
    "browser_alert_window",
    "flash taskbar",
    "open url on desktop",
    "ralph loop",
    "multi-session chrome",
    "adom-desktop",
    "adom-desktop install",
    "adom-desktop serve",
    "adom-desktop release",
    "relay server",
    "zombie app",
    "ubuntu desktop",
    "linux desktop",
    "ubuntu install",
    "linux app",
    "deb package",
    "dpkg install"
  ],
  "discovery_pitch": "The bridge from this container to your Windows, Mac, or Ubuntu/Linux desktop. Screenshots (full desktop / specific window), file transfer, desktop notifications, launching + driving KiCad 9 and Fusion 360, running real-Chrome (pup/puppeteer) for visual debugging, and the relay server the CLI talks to. One install gives Claude four skills: main (file + screenshots + notifications), pup (browser), kicad-bridge, fusion-bridge.",
  "sample_prompts": [
    {
      "label": "Install",
      "prompt": "Install adom-desktop on this container"
    },
    {
      "label": "Screenshot laptop",
      "prompt": "Take a screenshot of my Windows desktop"
    },
    {
      "label": "Open KiCad",
      "prompt": "Open this schematic in KiCad on my laptop"
    },
    {
      "label": "Open Fusion",
      "prompt": "Open this design in Fusion 360"
    },
    {
      "label": "Pup debug",
      "prompt": "Open this URL in real Chrome on my laptop and screenshot it for visual debugging"
    },
    {
      "label": "Send file",
      "prompt": "Copy this file to my laptop desktop"
    }
  ],
  "install": {
    "binary_name": "/static/apps/adom-desktop/adom-desktop-linux",
    "install_dir": "",
    "install_hint": "",
    "version_cmd": ""
  },
  "readme": "# Adom Desktop\n\n> Bridge between Claude (running in an Adom Docker container) and the user's desktop applications. **One install** gives Claude every desktop verb it needs — KiCad, Fusion 360, Chrome, file transfer, screenshots, shell, notifications, screen recording — over a single CLI binary that auto-updates from this wiki.\n\n**v1.8.31 highlights:**\n\n- **Direct API with port resilience** — fallback chain 8770→8779, discovery file at `~/.adom/direct-api-port`, per-verb command timeouts, graceful shutdown on app exit. Docker connects in <100ms even after laptop sleep/wake.\n- **Dynamic bridge ports** — every bridge binds to an OS-assigned ephemeral port. No more collisions with Hydrogen Desktop's 8772/8773/8851. Third-party bridges no longer need to pick a number.\n- **Bridge ecosystem v1.8.0+** — three official bridges (KiCad, Fusion 360, Puppeteer) + two sample templates (Python, Rust) + a community-curated [bridges registry](https://wiki-ufypy5dpx93o.adom.cloud/apps/adom-desktop-bridges-registry). Install any bridge with `adom-desktop bridge_install '{\"manifestUrl\":\"…\"}'`.\n- **Auto-update from the wiki** (v1.3.39+) — polls `version.json` every 4h. Settings → Updates lets users pick prompt / auto / off.\n- **Single-instance enforcement** — `tauri-plugin-single-instance` ensures only one GUI runs even if autostart + manual launch overlap.\n\n---\n\n## What it is\n\nAdom Desktop is a small **Tauri 2** (Rust + WebView2/WebKit) desktop application that runs on the user's machine and acts as a WebSocket relay between Docker Claude and local applications. The architecture has three layers:\n\n```\n[ Docker container ]                [ User's machine ]\n                                          │\n  adom-desktop CLI  ◄──── HTTP/WS ────►  Adom Desktop (Tauri GUI)\n       (Linux)                            │\n                                          ├── KiCad bridge        (port-assigned at spawn)\n                                          ├── Fusion 360 bridge   (port-assigned at spawn)\n                                          ├── Puppeteer bridge    (port-assigned at spawn)\n                                          ├── 3rd-party bridges   (port-assigned at spawn)\n                                          ├── Direct API endpoint (8770→8779 fallback)\n                                          └── File / shell / notify primitives\n```\n\nEvery desktop integration is implemented as a **bridge** — an independently-versioned process Adom Desktop spawns on demand, with a `bridge.json` manifest declaring verb prefixes (`kicad_*`, `fusion_*`, `browser_*`, etc.). Adom Desktop allocates an ephemeral port at spawn time, passes it as `--port <N>`, and polls `/status` until ready.\n\nSame install gives Claude:\n\n- **KiCad** (via [`adom-bridge-kicad`](https://wiki-ufypy5dpx93o.adom.cloud/apps/adom-desktop-kicad-bridge)) — open boards/schematics, install symbols/footprints, DRC, screenshot editor windows, watch projects for changes\n- **Fusion 360** (via [`adom-bridge-fusion`](https://wiki-ufypy5dpx93o.adom.cloud/apps/adom-desktop-fusion-bridge)) — launch Fusion, export STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers, search cloud files, run EAGLE library commands\n- **Browser** (via [`adom-bridge-puppeteer`](https://wiki-ufypy5dpx93o.adom.cloud/apps/adom-desktop-puppeteer-bridge)) — Chrome for Testing on the desktop, multi-tab + multi-session, screencast recording, full-desktop screen recording with HUD\n- **File transfer** — `push_file` / `pull_file` for moving artifacts between Docker and the desktop\n- **Shell** — `shell_execute` runs commands on the user's machine with their identity\n- **Notifications** — native OS toasts with optional action buttons\n- **Screenshots** — `desktop_list_windows`, `desktop_screenshot_window`, `desktop_screenshot_screen`\n\nPlus a [bridge SDK](https://wiki-ufypy5dpx93o.adom.cloud/apps/adom-desktop-bridges) so the community can ship bridges for Altium, MATLAB, instrument SDKs, anything else — without coordinating with the Adom Desktop release cycle.\n\n---\n\n## Install (per platform)\n\n### Docker side (Linux CLI)\n\n```bash\n# v1.4.x+: get the latest CLI binary from the wiki (single static file)\nadom-wiki asset get apps/adom-desktop docker_binary -o /usr/local/bin/adom-desktop\nchmod +x /usr/local/bin/adom-desktop\nadom-desktop --version   # adom-desktop 1.8.31 (<sha>, built <ts>)\nadom-desktop install     # deploys the skill, starts the relay on :8765/:8766\n```\n\nThe CLI auto-detects the user's desktop via the **direct API** (`~/.adom/direct-api-port`, fallback range 8770-8779) and falls back to the WebSocket relay when not in direct mode.\n\n### Windows\n\n[Download the latest installer](https://github.com/adom-inc/adom-desktop/releases/latest) (`Adom Desktop_<version>_x64-setup.exe`). NSIS installer with POSTINSTALL auto-launch. v1.3.39+ auto-updates from the wiki on every launch + every 4h.\n\n### macOS\n\nDownload the `.dmg` from the wiki or [GitHub Releases](https://github.com/adom-inc/adom-desktop/releases/latest). Mount → drag to Applications → strip Gatekeeper quarantine on first launch:\n\n```bash\nxattr -cr \"/Applications/Adom Desktop.app\"\n```\n\n### Linux (Ubuntu / Debian)\n\nEither the `.deb` package or the standalone binary from the wiki:\n\n```bash\nsudo dpkg -i Adom-Desktop_<version>_amd64.deb\n# OR standalone:\nchmod +x adom-desktop-ubuntu-<version> && ./adom-desktop-ubuntu-<version>\n# Optional runtime deps for full feature parity:\nsudo apt install wmctrl xdotool imagemagick scrot libnotify-bin\n```\n\n---\n\n## Auto-start the relay on every Docker session\n\nThe relay is NOT started automatically when the Docker container boots. Every time this skill is invoked, run this idempotent block at the top of the session **before** any other `adom-desktop` subcommand:\n\n```bash\nif ! curl -sf http://127.0.0.1:8766/health >/dev/null 2>&1; then\n  nohup adom-desktop serve > /tmp/adom-desktop-relay.log 2>&1 &\n  disown\n  for _ in 1 2 3 4 5 6; do\n    sleep 0.5\n    curl -sf http://127.0.0.1:8766/health >/dev/null 2>&1 && break\n  done\nfi\nadom-desktop ping\n```\n\n`nohup ... & disown` (NOT plain `&`) is critical. Without `nohup` + `disown` the relay dies as soon as the tool call that started it ends, and the next `adom-desktop` command fails with `Cannot reach relay server (port 8766)`.\n\nIf `ping` succeeds → desktop is connected, proceed. If it returns `No desktop client connected` → run `adom-desktop setup_desktop` and ask the user to verify the desktop app is running.\n\n---\n\n## Bridge ecosystem\n\n| Bridge | Status | Verbs | Wiki page |\n|---|---|---|---|\n| **KiCad** | Official, bundled | `kicad_*` (board/schematic open + DRC + symbol/footprint install + watch + screenshot) | [`adom-desktop-kicad-bridge`](https://wiki-ufypy5dpx93o.adom.cloud/apps/adom-desktop-kicad-bridge) |\n| **Fusion 360** | Official, bundled | `fusion_*` (open + export STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers + cloud search + EAGLE) | [`adom-desktop-fusion-bridge`](https://wiki-ufypy5dpx93o.adom.cloud/apps/adom-desktop-fusion-bridge) |\n| **Puppeteer** | Official, bundled | `browser_*` + `desktop_*` (browser automation + screen recording + multi-tab) | [`adom-desktop-puppeteer-bridge`](https://wiki-ufypy5dpx93o.adom.cloud/apps/adom-desktop-puppeteer-bridge) |\n| **hello-python** | Sample | `hellopy_*` (ping + echo, ~80 lines stdlib) | [`adom-desktop-hello-python-bridge`](https://wiki-ufypy5dpx93o.adom.cloud/apps/adom-desktop-hello-python-bridge) |\n| **hello-rust** | Sample | `hellors_*` (ping + echo, ~140 lines, single static binary) | [`adom-desktop-hello-rust-bridge`](https://wiki-ufypy5dpx93o.adom.cloud/apps/adom-desktop-hello-rust-bridge) |\n\nBrowse the full **[bridges registry](https://wiki-ufypy5dpx93o.adom.cloud/apps/adom-desktop-bridges-registry)** for everything installable + the submission flow for community bridges. Read the **[bridge SDK guide](https://wiki-ufypy5dpx93o.adom.cloud/apps/adom-desktop-bridges)** for the `bridge.json` schema, packaging, and lifecycle.\n\n```bash\n# Install any bridge from a manifest URL\nadom-desktop bridge_install '{\"manifestUrl\":\"https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/hello-python-bridge-manifest.json\"}'\n\n# Lifecycle controls\nadom-desktop bridge_list\nadom-desktop bridge_pause '{\"name\":\"hello-python\"}'\nadom-desktop bridge_resume '{\"name\":\"hello-python\"}'\nadom-desktop bridge_uninstall '{\"name\":\"hello-python\"}'\n\n# Refresh any bridges with newer wiki manifests\nadom-desktop refresh_bridges\n```\n\n---\n\n## Direct API (v1.8.31+)\n\nWhen the Docker container and the user's machine can talk directly (cloud workspace + local laptop), the CLI prefers the **direct API** over the WebSocket relay:\n\n- **Discovery file** at `~/.adom/direct-api-port` (`host:port` format) — written by Adom Desktop on every successful bind\n- **Fallback port range** 8770→8779 — if 8770 is held by a zombie socket from a previous session, Adom Desktop walks the range with `SO_REUSEADDR` until it finds a free port\n- **Per-verb command timeouts** — search / walk verbs get 620s; exports get 320s; everything else 120s\n- **Graceful shutdown** — Tauri's `RunEvent::Exit` triggers `direct_api::shutdown()` which cleans the discovery file\n- **Live-owner probe** before walking — 1s timeout (HD's Python bridges' slow `/health` works inside that window)\n\nOverride the bind address via `ADOM_DIRECT_LISTEN_ADDR` (default `127.0.0.1`).\n\n---\n\n## Screen recording (v1.3.30+)\n\nTwo recording surfaces:\n\n- **Full desktop** via Chrome `getDisplayMedia` + `MediaRecorder` in a small always-on-top HUD window. Reason is required and shown in the HUD. WebM output, audio optional. Single recorder window stays open across multiple clips in a session.\n- **Per-tab** via CDP `Page.startScreencast` — JPEG frames + concat manifest, muxed to WebM via ffmpeg. Concurrent recordings across multiple pup tabs are fine; no HUD.\n\n```bash\n# Desktop recording (HUD-visible)\nadom-desktop desktop_record_start '{\"reason\":\"Demo of pin-1 sign-off\",\"monitor\":\"primary\",\"fps\":30}'\n# ... drive activity ...\nadom-desktop desktop_record_stop\nadom-desktop desktop_recorder_close\n\n# Per-tab recording (headless, concurrent OK)\nadom-desktop browser_record_start '{\"sessionId\":\"align\",\"tabId\":\"tab-1\"}'\nadom-desktop browser_record_stop  '{\"sessionId\":\"align\",\"recordingId\":\"…\"}'\n```\n\n---\n\n## Architecture notes for contributors\n\n- **Two binaries**: the **CLI** (~5 MB, `cli/target/release/adom-desktop.exe`, has `serve` command) vs. the **Tauri GUI** (~16 MB, `src-tauri/target/release/adom-desktop.exe`, connects to relay as client). Never copy one over the other.\n- **Build matrix** in `CLAUDE.md` documents which changes need which rebuilds. Plugin-only edits don't require a Tauri rebuild — sync to `src-tauri/target/release/plugins/` + kill `python.exe` / `node.exe` so the next CLI call respawns the bridge from the new code.\n- **Version bumps** via `python scripts/bump-version.py patch` — propagates to `VERSION` + `cli/Cargo.toml` + `src-tauri/tauri.conf.json` together.\n- **Releases** are two artifacts on one tag: Windows installer built locally + Linux CLI built on Docker (`scripts/release-publish.sh` handles both).\n- **Single source of truth** for Docker Claude's knowledge of the CLI is `cli/src/commands.rs`'s help map. Every new verb / arg / behavior change must update it before shipping.\n\nFull contributor docs: [`CLAUDE.md`](https://github.com/adom-inc/adom-desktop/blob/main/CLAUDE.md) in the repo.\n\n---\n\n## Repo + license\n\n- **Source**: [github.com/adom-inc/adom-desktop](https://github.com/adom-inc/adom-desktop)\n- **License**: MIT\n- **Releases**: [github.com/adom-inc/adom-desktop/releases](https://github.com/adom-inc/adom-desktop/releases)\n- **Issues / discussion**: GitHub Issues on the same repo\n\nThe three official bridges live in their own repos:\n\n- [`adom-inc/adom-bridge-kicad`](https://github.com/adom-inc/adom-bridge-kicad)\n- [`adom-inc/adom-bridge-fusion`](https://github.com/adom-inc/adom-bridge-fusion)\n- [`adom-inc/adom-bridge-puppeteer`](https://github.com/adom-inc/adom-bridge-puppeteer)\n\n(Private as of this version, going public after a review pass. Source is mirrored on each bridge's wiki page as a tarball + git bundle — no GitHub account required to fork.)\n\n\n\n",
  "author": {
    "id": "695820315b5f1e4db2fcf602",
    "name": "Kyle Bergstedt",
    "email": "[email protected]"
  },
  "visibility": {
    "public": true
  },
  "hero": null,
  "metadata": {},
  "created_at": "2026-05-28T05:28:37.128Z",
  "updated_at": "2026-05-28T05:28:37.128Z",
  "skills": []
}