app
Pup - the AI's own browser
Public Made by Adomby adom
pup gives your AI a real browser on your desktop that it drives completely, in the background, signed in as you: windows that never jump in front of your work, one shared profile that learns your logins, and every window labeled with its AI thread's name in your taskbar or dock.
← Commit history
docs: README rewritten for the generic non-profile-browser model (drop stale real-signed-in-browser + CfT-primary claims; background-by-default + ownership); CHANGELOG consolidated 1.6.0->1.8.17; pkg 1.8.20
3 files changed
+50−15
CHANGELOG.md+25@@ -1,5 +1,30 @@ # Changelog — Adom Desktop Puppeteer Bridge +## 1.6.0 → 1.8.17 — 2026-07 — Generic browser, background-by-default, cross-thread ownership, bridge→AD notify++Consolidated summary of the arc since 1.1.0 (per-release detail lives in the wiki Releases tab):++- **Became a generic, non-profile browser.** Removed all native-real-browser drive code — driving the+ user's real signed-in Chrome/Edge is now the Adom browser **extension's** `nbrowser_*` job. Every pup+ session is a fresh isolated Chrome/Edge process. Installed-browser-first: Chrome → Edge → cached CfT,+ spawn-verified with fallthrough; Chrome for Testing only as a last resort.+- **Loopback bind** (`ADOM_BIND_HOST`, 127.0.0.1) so no Windows Firewall prompt.+- **Background by default → hard guarantee (1.8.17):** windows never steal focus; sizing/positioning no+ longer foregrounds either. `foreground:true` is the only way to show a window.+- **Window ownership (1.8.16):** sessions carry an advisory `owner`; declared cross-thread navigate/close+ is refused (`session_owned_by_another_thread`), anonymous grabs are reprimanded — stops AI threads+ stealing each other's windows. `browser_status`/`list_windows` expose `owner` + `ageMinutes`.+- **Chrome install drives the user through the UAC (1.8.12–1.8.15):** on a locked-down box, escalates to+ an elevated install and — via AD ≥1.9.84's direct-API — fires a native "click YES" toast from the+ bridge itself, pinging the attended device (cross-AD `target`) and re-arming if it expires. Degrades+ cleanly on older AD (raise UAC once + relay hint, never spam).+- **Missing verbs + catalog completeness (1.8.8–1.8.11):** added browser_click/type/press_key/back/+ forward/evaluate and documented 13 working-but-unadvertised verbs in `bridge.json` + `browser_describe`.+- **Title-suffix resilience (1.8.17):** persistent `evaluateOnNewDocument` injector so AD's title-based+ raise/lower window lookup stops flaking right after a navigation.+- **Skillpack restructure:** public `pup` + `pup-bridge-dev` + `pup-bridge-publish` as+ `skills/<name>/SKILL.md` (`user-invocable:false` on the dev/publish pair).+ ## 1.1.0 — 2026-06-29 — Cold-start self-heal + ownership extraction **Why:** On a fresh PC (Hydrogen Desktop bundles Adom Desktop; the installer pre-installs neither
README.md+24−14@@ -1,9 +1,14 @@ # Adom Desktop — Puppeteer (pup) Bridge -Drive Chrome from the cloud: open/close browser windows + tabs, navigate, screenshot, eval JS, and-record windows — driving **Chrome for Testing** (clean, isolated) or the user's **real Chrome/Edge/Brave**-(signed-in profile). On a fresh PC the bridge **self-heals**: it detects a missing Chrome for Testing and-auto-installs it, so a first-ever "open in pup" just works.+Drive a browser on the user's desktop from the cloud: open/close windows + tabs, navigate, screenshot,+eval JS, record windows. pup is a **generic, non-profile browser** — every session is a **fresh, isolated+Chrome/Edge process**, never the user's real signed-in browser. It drives the browser **already on the+machine** (installed Chrome, else Microsoft Edge — every Windows PC ships Edge), so the common case needs+**no download**; **Chrome for Testing** is auto-fetched only as a last resort when the box has no+Chromium browser at all. Windows open in the **background by default** so pup never disrupts the user.++> To drive the user's **real, signed-in** Chrome/Edge (their cookies, SSO, saved logins), that's the+> **Adom browser extension's `nbrowser_*` verbs** — a separate bridge, not pup. Canonical page: **https://wiki.adom.inc/adom/adom-desktop-puppeteer-bridge** @@ -12,7 +17,7 @@ Canonical page: **https://wiki.adom.inc/adom/adom-desktop-puppeteer-bridge** | Artifact | Where | What it is | |---|---|---| | **pkg** (Packages tab) | `adom-wiki pkg install adom/adom-desktop-puppeteer-bridge` | the **container-side `pup` skill** (drops into `~/.claude/skills` + `~/.codex/skills`). No runtime. |-| **release zip** (Releases tab) | `https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/<ver>/adom-bridge-puppeteer-v<ver>.zip` | the **bridge runtime** (Node + Chrome-for-Testing self-heal) that Adom Desktop streams into its bridges-cache |+| **release zip** (Releases tab) | `https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/<ver>/adom-bridge-puppeteer-v<ver>.zip` | the **bridge runtime** (Node + the installed-browser detection / Chrome-for-Testing last-resort self-heal) that Adom Desktop streams into its bridges-cache | | **bundled seed** | inside the Adom Desktop installer | the same runtime, shipped for first-run/offline; superseded by a newer cache copy via `updateManifestUrl` | **TL;DR:** `pkg install` = the pup skill for the container; the bridge itself = the Release zip + bundled in Adom Desktop.@@ -20,17 +25,22 @@ Canonical page: **https://wiki.adom.inc/adom/adom-desktop-puppeteer-bridge** ## Use it ```bash-# everyday: open + screenshot (works while lowered so it doesn't disrupt the user)-adom-desktop browser_open_window '{"sessionId":"app","profile":"app","url":"http://localhost:3000"}'-adom-desktop browser_lower_os_window '{"sessionId":"app"}'-adom-desktop browser_screenshot '{"sessionId":"app"}'--# cold-start (fresh PC, no Chrome for Testing): the bridge installs it; poll readiness then open-adom-desktop browser_prewarm '{}'-adom-desktop browser_readiness '{}' # → {ready:true} when Chrome for Testing is installed+# everyday: open + screenshot. Opens in the BACKGROUND automatically — no need to lower it,+# and it's fully drivable/screenshottable while hidden, so the user is never interrupted.+adom-desktop browser_open_window '{"sessionId":"myapp-web","owner":"myapp","url":"http://localhost:3000"}'+adom-desktop browser_screenshot '{"sessionId":"myapp-web"}'++# readiness (use browser_readiness, NOT browser_status). On a box with Chrome or Edge this is+# instantly {ready:true} with no download. Only a box with no Chromium at all fetches Chrome for+# Testing in the background — poll until ready, then open.+adom-desktop browser_readiness '{}' # → {ready:true, browserKind:"chrome"|"edge"|...} ``` -Full everyday usage (tabs, recording, native-Chrome mode, cold-start playbook) is in the `pup` skill+- **Task-prefix your `sessionId` + pass `owner`** — sessions are shared across every AI thread on the+ desktop; that lets pup protect your window from another thread navigating it away.+- **`foreground:true` is the only way to show a window** — sizing/positioning does not foreground it.++Full everyday usage (tabs, recording, window ownership, cold-start playbook) is in the `pup` skill (`SKILL.md`). ## Source & development
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-desktop-puppeteer-bridge",- "version": "1.8.19",+ "version": "1.8.20", "type": "app", "description": "CONTAINER-SIDE install \u2014 the pup skill pack in the wiki skillpack layout: the everyday `pup` user skill PLUS two bundled developer sub-skills (pup-bridge-dev, pup-bridge-publish; user-invocable:false, DEVELOPER-only descriptions so they never trigger for everyday users), all dropped into ~/.claude/skills/ AND ~/.codex/skills/ by an explicit install.sh list. It does NOT contain the bridge runtime: the bridge (Node + browser driving) lives on the DESKTOP \u2014 bundled inside Adom Desktop and published on the Releases tab as adom-bridge-puppeteer-v<ver>.zip, which Adom Desktop streams into its bridges-cache. TL;DR: pkg install = the skill pack; the bridge = the Release zip + bundled in Adom Desktop.", "keywords": [