app
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.
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
John Lauer
·
75cf5ee
·
7h ago
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
John Lauer
·
9163536
·
7h ago
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
John Lauer
·
1ef6732
·
7h ago
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
John Lauer
·
7165a68
·
7h ago
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
John Lauer
·
28393ad
·
11h ago
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
John Lauer
·
5146990
·
12h ago
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
John Lauer
·
82937a7
·
18h ago
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
John Lauer
·
2eac86c
·
18h ago
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
John Lauer
·
9c1bd00
·
18h ago
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
John Lauer
·
1f6f453
·
18h ago
Update 1 file(s)
John Lauer
·
42ebfed
·
18h ago
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
John Lauer
·
b61c16b
·
18h ago
Update 1 file(s)
John Lauer
·
b2b2bf6
·
18h ago
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
John Lauer
·
066e7bb
·
18h ago
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
John Lauer
·
8144113
·
19h ago
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
John Lauer
·
9aff788
·
19h ago
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
John Lauer
·
00142ea
·
19h ago
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
John Lauer
·
079f1c4
·
19h ago
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
John Lauer
·
217b7e0
·
19h ago
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
John Lauer
·
c68001c
·
19h ago
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
John Lauer
·
dcd4083
·
19h ago
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
John Lauer
·
cb182b3
·
19h ago
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
John Lauer
·
2f0186f
·
19h ago
Update 1 file(s)
John Lauer
·
1afa4c8
·
19h ago
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
John Lauer
·
fd2d201
·
19h ago
Update 2 file(s)
John Lauer
·
64a8e63
·
20h ago
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
John Lauer
·
a08a552
·
20h ago
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
John Lauer
·
ea23596
·
20h ago
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
John Lauer
·
8a0b75a
·
20h ago
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
John Lauer
·
80ecd05
·
20h ago
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
John Lauer
·
f29c49b
·
21h ago
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
John Lauer
·
9f57b8d
·
21h ago
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
John Lauer
·
6b40669
·
21h ago
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
John Lauer
·
fe75e60
·
21h ago
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
John Lauer
·
1c513a3
·
21h ago
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
John Lauer
·
79255ea
·
21h ago
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
John Lauer
·
afcfdd1
·
21h ago
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
John Lauer
·
2f7f9ef
·
21h ago
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
John Lauer
·
a65167c
·
21h ago
Update 1 file(s)
John Lauer
·
454aae9
·
21h ago
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
John Lauer
·
3c2844b
·
21h ago
Round-trip symmetry for the wiki view toggle plus the identity extension. John round-tripped the toggle and caught the asymmetry: the public direction relaunched into a throwaway jar but the logged-in direction signed in the throwaway itself instead of coming home, so authed from any toggle-created iso jar now takes the tab-preserving relaunch back to shared adom-you where logins enrich the shared store. The Chrome profile chip stops leaking internal names: anonymous jars read Adom anonymous. A second delayed raise fixes the toggle window returning in the background after a user click. The Chromium launches-when-Windows-starts promo infobar is suppressed in layers (candidate feature disables plus disable-field-trial-config, which is also the determinism WHY-CFT promises, plus promotional-tabs pref). And the new Adom Identity extension rides every adom-you launch: the toolbar icon is the user's avatar (staged from settings at launch, favicon fallback), click for the identity card explaining the shared adom-you profile; pinned via the computed unpacked id, algorithm validated against a live id
John Lauer
·
873d146
·
21h ago
Annotate toolbar polish from John's live test, per the Adom UI design skills. The toolbar is draggable by a visible six-dot grip and clamps inside the viewport (floating-windows rules). Every control now has a real tooltip through a proper tooltip system: body-level fixed element, 600ms reveal, 0.18s fade and translate, measured after content is set, clamped to the viewport on both axes and flipping above rather than clipping (the tooltips skill contract), with carefully written copy per tool. Auto capture is on by default so the common single-circle flow needs zero extra clicks. And the view toggle is no longer out of sync: /health now carries the CHECKED wiki auth state per session, the extension popup labels the toggle from that ground truth instead of a cached belief, and hides the toggle entirely on non-wiki pages
John Lauer
·
25ba81d
·
22h ago
Update 6 file(s)
John Lauer
·
5ab318d
·
22h ago
The toolbar extension wears the real Adom favicon (John: your icon should be the adom favicon, not the hand-drawn dots), rendered from adom.inc favicon.svg at 16, 48, and 128. Also documents the CfT decision permanently: new sub-readme docs/WHY-CFT.md records the full technical case (the unsuppressable automation banner on branded Chrome that blipped over windows during cursor moves, logins and captcha assists; the Chrome 137 extension lockdown verified live including the session-scoped CDP install; version determinism with no auto-updater; no field trials or consumer nags; binary isolation from the user's own browser; and the honest trade-offs including the CfT download, the window title, and no Widevine). README and skill text updated off the stale system-browser-first policy
John Lauer
·
48715cc
·
22h ago
Pin the Adom Pup toolbar icon by default: MV3 action icons hide behind the puzzle menu unless pinned, so prepareCleanProfile now seeds extensions.pinned_extensions with the toolbar's id (stable because an unpacked extension id hashes from its staging path, which is fixed at .adom/pup-extension on every machine). Gated on the toolbarExtension setting
John Lauer
·
34ede1f
·
22h ago
The toolbar extension becomes a launch arg (John repinned pup to Chrome for Testing after the branded-Chrome extension lockdown made every install path ugly). CfT still honors load-extension, so when the driving browser is CfT and the toolbarExtension setting is on, every profile launch simply carries the flag and every window is born with the toolbar: there is no install step at all. The transient pipe-install experiment is deleted (verified session-scoped, useless with detached launches), staging is a plain file copy, the flag rides only chrome-for-testing candidates since branded Chrome removed it, and pup_install_toolbar is now informational
John Lauer
·
e74b3f2
·
22h ago
The toolbar extension now simply auto-exists in pup (John: this is pup, you control the browser, there has to be a better way than a file dialog). The UIA dialog-driving experiment is deleted. Before a profile's Chrome ever launches, pup does an invisible two-second pipe-launch of the same profile and installs the extension via CDP Extensions.loadUnpacked (puppeteer enableExtensions plus installExtension, the sanctioned replacement for the load-extension flag branded Chrome removed in 137), so the extension persists in the profile and every window is born with the toolbar: no dialogs, no chrome-extensions driving, no user action, ever. Marker-gated per extension version so upgrades re-install once. pup_install_toolbar is now a thin status/trigger verb
John Lauer
·
578e0d8
·
22h ago
Brand compliance plus the zero-click toolbar install. The annotate overlay, capture toast, popup, and caption bar now follow the Adom UI design system exactly: token colors (the real 00b8b1 accent family, 161b22 surfaces, 30363d borders, c9d1d9 body text), monochrome SVG line icons replacing every glyph character per the icon law, brand fonts bundled in the extension popup (Familjen Grotesk headers, Satoshi body, JetBrains Mono data), toast moved to bottom-center per the toast standard, drawing palette mapped to brand status colors. New pup_install_toolbar verb answers John's can-not-you-just-do-that-automatically: pup stages the extension, drives chrome://extensions itself through the shadow DOM (dev mode toggle, Load unpacked), and ab drives the one native folder dialog, so the one-time install is fully automated. /health now carries owner and view per session plus the toolbar prefs for the extension's badge feed, and annotation start clears any stale result flag
John Lauer
·
7f96f68
·
22h ago
Update 5 file(s)
John Lauer
·
784d73f
·
22h ago