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+1−1@@ -1,6 +1,6 @@ { "slug": "pup-bridge",- "version": "2.0.331",+ "version": "2.0.332", "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": [
page.json+1−1@@ -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.331",+ "version": "2.0.332", "tags": [ "skills", "pup",
tools/pup-dashboard+7−1@@ -184,6 +184,7 @@ async function buildStatus() { detail: offline ? (tgt.name ? 'the desktop bridge is not answering' : 'no Adom Bridge is connected') : (cftOk ? (cft.version ? `installed, pinned ${cft.version}` : 'installed and pinned') : (bad(ready) ? `readiness could not be read (${ready.error || ready.errorCode || ready._err})` : (ready.reason || 'not installed yet'))),+ short: offline ? 'bridge offline' : (cftOk ? 'installed' : 'not installed'), _hint: offline ? 'Start Adom Bridge on the desktop, then reload this page.' : (cftOk ? null : 'Run pup_prewarm to install and warm Chrome for Testing before the first window.'), });@@ -195,6 +196,7 @@ async function buildStatus() { state: bad(status) ? 'fail' : 'ok', detail: bad(status) ? `pup_* verbs not answering (${status._err || status.error || status.errorCode})` : `pup ${status.version || '?'} answering on ${tgt.name}${tgt.all.length > 1 ? ` (of ${tgt.all.length} desktops: ${tgt.all.join(', ')})` : ''}`,+ short: bad(status) ? 'not answering' : 'answering', _hint: bad(status) ? 'Check Adom Bridge is running on the desktop and the puppeteer bridge is installed (bridge_install).' : null, }); @@ -208,6 +210,7 @@ async function buildStatus() { detail: bad(status) ? 'unknown' : (sessions.length ? `${sessions.length} window(s), ${tabs} tab(s): ` + sessions.map(s => `${s.sessionId}${s.owner ? ` (${s.owner})` : ''}`).join(', ') : 'no pup windows open right now'),+ short: bad(status) ? 'unknown' : (sessions.length ? `${sessions.length} open` : 'none open'), _hint: bad(status) ? null : 'Ask your AI to open one: pup_open_window {url}. It opens in the BACKGROUND and never steals your screen.', sessions: sessions.map(s => ({ sessionId: s.sessionId, owner: s.owner || null, tabs: Array.isArray(s.tabs) ? s.tabs.length : null })), });@@ -219,6 +222,7 @@ async function buildStatus() { label: 'Profile', state: bad(status) ? 'warn' : 'ok', detail: bad(status) ? 'unknown' : `durable profile "${prof || 'adom-you'}": logins persist across windows`,+ short: bad(status) ? 'unknown' : (prof || 'adom-you'), _hint: bad(status) ? null : 'Isolated throwaway instead: pup_open_window {isolated:true}.', }); @@ -452,7 +456,9 @@ async function load(){ var leds=d.leds||[]; document.getElementById('leds').innerHTML=leds.map(function(l,i){ var st=ledState(l.state);- var short=(l.detail||'').replace(/\\b\\d[\\d.]*\\b/g,'').replace(/ on [^.,;(]+/i,'').replace(/[.\\u2014(].*$/,'').replace(/\\s+/g,' ').trim().slice(0,26);+ var short=l.short||'';+ if(!short){ short=(l.detail||'').replace(/\\b\\d[\\d.]*\\b/g,'').replace(/ on [^.,;(]+/i,'').replace(/[.\\u2014(].*$/,'').replace(/\\s+/g,' ').trim();+ if(short.length>26){ var cut=short.slice(0,26); var sp=cut.lastIndexOf(' '); short=(sp>10?cut.slice(0,sp):cut)+'\\u2026'; } } return '<span class="led-pill" data-state="'+st+'" data-i="'+i+'"><span class="dot"></span><b>'+l.label+'</b> <span class="st">'+short+'</span></span>'; }).join(''); document.querySelectorAll('.led-pill').forEach(function(pill){