← Commit history
SKILL.md+17−5
@@ -144,12 +144,24 @@ don't exist or miss ones that do. 
 ## Starting the Relay Server
 
-The relay must be running before the desktop app can connect:
+The relay must be running before the desktop app can connect. **In a container, start it SUPERVISED** (v1.9.168+):
 
 ```bash
-adom-desktop serve &
+adom-desktop serve --supervise
 ```
 
+**Why not `adom-desktop serve &`?** A backgrounded (`&`) relay is still a child of your shell/session. When your session is torn down (you finish, or the container reaps it), the relay dies with it — and then every connected desktop hits HTTP 500 on `/proxy/8765/` and loops "Reconnecting in 30s" **for hours** until a human restarts it (wiki issue #24, hit live 2026-07-23). `--supervise` **detaches the relay into its own session (reparented to init)** so it survives your session, and starts a watchdog that:
+- restarts the relay with **exponential backoff** (2s → … → 5 min cap; a clean run resets it — a broken relay is never bludgeoned), and
+- **toasts the connected desktops on every restart** with the reason from the relay log, so the owner finds out something went wrong.
+
+```bash
+adom-desktop serve --supervise            # detached + self-healing (use this in containers)
+adom-desktop serve --supervise --owner AdomLapper   # send restart toasts to one desktop
+adom-desktop serve --stop                 # stop the watchdog + relay
+```
+
+`serve` (plain, foreground) still works and prints a loud hint telling you it will die with the session — fine for a quick local relay you'll sit and watch. **Caveat:** a full CONTAINER REBOOT still needs a boot hook (cron `@reboot` / the container's init); the watchdog covers session teardown, not host reboot.
+
 This starts:
 - WebSocket server on `0.0.0.0:8765` (desktop app connects here)
 - HTTP API on `127.0.0.1:8766` (CLI commands go here)
@@ -186,7 +198,7 @@ If this returns `{ "status": "connected" }`, the desktop is already set up -- sk curl -sf http://127.0.0.1:8766/health
 ```
 
-If not running: `adom-desktop serve &`
+If not running (in a container, ALWAYS use `--supervise` so it survives your session): `adom-desktop serve --supervise`
 
 ### Step 3: Ask what OS they use
 
@@ -260,7 +272,7 @@ Ask: **"Would you like to use the visual browser debugging feature? This opens C |---------|-----|
 | `ping` returns `"No desktop client connected"` | User hasn't added this container in the desktop app yet |
 | Desktop app shows "disconnected" | Check the URL uses `wss://` (not `ws://` or `https://`), port is `8765` |
