Camoufox Stealth Browser
C++ level anti-bot browser automation using Camoufox (patched Firefox) in isolated containers. Bypasses Cloudflare Turnstile, Datadome, Airbnb, Yelp. Superior to Chrome-based solutions (undetected-chr
C++ level anti-bot browser automation using Camoufox (patched Firefox) in isolated containers. Bypasses Cloudflare Turnstile, Datadome, Airbnb, Yelp. Superior to Chrome-based solutions (undetected-chr
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
C++ level anti-bot evasion using Camoufox — a custom Firefox fork with stealth patches compiled into the browser itself, not bolted on via JavaScript.
| Approach | Detection Level | Tools |
|---|---|---|
| Camoufox (this skill) | C++ compiled patches | Undetectable fingerprints baked into browser |
| undetected-chromedriver | JS runtime patches | Can be detected by timing analysis |
| puppeteer-stealth | JS injection | Patches applied after page load = detectable |
| playwright-stealth | JS injection | Same limitations |
Camoufox patches Firefox at the source code level — WebGL, Canvas, AudioContext fingerprints are genuinely spoofed, not masked by JavaScript overrides that anti-bot systems can detect.
puppeteer-stealth or undetected-chromedriver stopped working| Tool | Level | Best For |
|---|---|---|
| Camoufox | C++ patches | All protected sites - Cloudflare, Datadome, Yelp, Airbnb |
| curl_cffi | TLS spoofing | API endpoints only - no JS needed, very fast |
All scripts run in
pybox distrobox for isolation.
⚠️ Use
explicitly - pybox may have multiple Python versions with different packages installed.python3.14
# Install tools in pybox (use python3.14) distrobox-enter pybox -- python3.14 -m pip install camoufox curl_cffiCamoufox browser downloads automatically on first run (~700MB Firefox fork)
Browser (Camoufox):
distrobox-enter pybox -- python3.14 scripts/camoufox-fetch.py "https://example.com" --headless
API only (curl_cffi):
distrobox-enter pybox -- python3.14 scripts/curl-api.py "https://api.example.com/endpoint"
┌─────────────────────────────────────────────────────────┐ │ OpenClaw Agent │ ├─────────────────────────────────────────────────────────┤ │ distrobox-enter pybox -- python3.14 scripts/xxx.py │ ├─────────────────────────────────────────────────────────┤ │ pybox Container │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ Camoufox │ │ curl_cffi │ │ │ │ (Firefox) │ │ (TLS spoof)│ │ │ └─────────────┘ └─────────────┘ │ └─────────────────────────────────────────────────────────┘
Datacenter IPs (AWS, DigitalOcean) = INSTANT BLOCK on Airbnb/Yelp
You MUST use residential or mobile proxies:
# Example proxy config proxy = "http://user:pass@residential-proxy.example.com:8080"
See references/proxy-setup.md for proxy configuration.
Sites like Airbnb/Yelp use behavioral analysis. To avoid detection:
⚠️ Old
--headless flag is DETECTED. Options:
headless="new" (Chrome 109+)# Xvfb approach (Linux) Xvfb :99 -screen 0 1920x1080x24 & export DISPLAY=:99 python scripts/camoufox-fetch.py "https://example.com"
| Problem | Solution |
|---|---|
| "Access Denied" immediately | Use residential proxy |
| Cloudflare challenge loops | Try Camoufox instead of Nodriver |
| Browser crashes in pybox | Install missing deps: |
| TLS fingerprint blocked | Use curl_cffi with |
| Turnstile checkbox appears | Add mouse movement, increase wait time |
| Use not or |
segfault (exit 139) | Python version mismatch - use explicitly |
errors | NixOS lib path issue - use in pybox |
The
pybox container may have multiple Python versions with separate site-packages:
# Check which Python has camoufox distrobox-enter pybox -- python3.14 -c "import camoufox; print('OK')"Wrong (may use different Python)
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py ...
Correct (explicit version)
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py ...
If you get segfaults or import errors, always use
python3.14 explicitly.
distrobox-enter pybox -- python3.14 scripts/camoufox-fetch.py \ "https://www.airbnb.com/rooms/12345" \ --headless --wait 10 \ --screenshot airbnb.png
distrobox-enter pybox -- python3.14 scripts/camoufox-fetch.py \ "https://www.yelp.com/biz/some-restaurant" \ --headless --wait 8 \ --output yelp.html
distrobox-enter pybox -- python3.14 scripts/curl-api.py \ "https://api.yelp.com/v3/businesses/search?term=coffee&location=SF" \ --headers '{"Authorization": "Bearer xxx"}'
Persistent sessions allow reusing authenticated state across runs without re-logging in.
# 1. Login interactively (headed browser opens) distrobox-enter pybox -- python3.14 scripts/camoufox-session.py \ --profile airbnb --login "https://www.airbnb.com/account-settings"Complete login in browser, then press Enter to save session
2. Reuse session in headless mode
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py
--profile airbnb --headless "https://www.airbnb.com/trips"3. Check session status
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py
--profile airbnb --status "https://www.airbnb.com"
| Flag | Description |
|---|---|
| Named profile for session storage (required) |
| Interactive login mode - opens headed browser |
| Use saved session in headless mode |
| Check if session appears valid |
| Export cookies to JSON for backup |
| Import cookies from JSON file |
~/.stealth-browser/profiles/<name>/700, files 600_, - only (1-63 chars)The script detects session expiry using multiple signals:
/login, /signin, /authIf detected during
--headless mode, you'll see:
🔒 Login wall signals: url-path, password-form
Re-run with
--login to refresh the session.
Since
--login requires a visible browser, you need display forwarding:
X11 Forwarding (Preferred):
# Connect with X11 forwarding ssh -X user@serverRun login (opens browser on your local machine)
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py
--profile mysite --login "https://example.com"
VNC Alternative:
# On server: start VNC session vncserver :1On client: connect to VNC
vncviewer server:1
In VNC session: run login
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py
--profile mysite --login "https://example.com"
⚠️ Cookies are credentials. Treat profile directories like passwords:
chmod 700 (owner only)chmod 600| Limitation | Reason |
|---|---|
| localStorage/sessionStorage not exported | Use browser profile instead (handles automatically) |
| IndexedDB not portable | Stored in browser profile, not cookie export |
| No parallel profile access | No file locking in v1; use one process per profile |
No automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.