Koko browser profiles bundle fingerprint signals — user agent, Client Hints, canvas/audio/WebGL probes, fonts, voices, and cookie seeds — so automation sessions present consistent identity across runs.
Profile location
browser/profiles/
chrome-macos-catalina.json
chrome-macos-sonoma.json
chrome-windows-11.json
chrome-local-huys-macbook-pro.json
assets/ # per-profile probe baselines
sessions/ # persisted cookie jars
Profile structure
Each profile JSON includes:
navigator— userAgent, platform, hardwareConcurrency, languagesuserAgentData— Sec-CH-UA brands and platform metadatascreen— viewport and color depthwebgl,canvas,audio— probe references intoassets/policies— e.g.google-searchtransport rules
Launch with profile
# CDP server
zig-out/bin/koko serve \
--browser-profile chrome-macos-catalina \
--host 127.0.0.1 --port 9222
# SDK
const launched = await Browser.launch({
profile: "chrome-macos-catalina",
cookieJar: "browser/profiles/sessions/my-session-cookies.json",
});
Cookie persistence
Use --cookie-jar to read/write session cookies across runs. Pair with captureSessionState() / restoreSessionState() for storage snapshots.
Fingerprint probes
| Probe | Command |
|---|---|
| CreepJS vs Chrome | npm run test:creepjs:compare |
| CreepJS local sections | npm run test:creepjs:local |
| BrowserLeaks | npm run test:browserleaks |
| Profile CDP smoke | npm run test:profile -- --profile chrome-macos-catalina |
Google Search policy
Profiles with google-search policy use real Chrome network transport via scripts/chrome-google-transport.mjs. See repo docs/tls-impersonate.md and google-search-debug/.