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.
Autodesk sign-in refuses Chrome for Testing UA - need userAgent override on pup_open_window
Title is now inaccurate. This is NOT a user-agent problem. Corrected diagnosis and a new proposal below (edited 2026-08-22 after a direct fingerprint comparison).
Corrected diagnosis: the UA was a red herring
The original framing here (and my first reply) blamed pup's Chrome for Testing user agent, then "something in the CDP environment." I ran a direct fingerprint comparison across three surfaces to settle it, and the UA / Client-Hints theory is dead. Raw captures:
pup, CfT (its real default engine, pup_use auto picks chrome-for-testing win64-148):
navigator.webdriver : false
UA tail : ...Chrome/148.0.0.0 Safari/537.36
UA-CH brands : [Not/A)Brand 99, Google Chrome 148, Chromium 148]
fullVersionList : Google Chrome 148.0.0.0, Chromium 148.0.0.0
platform : Windows
pup, forced system Chrome (pup_use chrome, 148):
navigator.webdriver : false
UA-CH brands : [Not/A)Brand 99, Google Chrome 148, Chromium 148]
platform : Windows
Real branded Chrome via the nbe, user's real profile (baseline, 151):
navigator.webdriver : false
UA-CH brands : [Not=A?Brand 99, Google Chrome 151, Chromium 151]
platform : Windows
The key result: CfT already reports the UA-CH brand as "Google Chrome" (not "Chrome for
Testing"), with webdriver:false, in the same shape as real branded Chrome. So Autodesk is not
gating on the UA string, the Client-Hints brand list, the full version list, or the webdriver flag.
A userAgent override (the original ask) would change nothing, so that ask is withdrawn.
What Autodesk is actually keying on (signals a fingerprint dump can't show)
- CDP / debugger presence. pup drives CfT over an external
--remote-debugging-portCDP connection. That launch and connection are behaviorally detectable (remote-debugging websocket probes, Runtime-timing side effects), and it is the one factor common to every run that tripped the gate, on pup AND on the nbe. It is invisible tonavigator.*and visible to a real bot SDK. - CfT binary artifacts. Chrome for Testing ships without the Widevine CDM and some proprietary codecs, and cannot emit Google's browser-integrity / attestation signals that branded Chrome can. A detector probing media capabilities, DRM, or web-environment-integrity sees "not real branded Chrome" regardless of what the UA claims.
- Cold, reputationless profile. CfT's cache profile carries no Autodesk cookies or history. Bot scorers weight "brand-new unknown device, zero interaction entropy" heavily. This is exactly why the nbe's real profile sails through: real cookies, real device reputation.
It is a scoring threshold, not a single binary check, which is why pup cleared the password page on one run and tripped on others.
Proposal (John, 2026-08-22): an AI-requestable "act-native" pup mode
Instead of masking the UA, minimize or remove the CDP signal for the sensitive steps. A mode pup
exposes on request (e.g. pup_open_window {actNative:true}):
- Load an Adom driving extension INTO CfT via
--load-extension. CfT honors this flag (it is the very reason pup uses CfT, per docs/WHY-CFT.md), so pup can side-load its own controller extension at launch with zero install UI. - Do all CDP-only setup up front (inject an
addScriptToEvaluateOnNewDocumentstealth preload, prime the extension), then drop the external CDP connection so no--remote-debugging-portwebsocket is live while the auth page's fingerprint JS runs. - Drive via the extension after that. Read, navigate, and synthetic events need no debugger at
all. For the one step that needs isTrusted input (the credential submit), the extension uses the
chrome.debuggerextension API and idle-detaches immediately after, exactly the nbe's lazy-attach / idle-detach discipline. An extension'schrome.debuggeris a different, more "blessed" fingerprint than an external remote-debugging-port connection, and it is attached only for the input microsecond. - Use a durable, warmed profile so the account and device accrue Autodesk trust across runs instead of presenting cold every time.
In short: make pup behave like the nbe without requiring the user to install the nbe, which is the whole reason pup matters for the Fusion bridge's no-extension users.
Honest limits (so we build the right thing)
- isTrusted input for the credential submit still needs
chrome.debuggerat that instant. Synthetic-only extension input (the no-debugger path) does not reliably work on hardened React auth forms: we already proved the native-value-setter approach fails to register React state on Autodesk's password page. So the debugger can be shrunk to a microsecond and hidden behind the extension API, but not fully removed for that one step. - CfT's binary artifacts (no Widevine, no integrity attestation) stay distinguishable from branded Chrome for a detector that checks them. Only real branded Chrome (the nbe path) fully closes that. act-native narrows the gap a lot, but CfT cannot become byte-identical to branded Chrome.
- Net: act-native likely beats mid-tier bot detection (DigiKey, Mouser) outright and materially improves the odds against Autodesk's stricter stack, but the guaranteed-clean Autodesk path stays the nbe (real Chrome plus real profile) or a one-time OS-level SendInput submit.
Repro is scripted (about 2 minutes) and I can run any candidate build against the live Autodesk, DigiKey, and Mouser flows immediately.