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
WHY-CFT: replace the Firefox feasibility reasoning with a measured spike (13 of 15 pup verbs work, the 2 failures are exactly the CDP window-management ones), and record the latest-resolves-to-nightly trap
1 file changed
+37−2
docs/WHY-CFT.md+37−2@@ -297,8 +297,43 @@ There is real demand for this and it is not crazy: **the toolchain already suppo ``` So "can Puppeteer drive Firefox" is settled: yes, over **WebDriver BiDi** (Firefox removed its CDP-implementation in favour of the standard). The work is not in the driving, it is in everything pup-has built ON TOP of Chrome-specific behaviour. Honest inventory, worst first:+implementation in favour of the standard).++### Spiked for real (2026-08-25): 13 of 15 verbs work today++Rather than reason about it, we installed Firefox through the pinned toolchain and drove it through+pup's actual Phase 1 verb set. Install took **10 seconds**. Every result below is measured:++| pup verb | Firefox | notes |+|---|---|---|+| launch | works | 2.3s, reports `firefox/156.0a1` |+| newPage | works | |+| goto | works | HTTP 200 |+| title / url | works | |+| evaluate | works | 8ms, returned real DOM text |+| setViewport | works | |+| screenshot | works | 41ms |+| click | works | |+| pages | works | |+| pdf | works | |+| close | works | |+| **createCDPSession** | **UnsupportedOperation** | pup uses this 27 times |+| **`Browser.getWindowBounds`** | **UnsupportedOperation** | pup makes 35 `Browser.*` calls |++It also rendered this very wiki page correctly (hero image, dark theme, brand fonts intact), so this+is not a toy result.++**The failures are exactly the predicted ones, and nothing else.** Every raw-CDP call pup makes (~82,+of which 35 are `Browser.*` window management) is unavailable, and every high-level Puppeteer call+works. That is the whole shape of the problem in one table.++**One trap found while spiking:** `resolveBuildId(FIREFOX, platform, 'latest')` resolves to+**NIGHTLY** (`nightly_156.0a1`), not stable. Shipping that would hand every user a pre-release+browser that changes daily, which is the exact opposite of the version determinism in section 3. A+Firefox integration must pin an explicit stable buildId, not ask for "latest".++The work is not in the driving, it is in everything pup has built ON TOP of Chrome-specific+behaviour. Honest inventory, worst first: 1. **Window management is the big one.** 35 of pup's 55 raw CDP sends are `Browser.*`, mostly window bounds and state. BiDi has no equivalent surface, so every one of those needs a different path