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
v2.0.681 (insiders): A window is restored only when its browser is GONE (crash, sleep, upgrade). If the browser is alive and does not have the window, the window was CLOSED and pup forgets it. Before, any missing window read as a crash to repair, so windows the user closed while pup was restarting came back at the next boot (John, AdomLapper, 2026-09-23).
3 files changed
+27−13
rust/Cargo.lock+12−12@@ -10,7 +10,7 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "adom-pup-bridge"-version = "2.0.680"+version = "2.0.681" dependencies = [ "pup-browser", "pup-cdp",@@ -655,7 +655,7 @@ dependencies = [ [[package]] name = "pup-browser"-version = "2.0.680"+version = "2.0.681" dependencies = [ "pup-core", "pup-host",@@ -667,7 +667,7 @@ dependencies = [ [[package]] name = "pup-cdp"-version = "2.0.680"+version = "2.0.681" dependencies = [ "serde_json", "thiserror",@@ -677,7 +677,7 @@ dependencies = [ [[package]] name = "pup-core"-version = "2.0.680"+version = "2.0.681" dependencies = [ "serde", "serde_json",@@ -687,7 +687,7 @@ dependencies = [ [[package]] name = "pup-dashboard"-version = "2.0.680"+version = "2.0.681" dependencies = [ "pup-cdp", "pup-core",@@ -700,7 +700,7 @@ dependencies = [ [[package]] name = "pup-host"-version = "2.0.680"+version = "2.0.681" dependencies = [ "serde", "serde_json",@@ -709,14 +709,14 @@ dependencies = [ [[package]] name = "pup-host-mac"-version = "2.0.680"+version = "2.0.681" dependencies = [ "pup-host", ] [[package]] name = "pup-host-win"-version = "2.0.680"+version = "2.0.681" dependencies = [ "pup-core", "pup-host",@@ -726,7 +726,7 @@ dependencies = [ [[package]] name = "pup-identity"-version = "2.0.680"+version = "2.0.681" dependencies = [ "fontdue", "image",@@ -736,7 +736,7 @@ dependencies = [ [[package]] name = "pup-session"-version = "2.0.680"+version = "2.0.681" dependencies = [ "pup-core", "serde",@@ -746,7 +746,7 @@ dependencies = [ [[package]] name = "pup-vault"-version = "2.0.680"+version = "2.0.681" dependencies = [ "pup-core", "pup-host",@@ -757,7 +757,7 @@ dependencies = [ [[package]] name = "pup-verbs"-version = "2.0.680"+version = "2.0.681" dependencies = [ "base64", "png 0.17.16",
rust/Cargo.toml+1−1@@ -4,7 +4,7 @@ members = ["core", "host", "host-win", "host-mac", "cdp", "browser", "session", # One version for the whole bridge, in lockstep with src/BRIDGE_VERSION (tools/ship.sh bumps both). [workspace.package]-version = "2.0.680"+version = "2.0.681" edition = "2021" license = "MIT"
rust/verbs/src/recovery.rs+14@@ -144,6 +144,20 @@ pub fn relaunch_from_file(ctx: &Ctx, f: &Value) { } } }+ // 2.0.681 (John, 2026-09-23: "i fucking closed those windows on purpose cuz i don't fucking need them anymore").+ // A window is only RESTORED when its browser is GONE (a crash, a sleep, an upgrade). If the lane browser is alive+ // and simply does not have this window, the window was CLOSED — by the user, or by the page — and pup must forget+ // it. Before, any missing window was treated as a crash to repair, so windows the user closed while pup was+ // restarting (an install landed in that exact second on his laptop) came back at the next boot, twice.+ {+ let _scope = ProfileScope::enter(&profile);+ if crate::extdrive::alive(ctx) && !crate::extdrive_pids().is_empty() {+ pup_core::log(format!("[recovery] \"{id}\": its browser is running and does not have this window, so it was CLOSED, not lost; forgetting it (never restored)"));+ ctx.sessions.delete_file(&id);+ RELAUNCHES.lock().unwrap().retain(|(s, _)| *s != id);+ return;+ }+ } let attempts = { let mut m = RELAUNCHES.lock().unwrap(); match m.iter_mut().find(|(s, _)| *s == id) { Some(e) => { e.1 += 1; e.1 } None => { m.push((id.clone(), 1)); 1 } } }; if attempts > 2 { pup_core::log(format!("[recovery] \"{id}\" failed to come back twice — giving up on it (the page itself may be crashing Chrome); removing its file")); ctx.sessions.delete_file(&id); crate::push_cleanup_report(format!("pup could NOT auto-recover the \"{id}\" window: it crashed again on relaunch ({url}). Open it again yourself with pup_open_window if you still need it.")); return; } // (2.0.588: a window still on glass is never relaunched; that check now runs before the attempt counter.)