Pup - Puppeteer Bridge
Public Made by Adomby adom
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.
Releases 549
Standalone per-platform binaries to download and run, no tools needed. The newest is pinned on top.
The dashboard err chip stops counting its own plumbing (John saw a red 10 err chip on a healthy dashboard after the window reopen). Both sources were self-inflicted 404s on the dashboard page: the badge preview endpoint now answers a transparent pixel while a freshly opened window has no composed overlay yet, and the bridge answers Chromes automatic favicon.ico probe with a redirect to the dashboard icon instead of a 404. The chip now only fires on real page errors
All releases showing 1-20 of 549
The dashboard err chip stops counting its own plumbing (John saw a red 10 err chip on a healthy dashboard after the window reopen). Both sources were self-inflicted 404s on the dashboard page: the badge preview endpoint now answers a transparent pixel while a freshly opened window has no composed overlay yet, and the bridge answers Chromes automatic favicon.ico probe with a redirect to the dashboard icon instead of a 404. The chip now only fires on real page errors
The corner pencil no longer appears stuck-visible in a freshly opened window (John hit this on the three-tile demo window). Chromium fires one synthetic hover event at page load under a parked cursor; when that landed in the corner reveal zone the pencil revealed and nothing ever tucked it because tuck only runs on real mouse movement. A reveal that sees almost no movement within 3.5 seconds is now recognized as that synthetic case and auto-tucks; genuine hovers produce a stream of moves and keep it up
A dedicated pen button joins the browser toolbar (John: show the pen inline with the extension icons). Chrome permits exactly one action button per extension and no inline toolbars, so the pen is its own tiny third extension, Adom Annotate: one family tile (teal rounded tile, dark-teal pencil mark), pinned first so pen, pup, and identity read as one inline Adom toolbar. The click fires annotate via an instantly self-closing popup on the popup rail, the one extension surface proven reliable under load-extension here, resolving the window by tab URL like every other user path
The dashboard has been silently broken since 2.0.50 and this is the one-character reason: the tbFloatyPencil settings row description contained an escaped apostrophe that serializes into the dashboard page as a raw quote, killing the entire inline script at parse, which is why the page froze at connecting with zero counts while the SSE stream itself was healthy (traced tonight: curl streamed fine, a fresh EventSource from the page worked, the page console showed Unexpected identifier s, and node --check on the served inline script pointed at the exact row). Description rewritten apostrophe-free
The pencil hit area becomes a user-tunable slider (John: 8px too small, 160 too big, let me pick): new floatyHitPx setting, 6 to 120 px slider under the toolbar family in the pup dashboard Settings, default 24. It live-applies: the versioned injection guard now includes the px value, so moving the slider re-injects the floaty on every open page instantly, tear-down and rebuild, no reloads. Built so John can feel each size and report the best default
The stale-injection accumulation bug: evaluateOnNewDocument scripts from every prior bridge process persist on long-lived pages and run oldest-first, so the plain boolean guard let the oldest floaty win forever, which is why John kept seeing the big hover zone after reloads that faithfully re-ran ancient code. The floaty guard is now versioned with the bridge version: the newest module tears down any elder host and rebuilds, so a reload always lands the current behavior
The pencil reveal target shrinks to a tiny 8 pixel literal corner (John: dashboards have buttons in the upper right and a 160 pixel zone summons the pencil over them; he wants roughly 6 pixels, truly out of the way). Jamming the cursor into the exact corner reveals the pencil; the generous proximity zone still keeps it open once revealed
The pup toolbar icon's mark renders in the Adom logo's own dark teal 003d40 on the corrected 00b8b1 tile (John's call): the white glyph elements of the favicon render are flipped to the dark accent the brand mark already uses, so the icon family reads as tile plus dark mark for pup and tile plus avatar for identity
The real teal, everywhere in the icon family (John: is that our real brand color?): the pup toolbar icon was rendered from adom.inc favicon.svg which still carries #00b8b0, the documented wrong-digit teal the design system warns about, while the identity tile used the true #00b8b1, so the matching pair differed by one invisible digit. Both extension icon sets are regenerated from the favicon with the teal corrected to #00b8b1, matching the identity tile recipe exactly
One icon family across every pup surface (John: the two toolbar extension icons felt like brothers from another mother): the Adom Identity icon becomes the same teal rounded tile as the pup toolbar icon and the Windows taskbar tiles, with the user's avatar circle-cropped and inset inside the tile frame, same silhouette, same corner radius, same brand teal, composed with sharp at stage time from the profile avatar with the favicon tile as fallback
The floaty pencil tucks away (John: it will interfere with page UI): hidden by default, revealed by a corner hover zone tracked via passive mousemove so nothing ever intercepts a page click, the taskbar-tuck pattern, auto-hiding 1.2s after the mouse leaves. When revealed it carries the floating-windows-skill drag grip (six-dot glyph); dragging pins it visible wherever the user places it, viewport-clamped. Also the floaty ralph harness is fixed: pup_eval wraps expressions as return(expr), so the harness's statement-chain emits were silent syntax errors that never set the result, which was the entire phantom failure while the real path worked
Annotate captures go flicker-free: CDP captureScreenshot compositor-swaps the surface and visibly blips on a foreground hardware-accelerated window, which pup never noticed because its usual screenshots target background windows; annotate is the first feature shooting the window the user is watching. Captures now grab a single screencast frame on the recorder's rail, which has no visual artifact, DPR-scale-cropped server-side with sharp, with captureScreenshot as the logged fallback
The last blip: Chrome's native screenshot flicker, a viewport re-layout that fires when captureBeyondViewport is left on (the default) for clipped captures. John's blip-then-outline sequence proved captures process on the real path and located the flicker exactly; captureBeyondViewport false removes the re-layout so the capture is visually silent until the dashed teal outline confirms it
The capture indicator becomes a dashed teal outline of exactly the copied region (John: cooler than the white wash), holding half a second then fading. And the post-draw blip: the ten-second sweep re-arm called show on an overlay the user's mouse-up had just hidden, flashing the dismissed toolbar back across the screen; re-arms after an emit-hide are now invisible
Correct the region-only flash guard: the early return in 2.0.79 sat inside the capture-done function and would have suppressed the toast and fade for regionless captures too; the guard now skips only the flash block while the toast and drawing fade always run
The capture camera-flash covers only the shot region, never the whole window (John's rule): the full-viewport fallback for regionless captures is removed, so a full-view capture gets the toast alone and only cropped captures flash their exact rectangle
The capture watcher survives navigations: the wiki auto-login navigation destroys the execution context moments after a window opens, the waitForFunction rejects, and the watcher silently died, which was the final layer of the no-toast bug. Context-destroyed and detached rejections now re-arm the wait instead of abandoning it; only a genuinely closed page ends the watch
The final capture bug: arming the watcher cleared __pupAnnotateResult, destroying any capture the user emitted moments earlier, which is why the toast never came. Arming no longer clears, and pup_floaty_click arms the watcher immediately on the verb path so popup, ralph, and hotkey-via-worker captures have zero arm latency; the in-page pencil path arms via the 10-second sweep with the overlay already visible instantly
Quick capture works again: the 2.0.72 fast-harvest loop never dispatched in production (instrumented and proven silent), so the capture pickup returns to the 2.0.49-proven per-annotation watcher, now feeding the new fast pipeline: screenshot, immediate camera flash and preview toast, then caption bar, iTXt, clipboard and disk in the background, with quick mode re-arming per stroke. The pencil and hotkey keep their instant client-side open and additionally set the click flag so the 10-second sweep arms the watcher (restored, proven), with an arming guard against double-starts. The dead fast loop is deleted
Instrument the silent capture pipeline: log the harvested result, the screenshot entry and completion, and bound the screenshot with a 10 second timeout so a hang becomes a logged error instead of a silently eaten capture