Closed bug report

Chrome-for-Testing cache grows without bound: 3 full builds + partial downloads = 1.63 GB on a normal box

John Lauer · 1mo ago ·closed by John Lauer

Measured on arav-rog 2026-09-22 while sizing what a default install costs on disk. ~/.cache/puppeteer is 1.63 GB, and nothing in it is a duplicate of anything ab keeps:

chrome                   win64-146.0.7680.76     408.2 MB   308 files   2026-06-29
chrome                   win64-148.0.7778.97     412.2 MB   308 files   2026-09-05
chrome                   win64-152.0.7977.82     427.9 MB   308 files   2026-09-13   <- the one in use
chrome-headless-shell    win64-146.0.7680.76     264.0 MB   290 files   2026-06-29
chrome-headless-shell    win64-148.0.7778.97       1.8 MB     2 files   2026-07-24   <- looks like a failed/partial fetch
chrome-headless-shell-dl chrome-headless-shell   113.1 MB     3 files   2026-06-29   <- a stray download dir

Three full Chrome-for-Testing builds are kept forever: every upgrade adds ~410 MB and nothing prunes the one it replaced. The two headless-shell entries and the -dl directory look like leftovers of interrupted installs. A box that has been running pup for a few months pays ~1.2 GB for browsers it will never launch again.

Asks, all pup-side (this cache is entirely pup's now — ab stopped downloading Chrome for Testing in 2.1.147, when its bundled pup lifecycle module was deleted; ab's prewarm_cft setting was inert after that and is removed in 2.1.152, so nothing in ab touches this cache any more):

  1. After a successful browsers install, remove superseded builds of the same product, keeping the one now resolved (and anything a running process is using). A pup_gc / pup_cache_prune verb would also let an AI reclaim it on demand and report the bytes.
  2. Clean up partial fetches: a *-dl directory and a 2-file "install" are dead weight that also make a resolver's "is it present?" check ambiguous.
  3. Consider whether chrome-headless-shell is still wanted at all now that pup drives a real window; if it is, it needs the same pruning.

For reference, ab does the same for its own managed runtimes and for bridge caches: 2.1.152 drops a bridge's node_modules when the installed version is not node-kind, which is how pup's own 65.8 MB of JS-era npm deps outlived the Rust port on every box that had the JS version (that one is ab's bug and is fixed there, no action needed from you).

1 Reply

John Lauer · 1mo ago

Fixed in 2.0.677 (insiders).

pup now prunes ~/.cache/puppeteer a minute after every boot, and on demand with pup_cache_prune (dryRun:true reports without deleting; replies list removed with MB, kept with the reason, and freedMB).

  • Kept: the pinned build; the newest complete build when the pinned one is missing, because it is what drives an offline box; and any build that a running browser or pup's saved default browser points into.
  • Removed: every other chrome/<platform>-<build>; the whole chrome-headless-shell tree, which the Rust pup never uses, so nothing re-fetches it; the *-dl leftovers; and partial builds.

Measured after install, all three boxes left with only chrome/win64-152.0.7977.82:

box removed freed
arav-rog 4 entries 1199 MB
AdomLapper 3 entries 1351 MB
ConfRoomROG 3 entries 1351 MB

All ship gates pass on ConfRoomROG afterwards: the foreground proof, the smoke, parity at 55/56 and the jump-list gate at 12/15. So the remaining build launches.

John Lauer closed this · 1mo ago

Log in to reply.