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.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
// Adom Pup floaty pencil: the annotate feature's discoverability handle (John 2026-08-10).
// A tiny monochrome pencil in the page's upper-right; click = enter annotate (red pen) mode.
// Rendered by the extension (not pup injection) so the click can route through the worker to
// pup's loopback. Gated by pup's tbFloatyPencil setting (checked once per page load).
(async () => {
if (window !== window.top) return;
if (window.__pupFloatyInstalled) return;
window.__pupFloatyInstalled = true;
try {
let cfg = null;
try { cfg = await chrome.runtime.sendMessage({ t: 'pup-floaty-cfg' }); } catch (e) {}
if (!cfg || !cfg.enabled) return;
const host = document.createElement('div');
host.style.cssText = 'position:fixed;top:14px;right:14px;z-index:2147483645;pointer-events:auto;';
const root = host.attachShadow({ mode: 'closed' });
const btn = document.createElement('button');
btn.setAttribute('aria-label', 'Annotate this page');
btn.style.cssText = 'width:30px;height:30px;border-radius:8px;display:grid;place-items:center;'
+ 'background:rgba(13,17,23,.72);border:1px solid rgba(0,184,177,.45);cursor:pointer;'
+ 'opacity:.55;transition:opacity .15s ease;padding:0;';
btn.innerHTML = '<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="#e6edf3" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 20l1.5-4.5L16 5a2.1 2.1 0 0 1 3 3L8.5 18.5 4 20z"/><path d="M13.5 7.5l3 3"/></svg>';
btn.onmouseenter = () => { btn.style.opacity = '1'; tipShow(); };
btn.onmouseleave = () => { btn.style.opacity = '.55'; tipHide(); };
btn.onclick = () => { tipHide(); chrome.runtime.sendMessage({ t: 'pup-annotate', tool: 'pen' }).catch(() => {}); };
root.appendChild(btn);
// great tooltip (tooltips skill: 600ms reveal, 0.18s fade, measured then clamped both axes)
const tip = document.createElement('div');
tip.textContent = 'Draw on this page to show your AI exactly what you mean; a red circle says it best. '
+ 'Click to start, or press Alt+Shift+A anytime. The moment you lift the mouse, the marked-up '
+ 'area is copied to your clipboard, ready to paste into any AI chat.';
tip.style.cssText = 'position:fixed;z-index:2147483647;max-width:280px;background:#21262d;'
+ 'border:1px solid #30363d;border-radius:8px;padding:7px 10px;'
+ 'font:12px Satoshi,system-ui,sans-serif;color:#c9d1d9;box-shadow:0 6px 20px #000b;'
+ 'pointer-events:none;opacity:0;transform:translateY(4px);transition:opacity .18s ease,transform .18s ease;';
root.appendChild(tip);
let timer = null;
function tipShow() {
clearTimeout(timer);
timer = setTimeout(() => {
requestAnimationFrame(() => {
const a = btn.getBoundingClientRect(), M = 8, w = tip.offsetWidth, h = tip.offsetHeight;
let x = a.right - w, y = a.bottom + 10;
if (y + h > innerHeight - M) y = a.top - h - 10;
x = Math.min(Math.max(M, x), innerWidth - w - M);
y = Math.min(Math.max(M, y), innerHeight - h - M);
tip.style.left = x + 'px'; tip.style.top = y + 'px';
tip.style.opacity = '1'; tip.style.transform = 'translateY(0)';
});
}, 600);
}
function tipHide() { clearTimeout(timer); tip.style.opacity = '0'; tip.style.transform = 'translateY(4px)'; }
(document.body || document.documentElement).appendChild(host);
} catch (e) {}
})();