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.
Releases 1153
Standalone per-platform binaries to download and run, no tools needed. The newest is pinned on top.
Annotate's quick colors are red, blue and green: the muddy yellow/orange third color is gone from the trio and from Multi's automatic cycle (red, blue, green, purple), so every mark has a color anyone can name to the AI. Yellow stays in the More flyout, and every swatch shows its color name on hover (John, 2026-10-07).
Stable link for websites and docs: /download/adom/pup-bridge/latest
All releases showing 621-640 of 1153
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
The no-toast bug in the fast capture loop: the harvest evaluated a destructive read-and-clear under a 600ms race, so whenever the CDP round-trip lost the race the capture was consumed in the page and dropped server-side with no trace. The loop now peeks read-only under the race (a lost peek loses nothing) and only performs the destructive read after a confirmed hit, with no racing timeout
The annotate lag John felt is gone by architecture: the whole overlay module is PRECACHED into every page at load, so the pencil click and Alt+Shift+A open the toolbar instantly client-side with zero bridge round-trip, and a new 700ms fast-harvest loop replaces the 10-second identity sweep for capture pickup. The capture pipeline is reordered for perceived speed: screenshot, then immediately the client-side camera flash (a deliberate white 20 percent pulse over exactly the captured region plus margin, replacing the unexplained blip) and the toast with the preview, while the caption bar, iTXt, clipboard, and disk writes run in the background. After the shot the drawings fade out so the user is back to normal surfing. And the pencil tooltip is restyled to the canonical tooltips-skill surface: teal-tinted border, blur, structured title, body, and a monospace shortcut chip
The annotate hotkey moves onto pup's injection rail: chrome.commands never fires under this load-extension combo (verified with real focused keystrokes after the Alt rebind), completing the pattern where only the extension's action surface works while content scripts, chrome.scripting, and commands are all dead. The floaty injection now carries a page-level Alt+Shift+A listener that sets the same click flag the pencil sets, so the hotkey works whenever a pup page is focused, which is exactly when a user would press it, and it is ralphable with real OS keystrokes
The annotate hotkey moves to Alt+Shift+A: John caught Ctrl+Shift+A colliding with Chrome's built-in Search Tabs, a conflict that ships silently because Chrome just declines the extension binding. Every mention updates (manifest suggested key, floaty tooltip, popup chip, settings row, skill), and the floaty ralph gains a registration assertion reading chrome://extensions/shortcuts so an unassigned or conflicted chord fails the weekly ralph instead of reaching a user
pup_floaty_click, the test seam John asked for: a first-class verb that simulates a user click on the floaty pencil by firing the same host click handler a real mouse does, so the flag, sweep harvest, and annotate start are all exercised as the production chain. Built specifically so the floaty can be ralph-tested weekly forever without CDP input-simulation flakiness, with honest errors when the floaty is absent
Floaty pencil click handlers move from the button inside the closed shadow root to the host element in the light DOM: trusted CDP clicks at the host's coordinates were not reaching the shadow button's handler (verified by the sweep heartbeat harvesting a null flag after a real click), and host-level handlers work regardless of shadow hit-testing while remaining synthetically testable
Floaty-click harvest hoisted above the identity-support gate with a sweep heartbeat: the pencil must work even when identity stamping is unsupported, and a silent sweep is now visible in the log. Diagnosing the click flag being consumed with no action
The floaty pencil for real this time: 2.0.65 shipped no code because the edit script hit an anchor mismatch and the ship ran anyway. pup now injects the pencil per page on the owner-chip rail (shadow root, brand tokens, the tooltip teaching the feature and shortcut), the click sets an in-page flag, and the 4-second enforcer sweep harvests it and starts red-pen annotate on that exact tab, no extension dependency. Gated by tbFloatyPencil
The floaty pencil moves to pup's own injection rail: both extension content-script paths (declarative and chrome.scripting) are verifiably dead under the load-extension flag on this CfT build even though the popup works, so discoverability must not depend on the extension. pup now injects the pencil per page exactly like the owner chip (shadow root, brand tokens, the great tooltip teaching the feature and the Ctrl+Shift+A shortcut), the click sets an in-page flag, and the 4-second enforcer sweep harvests it and starts red-pen annotate on that exact tab. Gated by the same tbFloatyPencil setting
The floaty pencil injects programmatically: declarative content_scripts never fire under the load-extension path on this CfT build (verified live, zero injection anywhere while the worker and popup run fine), so the worker now injects content.js via chrome.scripting on every completed http tab, idempotent per page. Manifest gains the scripting permission and broad host permissions and drops the dead declarative block
Annotate becomes discoverable (John: people won't find it). The extension now renders a tiny monochrome pencil floaty in each page's upper-right corner; one click starts annotate in red-pen mode, with a great tooltip (600ms, clamped) teaching the feature, the Ctrl+Shift+A shortcut, and the lift-the-mouse-and-it-is-on-your-clipboard flow. The hotkey itself is re-aimed from snip to the red pen since a circle tells the AI what the user means better than a bare crop. The floaty is a content script routing through the worker to pup's loopback (pages cannot reach it themselves), and a new tbFloatyPencil sub-setting (default on) under the toolbar family lets users who find it annoying turn it off
pup_annotate joins SESSION_TARGETING_VERBS, the one-word fix the menu ralph was holding the line for: the 2.0.58 tab-URL resolution only runs for verbs in that set, and pup_annotate had been inserted into PASSIVE_VERBS instead by a sloppy heuristic edit, so every toolbar-popup and hotkey annotate resolved no session and failed with Session undefined not found. The PASSIVE_VERBS membership stays deliberately since human annotation should not light the agent-driving progress bar. Found by probing the verbatim response after the menu ralph refused to go green
Two fixes from the full-menu ralph and John's approval. One: annotate and snip injected their overlay into pup's bookkeeping of the active tab while the user was looking at a different tab, an invisible overlay and the true reason the snippet menu never worked for John; the resolved clicking tab now wins, then Chrome's actually-visible tab, then the old chain. Two: URL-based category prediction at open, wiki being John's 60 percent case: while pages still load, the intended URL classifies the window and an unchecked wiki page predicts signed-in, so the very first AUMID stamp is already the categorized id and the visible double-stamp collapses to one for the common case, with the rare wrong guess re-stamping once
The snip hotkey resolves its window the fixed way: Ctrl+Shift+A passed the tab URL through to the server-side any-tab resolution instead of the old main-page-only match that silently failed from most tabs, the same 2.0.58 bug class the popup had. Part of the full-menu ralph pass John requested
Annotate mode exits the way John expects: Esc closes the toolbar and removes the drawings from anywhere in the flow, and Auto mode is one-shot, circle the area, lift the mouse, it is captured and copied, and the toolbar closes immediately so the page is usable again (the drawing stays visible for the owning thread's next screenshot). Turning Auto off keeps the compose-then-Done flow for multi-step annotations, and the Auto tooltip teaches all of it
Toolbar popup actions actually fire from any tab (John clicked Annotate and nothing happened): the popup could only match a window by its main-page URL, so clicks from any other tab resolved no session and the error was swallowed. User-caller commands now resolve the window server-side by matching ANY tab of any session against the clicking tab's URL, the popup passes its tab URL through, and failures render in the popup instead of vanishing (every action answers back). Also the Adom Identity card becomes the real medium identity card per the identity-card skill: new pup /identity endpoint reads ab's Carbon session on the desktop and serves display name, handle, email, avatar and orgs, and the card renders name bold, handle-dot-email muted, and org pills with org avatars, showing only fields the identity API returns