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
README.md+2−1@@ -27,9 +27,10 @@ adom-bridge --ai-thread "my-thread" pup_open_window '{"url":"https://example.com adom-bridge --ai-thread "my-thread" pup_screenshot '{}' # the image lands in the container adom-bridge --ai-thread "my-thread" pup_navigate '{"url":"https://wiki.adom.inc"}' # same window, next page adom-bridge --ai-thread "my-thread" pup_my_windows '{}' # everything this thread has open+adom-bridge --ai-thread "my-thread" pup_upload_file '{"selector":"input[type=file]","filePath":"C:/Users/me/Downloads/gerbers.zip"}' # a file from this PC onto the page's file input: no OS dialog, any size ``` -Or just say it: "open my app in pup", "screenshot this site in pup", "record a clip of this page in pup".+Or just say it: "open my app in pup", "screenshot this site in pup", "record a clip of this page in pup", "upload these gerbers to the JLCPCB quote form in pup". ## Every window wears its thread's name
SKILL.md+17@@ -514,6 +514,23 @@ but never the user's own signed-in OS Chrome/Edge profile, so it can't borrow lo there. pup accumulates its OWN logins over time (sign in once inside pup, it sticks). The extension is the counterpart when you need the user's REAL profile/SSO directly. +## Uploading a file to a page: `pup_upload_file`++For any `<input type=file>`: a quote form, a bug report, a CAD upload. No OS file picker, in the background, at any size,+because Chrome reads the file from disk itself. **Never base64 a file through `pup_eval`.**++```bash+adom-bridge --ai-thread "<thread>" pup_upload_file '{"selector":"input[type=file]","filePath":"C:/Users/me/Downloads/gerbers.zip"}'+```++- **The path is on the PC the browser runs on, not in your container.** A file in the container: `adom-bridge send_files '{"filePaths":["/abs/gerbers.zip"]}'` first (it lands in Downloads), then pass that path.+- `selector` can be the input (hidden is fine) or its Browse button or label. Open shadow roots and same-origin frames are searched. With one file input on the page you can omit it; with several you get `ambiguous_input` and a list. `filePaths:[...]` for an input that takes several files.+- **The page creates its input when Browse is clicked?** You get `input_not_found`. Then: `pup_upload_file {armForNextChooser:true, filePath}`, `pup_click {selector: the Browse control}` within 30 s, `pup_upload_file {chooserStatus:true}` to confirm. **Never click Browse without arming:** the OS dialog opens in front of the user and freezes the window.+- `attached:true, verified:true` means the page has the file (read back from the input). It does NOT mean the site has it: many pages upload on change, others need an Upload or Submit click. Screenshot or `pup_wait` for the page's own result, and keep the file in place until then.+- The page gets exactly one `input` and one `change` per call, including a retry with the same file. `clearedByPage:true` is normal: the widget took the file and emptied its input.+- **Refused on purpose, with `errorCode:"path_refused"`:** key, password and browser-login files (`.pem`, `id_rsa`, `.env`, `.kdbx`, `Login Data`, ...), `.ssh`, `.git` and other credential folders, AppData (except Temp) and hidden folders in the home folder, system folders, other people's profiles, and `\\server` paths. There is no override: if the user really means to send one, they copy it to an ordinary folder first. Downloads, Documents, Desktop, Temp, other drives and pup's own screenshots are fine.+- A real signed-in Chrome? `nbrowser_set_file_input {selector, filePaths:[...]}` does the same job through the extension.+ ## Logins & credentials (the durable profile pays off here) - Sign into a site ONCE in any pup window and the durable profile keeps it, every later window
package.json+17−3@@ -1,6 +1,6 @@ { "slug": "pup-bridge",- "version": "2.0.739",+ "version": "2.0.740", "type": "app", "description": "The pup SKILL PACK: the AI skills that teach a cloud/container AI how to drive the Bridge Puppeteer (pup) bridge (pup_* 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 Bridge 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 Bridge manages for you.", "keywords": [@@ -155,7 +155,21 @@ "log in to mouser", "log in to digikey", "sign in problem",- "stuck on the login page"+ "stuck on the login page",+ "upload a file in pup",+ "pup upload",+ "pup upload file",+ "upload a file to a page",+ "upload a file to a website",+ "attach a file to a form",+ "file input",+ "input type file",+ "upload gerbers",+ "upload gerber zip to jlcpcb",+ "fill the jlcpcb quote form",+ "set file input without the file picker",+ "browser file upload without a dialog",+ "large file upload in the browser" ], "sample_prompts": [ {@@ -187,5 +201,5 @@ "prompt": "Download the puppeteer-bridge zip from the wiki and walk me through server.js" } ],- "changelog": "Never a bare Chrome taskbar button during recovery (pup-bridge#143): an OS-level health-tick safety net stamps a pup identity on any pup Chrome-for-Testing window that has no session yet (the gap after a restart or worker-reload cycle while the extension channel re-handshakes), so a pup window never falls back to the stock Chrome button; it reads+stamps only and never touches the lane/kill paths, and the real per-thread tile upgrades it once adopt_stray re-adopts the window."+ "changelog": "New verb pup_upload_file (pup-bridge#145): put a file from this PC on a page's file input with no OS dialog, at any size, on both lanes, including an input the page creates when Browse is clicked; it checks the path first, reads the input back, gives the page one change event per call, and refuses key and password files, AppData, system folders and network paths." }
page.json+17−3@@ -4,7 +4,7 @@ "slug": "pup-bridge", "title": "Pup - the AI's own browser", "brief": "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.",- "version": "2.0.739",+ "version": "2.0.740", "tags": [ "skills", "pup",@@ -86,7 +86,21 @@ "log in to mouser", "log in to digikey", "sign in problem",- "stuck on the login page"+ "stuck on the login page",+ "upload a file in pup",+ "pup upload",+ "pup upload file",+ "upload a file to a page",+ "upload a file to a website",+ "attach a file to a form",+ "file input",+ "input type file",+ "upload gerbers",+ "upload gerber zip to jlcpcb",+ "fill the jlcpcb quote form",+ "set file input without the file picker",+ "browser file upload without a dialog",+ "large file upload in the browser" ], "discovery_pitch": "pup gives your AI its own real browser on your desktop, driven in the background, signed in as you. It can import every password saved in your Chrome or Edge in one approval, then sign you into sites by itself, so the AI never stalls at a login page. Open pages, click, type, screenshot, record, and keep one window per AI thread on your taskbar. Say 'open it in pup' or 'import my saved passwords into pup'.", "sample_prompts": [@@ -207,5 +221,5 @@ "Kyle Bergstedt <[email protected]>", "Colby Knox" ],- "changelog": "Never a bare Chrome taskbar button during recovery (pup-bridge#143): an OS-level health-tick safety net stamps a pup identity on any pup Chrome-for-Testing window that has no session yet (the gap after a restart or worker-reload cycle while the extension channel re-handshakes), so a pup window never falls back to the stock Chrome button; it reads+stamps only and never touches the lane/kill paths, and the real per-thread tile upgrades it once adopt_stray re-adopts the window."+ "changelog": "New verb pup_upload_file (pup-bridge#145): put a file from this PC on a page's file input with no OS dialog, at any size, on both lanes, including an input the page creates when Browse is clicked; it checks the path first, reads the input back, gives the page one change event per call, and refuses key and password files, AppData, system folders and network paths." }