-| Relay server not running | `adom-desktop serve &` |
+| Relay server not running | `adom-desktop serve --supervise` (survives your session; see Starting the Relay Server) |
 | Multiple stale connections | `adom-desktop kick_all` -- app auto-reconnects within seconds |
 | Desktop app not installed | Download from [github.com/adom-inc/adom-desktop/releases](https://github.com/adom-inc/adom-desktop/releases) |
 
@@ -2690,7 +2702,7 @@ Use `kick_all` to reset -- active Adom Desktop apps reconnect within seconds. 
 ```bash
 curl -sf http://127.0.0.1:8766/health
-# If fails: adom-desktop serve &
+# If fails: adom-desktop serve --supervise
 ```
 
 ### Shell commands on Windows
dist/linux/adom-desktop
⋯ 1 unchanged line ⋯
package.json+1−1
@@ -1,6 +1,6 @@ {
   "slug": "adom-desktop",
-  "version": "1.9.167",
+  "version": "1.9.168",
   "type": "app",
   "description": "Adom Desktop is a small operating system for AI on your Windows PC: it gives an AI real hands on your native desktop, including your signed-in browser, KiCad, Fusion 360, the shell, files, windows and screenshots. It provisions its own Node and Python so bridges run without touching your setup, and it talks straight to your machine. It ships with Hydrogen Desktop and installs standalone too, so if you drive your PC with Claude Desktop or another AI, this is what gives that AI hands.",
   "discovery_pitch": "Use when a cloud AI needs to reach a real Windows desktop: run shell commands, capture screenshots, drive native apps and browsers, transfer files, and control KiCad / Fusion 360 / third-party bridges.",
page.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-desktop",-  "version": "1.9.167",+  "version": "1.9.168",   "type": "app",   "description": "Adom Desktop is a small operating system for AI on your Windows PC: it gives an AI real hands on your native desktop, including your signed-in browser, KiCad, Fusion 360, the shell, files, windows and screenshots. It provisions its own Node and Python so bridges run without touching your setup, and it talks straight to your machine. It ships with Hydrogen Desktop and installs standalone too, so if you drive your PC with Claude Desktop or another AI, this is what gives that AI hands.",   "keywords": [
skills/adom-desktop-discovery/SKILL.md+1−1
@@ -15,7 +15,7 @@ adom-desktop --version          # path + version, e.g. adom-desktop 1.8.163 (<sh adom-desktop ping               # {echo:"pong", status:"connected"} == the laptop is reachable
 ```
 
-If `adom-desktop` isn't found → **§4 install**. If `ping` doesn't say `connected`, the relay isn't serving — start it: `adom-desktop serve &` (then re-`ping`).
+If `adom-desktop` isn't found → **§4 install**. If `ping` doesn't say `connected`, the relay isn't serving — start it: `adom-desktop serve --supervise` (v1.9.168+ — detaches + self-heals so it survives your session; a plain `serve &` dies when the session is torn down and leaves every connected desktop in an HTTP 500 reconnect loop). Then re-`ping`.
 
 ## 2 — ⭐ DISCOVER THE VERB: `adom-desktop commands` (NOT `--help`)
 
skills/adom-desktop/SKILL.md+17−5
@@ -144,12 +144,24 @@ don't exist or miss ones that do. 
 ## Starting the Relay Server
 
-The relay must be running before the desktop app can connect:
+The relay must be running before the desktop app can connect. **In a container, start it SUPERVISED** (v1.9.168+):
 
 ```bash
-adom-desktop serve &
+adom-desktop serve --supervise
 ```
 
+**Why not `adom-desktop serve &`?** A backgrounded (`&`) relay is still a child of your shell/session. When your session is torn down (you finish, or the container reaps it), the relay dies with it — and then every connected desktop hits HTTP 500 on `/proxy/8765/` and loops "Reconnecting in 30s" **for hours** until a human restarts it (wiki issue #24, hit live 2026-07-23). `--supervise` **detaches the relay into its own session (reparented to init)** so it survives your session, and starts a watchdog that:
+- restarts the relay with **exponential backoff** (2s → … → 5 min cap; a clean run resets it — a broken relay is never bludgeoned), and
+- **toasts the connected desktops on every restart** with the reason from the relay log, so the owner finds out something went wrong.
+
+```bash
+adom-desktop serve --supervise            # detached + self-healing (use this in containers)
+adom-desktop serve --supervise --owner AdomLapper   # send restart toasts to one desktop
+adom-desktop serve --stop                 # stop the watchdog + relay
+```
+
+`serve` (plain, foreground) still works and prints a loud hint telling you it will die with the session — fine for a quick local relay you'll sit and watch. **Caveat:** a full CONTAINER REBOOT still needs a boot hook (cron `@reboot` / the container's init); the watchdog covers session teardown, not host reboot.
+
 This starts:
 - WebSocket server on `0.0.0.0:8765` (desktop app connects here)
 - HTTP API on `127.0.0.1:8766` (CLI commands go here)
@@ -186,7 +198,7 @@ If this returns `{ "status": "connected" }`, the desktop is already set up -- sk curl -sf http://127.0.0.1:8766/health
 ```
 
-If not running: `adom-desktop serve &`
+If not running (in a container, ALWAYS use `--supervise` so it survives your session): `adom-desktop serve --supervise`
 
 ### Step 3: Ask what OS they use
 
@@ -260,7 +272,7 @@ Ask: **"Would you like to use the visual browser debugging feature? This opens C |---------|-----|
 | `ping` returns `"No desktop client connected"` | User hasn't added this container in the desktop app yet |
 | Desktop app shows "disconnected" | Check the URL uses `wss://` (not `ws://` or `https://`), port is `8765` |
-| Relay server not running | `adom-desktop serve &` |
+| Relay server not running | `adom-desktop serve --supervise` (survives your session; see Starting the Relay Server) |
 | Multiple stale connections | `adom-desktop kick_all` -- app auto-reconnects within seconds |
 | Desktop app not installed | Download from [github.com/adom-inc/adom-desktop/releases](https://github.com/adom-inc/adom-desktop/releases) |
 
@@ -2690,7 +2702,7 @@ Use `kick_all` to reset -- active Adom Desktop apps reconnect within seconds. 
 ```bash
 curl -sf http://127.0.0.1:8766/health
-# If fails: adom-desktop serve &
+# If fails: adom-desktop serve --supervise
 ```
 
 ### Shell commands on Windows
version.json+20−20
@@ -1,21 +1,21 @@-{-  "manifest_version": 1,-  "version": "1.9.167",-  "released_at": "2026-07-23T14:40:00Z",-  "windows": {-    "installer_url": "https://wiki.adom.inc/download/adom/adom-desktop/1.9.167/Adom.Desktop_1.9.167_windows_x64-setup.exe",-    "installer_filename": "Adom.Desktop_1.9.167_windows_x64-setup.exe",-    "installer_sha256": "52411fe99fdf268e0029c20f32b6cf52bdf275dc85e24afb579d2bd88287d5c2",-    "installer_size": 13502176-  },-  "changelog_url": "https://wiki.adom.inc/adom/adom-desktop",-  "minimum_required": "1.3.30",-  "note": "notify_user toasts can now reveal the right window on click: focus:{app} targets any app by owning process, focus:{host:true} reveals the app AD is embedded under (Hydrogen Desktop). Docs clarify the two axes: getting the user's answer back (wait:true / notify_events) vs revealing a window (focus).",-  "macos": {-    "installer_url": "https://wiki.adom.inc/download/adom/adom-desktop-macos/1.9.167/Adom.Desktop_1.9.167_macos_aarch64.dmg",-    "installer_filename": "Adom.Desktop_1.9.167_macos_aarch64.dmg",-    "installer_sha256": "537f2c9fae814ad614074d1c46268520e6c800e9fe7a341cfd63077355d1ccff",-    "installer_size": 12434024,-    "arch": "aarch64"-  }+{
+  "manifest_version": 1,
+  "version": "1.9.168",
+  "released_at": "2026-07-23T17:05:00Z",
+  "windows": {
+    "installer_url": "https://wiki.adom.inc/download/adom/adom-desktop/1.9.168/Adom.Desktop_1.9.168_windows_x64-setup.exe",
+    "installer_filename": "Adom.Desktop_1.9.168_windows_x64-setup.exe",
+    "installer_sha256": "13be8a3e666f5afaad5ecb7142fa9a22517dd59a3716f8bda91121e574b53d56",
+    "installer_size": 13515632
+  },
+  "changelog_url": "https://wiki.adom.inc/adom/adom-desktop",
+  "minimum_required": "1.3.30",
+  "note": "Containers: run the relay as `adom-desktop serve --supervise` so it survives your session being torn down and self-heals (fixes the HTTP 500 reconnect-loop footgun). Also notify_user focus:{app} / focus:{host} to reveal the right window on a toast click.",
+  "macos": {
+    "installer_url": "https://wiki.adom.inc/download/adom/adom-desktop-macos/1.9.162/Adom.Desktop_1.9.162_macos_aarch64.dmg",
+    "installer_filename": "Adom.Desktop_1.9.162_macos_aarch64.dmg",
+    "installer_sha256": "2ff68eab7f80111fd5eb407c270d9b73b44084e3e9e90c0f0c0397617494f253",
+    "installer_size": 12241094,
+    "arch": "aarch64"
+  }
 }\ No newline at end of file