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
Promote John's settle-on-screen-at-open design to PRIMARY fix: park only for the launch instant, then place at the real on-screen rect with SWP_NOACTIVATE + HWND_BOTTOM so a taskbar click needs no pup code at all; enforcement layers demoted to safety net
1 file changed
+11−1
PLACEMENT-INVARIANT.md+11−1@@ -9,7 +9,17 @@ monitor; it looked dead. Every backgrounded pup window carries this trap today. A pup window is EITHER background-and-parked OR foreground-and-on-screen — never foreground/user-activated while off-screen, and never on-screen while claiming to be parked. -## The process: ONE enforcement function, MANY triggers+## PRIMARY FIX (John's design, 2026-07-26): settle on-screen at open — don't stay parked+The off-screen park is only needed for the LAUNCH INSTANT (Chrome's foreground grab; already+neutralized by --no-startup-window). Once the open settles, MOVE the window to its real+on-screen rect (work-area of the target monitor) with SWP_NOACTIVATE + HWND_BOTTOM — visible+position, bottom of z-order, zero focus steal, still covers nothing the user is working on.+Then a later taskbar click is just Windows foregrounding a correctly-placed window: no pup+code in the path, nothing to catch. Known tradeoff, accepted: the window shows in+desktop-peek / when everything else is minimized. The enforcement layers below become the+SAFETY NET for drift (recovery, monitor changes, DPI moves), not the primary mechanism.++## The safety net: ONE enforcement function, MANY triggers Write a single `enforcePlacement(session, sessionId, cause)` that reads the real OS rect + foreground state and repairs violations (slide on-screen if user-activated; re-park if a background window drifted on-screen half-visible). Then call it from every layer: