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 on the taskbar with its AI thread's name.
← Commit history
package.json+2−2@@ -1,6 +1,6 @@ { "slug": "pup-bridge",- "version": "2.0.573",+ "version": "2.0.574", "type": "app", "description": "The pup SKILL PACK \u2014 the AI skills that teach a cloud/container AI how to drive the Adom Desktop Puppeteer (pup) bridge (browser_* verbs): the everyday `pup` skill plus focused sub-skills for windows/sessions/tabs, screenshots+recording, browsers+Chrome install, and driving the Adom wiki. Installs into ~/.claude/skills + ~/.codex/skills. DOCS ONLY \u2014 this is NOT the bridge runtime. The bridge itself (the Node program that drives the browser) runs on the DESKTOP: Adom Desktop bundles it and auto-installs/updates it, and it's published separately on the Releases tab as adom-bridge-puppeteer-v<ver>.zip. The pkg version is kept in lockstep with the Release version so the page's max version row always carries BOTH a pkg tarball (skills) and a runtime zip (bridge) \u2014 a skills-only or runtime-only bump on the top row breaks constraint installs. TL;DR: pkg install = the skills for your AI; the bridge = the Release zip, which Adom Desktop manages for you.", "keywords": [@@ -148,5 +148,5 @@ "prompt": "Download the puppeteer-bridge zip from the wiki and walk me through server.js" } ],- "changelog": "ext lane: one AI thread, one window. Restored the birth lock (R4) so only one window birth is in flight at a time, refused any hwnd another session already owns, filtered births to the lane's own Chrome pids (Edge shares the window class), and dropped the sole-window guess that handed every asking session the same handle. Also ships the annotate preview thumbnail as raw RGBA."+ "changelog": "ext lane: screenshots work on a fully occluded window. captureVisibleTab first; on Chrome's image-readback failure the extension attaches chrome.debugger to that one tab, Page.captureScreenshot, detach (Page domain only, no port, no automation flag). --silent-debugger-extension-api hides the bar." }
page.json+2−2@@ -4,7 +4,7 @@ "slug": "pup-bridge", "title": "Pup - Puppeteer Bridge", "brief": "pup is the AI's own browser: a real, full Chrome on the user's desktop that the AI fully controls (a sandbox, not the user's signed-in browser). Rides Bridge; pup_* verbs open windows and tabs, navigate, screenshot, and eval JS.",- "version": "2.0.573",+ "version": "2.0.574", "tags": [ "skills", "pup",@@ -168,5 +168,5 @@ "pup-bridge verbs are invoked through the adom-bridge CLI, not through a binary this package installs, so prefix rules cannot reach them." ] },- "changelog": "ext lane: one AI thread, one window. Restored the birth lock (R4) so only one window birth is in flight at a time, refused any hwnd another session already owns, filtered births to the lane's own Chrome pids (Edge shares the window class), and dropped the sole-window guess that handed every asking session the same handle. Also ships the annotate preview thumbnail as raw RGBA."+ "changelog": "ext lane: screenshots work on a fully occluded window. captureVisibleTab first; on Chrome's image-readback failure the extension attaches chrome.debugger to that one tab, Page.captureScreenshot, detach (Page domain only, no port, no automation flag). --silent-debugger-extension-api hides the bar." }
skills/pup-lanes/SKILL.md+1−1@@ -29,7 +29,7 @@ only CDP can do. pup no longer falls back to CDP on its own for any reason. - Pro: sites load. This is the reason it exists and the reason it is the default. - Pro: one shared adom-you browser, so logins and cookies accumulate for every thread, and every window carries the full toolbar including nbe. - Con: `pup_eval` runs in the page's MAIN world, so a page with a strict Content-Security-Policy (wiki.adom.inc, claude.ai) refuses it with "Evaluating a string as JavaScript violates the following Content Security Policy". Use `pup_screenshot`, `pup_list_tabs`, `pup_navigate` and the other DOM-free verbs there, or `lane:"cdp"` if you truly must run script on such a page and accept that vendor sites will not load in that window.-- Con: `pup_screenshot` needs the window to have a rendered frame. Chrome stops painting a window that is COMPLETELY covered by other windows, and the extension capture then fails with Chrome's own "Failed to capture tab: image readback failed" (measured 2026-09-14: 0 of 20 tabs captured under a maximized Edge, 20 of 20 the moment the window was raised). A partly visible window is fine. If you hit that error, the window is fully occluded: raise it with a `foregroundReason` the user gave you, or open with `lane:"cdp"` whose capture forces a frame. The CDP lane never has this problem.+- Note on screenshots (2.0.574): Chrome stops painting a window that is COMPLETELY covered by other windows, and the plain extension capture then fails with Chrome's own "image readback failed" (measured 2026-09-14: 0 of 20 tabs under a maximized Edge). pup handles it: `captureVisibleTab` first (free, no bar), and only on that failure the extension attaches `chrome.debugger` to that ONE tab, runs `Page.captureScreenshot`, and detaches, about 300 ms. Page domain only, no `--remote-debugging-port`, no automation flag, `navigator.webdriver` stays false, so vendor sites are unaffected. The lane launches with `--silent-debugger-extension-api` so no "started debugging" bar appears. The log says `[screenshot] tab N captured via debugger` when the fallback ran. This is the attach-on-demand pattern the other CDP-only verbs will follow. - Con: no trusted input events, no iframe targeting, no element or full-resolution screenshots, no recording, no selector-driven downloads, no `realKeystrokes`, no separate profile (backlog: pup-bridge#113), no `highFps`, no `webSecurity:false`. Each of those verbs answers `lane_needs_cdp` with the fix. Annotate DOES work here since 2.0.569 (the overlay is file-injected, which page CSP cannot refuse, and the capture is composed in the binary). **CDP lane**