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.
master
John Lauer
rust: Phase 3 complete (vault, cards, wiki auto-sign + view flip, annotate, tab + screen recording, highFps lease, down…
4869577
2mo ago
((thread, profile, avatar, ident) => {
try {
const add = () => {
try {
const root = document.documentElement; if (!root) return;
if (root.querySelector('div[data-pup-owner]')) return;
const host = document.createElement('div');
host.setAttribute('data-pup-owner', '1');
host.style.cssText = 'position:fixed;left:8px;bottom:8px;z-index:2147483647;pointer-events:none;margin:0;padding:0;';
const sh = host.attachShadow ? host.attachShadow({ mode: 'closed' }) : null;
const lead = avatar
? '<img class="av" alt="" src="data:image/png;base64,' + avatar + '">'
: '<span class="hx">⬢</span>';
const html = '<style>.c{display:flex;align-items:center;gap:6px;font:11px/1.35 "JetBrains Mono",ui-monospace,SFMono-Regular,monospace;color:#7fe9e2;background:rgba(13,17,23,.72);border:1px solid rgba(0,184,177,.45);border-radius:13px;padding:2px 9px 2px 3px;white-space:nowrap;opacity:.92;transition:opacity .5s ease;user-select:none}.c b{color:#e6edf3;font-weight:600}.av{width:20px;height:20px;border-radius:50%;object-fit:cover;flex:0 0 auto;border:1px solid rgba(0,184,177,.55)}.hx{padding-left:5px}.dim{opacity:.3}</style>'
+ '<div class="c" id="pupc" title="' + (ident ? String(ident) + ' — ' : '') + 'Adom pup">' + lead + '<span><b>' + String(thread) + '</b> · ' + String(profile) + '</span></div>';
if (sh) { sh.innerHTML = html; } else { host.innerHTML = html; }
root.appendChild(host);
const el = sh ? sh.getElementById('pupc') : host.querySelector('#pupc');
setTimeout(() => { try { if (el) el.classList.add('dim'); } catch (e) {} }, 4500);
} catch (e) {}
};
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', add, { once: true });
else add();
} catch (e) {}
})(__THREAD__, __PROFILE__, __AVATAR__, __IDENT__);