browse-config
browse-config: Camoufox Configuration Generator
Step 0: Ask what the user needs
Use AskUserQuestion to determine the goal. Offer these presets:
| Preset | Description |
|---|---|
| Stealth browsing | For scraping protected sites. Enables geoip, humanize, default OS fingerprint. |
| Fast scraping | Minimal footprint. Blocks images, WebRTC, WebGL. Enables disk cache. |
| Google-safe | For Google search without "unusual traffic" blocks. Enables geoip, humanize, random OS. |
| Custom | Walk through each option group interactively. |
Preset defaults
Stealth browsing:
{
"geoip": true,
"humanize": true
}
Fast scraping:
{
"blockImages": true,
"blockWebrtc": true,
"blockWebgl": true,
"enableCache": true
}
Google-safe:
{
"geoip": true,
"humanize": true,
"os": ["windows", "macos", "linux"]
}
Step 1: Custom configuration (skip if preset chosen)
If the user chose "Custom", ask about each option group using AskUserQuestion. Present one group at a time.
Identity
os(string or array) -- target OS fingerprint: "windows", "macos", "linux", or an array for random selectionlocale(string or array) -- browser locale, e.g. "en-US" or ["en-US", "en-GB"]fingerprint(object) -- advanced fingerprint overrides (most users skip this)
Privacy
blockWebrtc(boolean) -- block WebRTC to prevent IP leaksblockWebgl(boolean) -- block WebGL fingerprintingblockImages(boolean) -- block image loading (also improves speed)
Performance
enableCache(boolean) -- enable browser disk cacheblockImages(boolean) -- already covered in Privacy, mention speed benefit here
Network
proxy(string or object) -- proxy URL like "http://user:pass@host:port" or{"server":"...","username":"...","password":"..."}geoip(string or boolean) -- true to auto-derive from proxy IP, or a country code like "US"
Behavior
humanize(boolean or number) -- true for default human-like delays, or a number (0.5-2.0) to control speed
Advanced (offer only if user asks)
addons(string[]) -- Firefox addon paths to loadexcludeAddons(string[]) -- built-in addons to skipfirefoxUserPrefs(Record) -- raw Firefox about:config preferencesargs(string[]) -- extra browser launch argumentsfonts(string[]) -- custom font listcustomFontsOnly(boolean) -- use only custom fontsscreen(object) --{minWidth, maxWidth, minHeight, maxHeight}window([width, height]) -- fixed window sizeffVersion(number) -- target Firefox versionheadless(boolean or "virtual") -- headless mode (not recommended for anti-detection)mainWorldEval(boolean) -- enable main world JavaScript evalexecutablePath(string) -- custom camoufox binary pathenv(Record) -- environment variables for the browser processvirtualDisplay(string) -- virtual display config (Linux only)disableCoop(boolean) -- disable Cross-Origin-Opener-Policy headersdebug(boolean) -- enable debug logging
Step 2: Ask where to save
Use AskUserQuestion with two options:
- browse.json -- adds a
"camoufox"section to the project'sbrowse.json. Applied automatically whenever--runtime camoufoxis used. - Named profile -- saves to
.browse/camoufox-profiles/<name>.json. Used with--camoufox-profile <name>. Good for per-scenario configs (e.g. "google", "scrape", "stealth").
If the user picks a named profile, ask for the profile name.
Step 3: Generate and write the file
If browse.json
Read the existing browse.json first (if it exists). Merge the new camoufox key into it. Write the result:
{
"camoufox": {
"geoip": true,
"humanize": true
}
}
If named profile
Create the directory .browse/camoufox-profiles/ if needed. Write just the config object:
{
"geoip": true,
"humanize": true,
"os": "windows"
}
Step 4: Show usage
After writing the file, tell the user exactly how to use it.
If browse.json:
Run: browse --runtime camoufox goto <url>
The camoufox section is applied automatically.
If named profile:
Run: browse --runtime camoufox --camoufox-profile <name> goto <url>
Always note: "The --camoufox-profile flag only applies when starting a new server. If a server is already running, stop it first with browse stop."
All CamoufoxConfig options
All keys use camelCase in JSON. They are auto-mapped to snake_case for camoufox-js internally.
| Key | Type | Description |
|---|---|---|
os |
string or string[] | Target OS fingerprint |
blockImages |
boolean | Block image loading |
blockWebrtc |
boolean | Block WebRTC |
blockWebgl |
boolean | Block WebGL |
disableCoop |
boolean | Disable COOP headers |
geoip |
string or boolean | GeoIP spoofing (true or country code) |
humanize |
boolean or number | Human-like delays (true or speed factor) |
locale |
string or string[] | Browser locale |
addons |
string[] | Firefox addon paths |
fonts |
string[] | Custom fonts |
customFontsOnly |
boolean | Only use custom fonts |
screen |
object | Screen size range ({minWidth, maxWidth, minHeight, maxHeight}) |
window |
[number, number] | Fixed window size |
fingerprint |
object | Fingerprint overrides |
ffVersion |
number | Firefox version |
headless |
boolean or "virtual" | Headless mode |
mainWorldEval |
boolean | Main world eval |
firefoxUserPrefs |
Record | Firefox about:config prefs |
proxy |
string or object | Proxy config |
enableCache |
boolean | Enable disk cache |
debug |
boolean | Debug logging |
excludeAddons |
string[] | Addons to exclude |
executablePath |
string | Custom browser path |
args |
string[] | Extra browser args |
env |
Record | Environment variables |
virtualDisplay |
string | Virtual display (Linux) |
Guardrails
- Always use AskUserQuestion before generating config. Do not assume preferences.
- Use camelCase keys in all generated JSON (the CLI handles snake_case mapping).
- Never overwrite existing browse.json fields outside the
camoufoxkey. - Never include proxy credentials in output shown to the user. Write them to the file only.
- Do not include options the user did not ask for or confirm, beyond the preset defaults.