--- title: Steel Browser vs Camoufox type: comparison status: active created: 2026-07-29 updated: 2026-08-02 verified_on: 2026-08-02 confidence: high tags: [comparison, browser, steel, camofox, decision] sources: [live-probe, session-history] --- # Steel Browser vs Camoufox ## Purpose Compare the two browser-automation backends available to Hermes, including the Jul 29–30 experiment and the decision to revert. ## At a glance | | Steel Browser (CT201) | Camoufox (CT450) | |---|---|---| | **In use** | Disabled since 2026-07-30 | **Yes** — primary backend | | **Engine** | Chromium 140 (Playwright) | Camoufox (Firefox-based) | | **Connection** | CDP (`ws://` via port 9223) | REST API (localhost:9093) | | **API** | REST at `:3000` — create/destroy/query sessions | Camoufox REST + CDP WebSocket | | **Headless** | Native headless | Xvfb + VNC (headed, anti-fingerprint) | | **Container** | Docker on CT201 | Systemd service on CT450 | | **Stealth** | Standard Chromium | Anti-detection fingerprinting | | **Session viewer** | Built-in UI at `/steel` | VNC at `/vnc-camofox` | | **Plugin** | `browser-steel` plugin (disabled) | Native Hermes `browser.cloud_provider: camofox` | ## The Steel Experiment (Jul 29–30) ### Why it was tried - Steel promised full CDP access for richer browser control - Built-in session viewer and management UI - Docker-based, clean separation from Hermes host ### Timeline 1. **Jul 29:** Steel deployed on CT201 via Docker Compose, Chromium 140. Hermes configured with `browser.cloud_provider: steel`, `browser-steel` plugin enabled. 2. **Jul 29 (later):** CDP connectivity issues surfaced — Hermes was reaching `0.0.0.0` from the plugin's internal CDP URL. Required `_normalize_cdp_url()` patch in the Steel plugin to remap to `100.96.244.39`. 3. **Jul 30:** DeepSeek V4 Flash 0731 went live and rejected tool names that didn't match `^[a-zA-Z0-9_-]+$`. The Steel plugin's tools (`steel_scrape`, `steel_session_options`) were fine, but the route through OmniRoute → Steel → CDP was unreliable with empty-stream errors. 4. **Jul 30 (evening):** Decision to revert — Camoufox re-enabled, browser-steel plugin disabled, `CAMOFOX_URL` and `CAMOFOX_API_KEY` uncommented in `.env`. Steel left running on CT201 but Hermes no longer routes through it. ### What broke - CDP URL normalization required a plugin patch to handle Docker's internal networking - Empty-stream errors from `opencode-go/deepseek-v4-flash` provider path — the combo strategy does NOT iterate on empty responses, they pass to Hermes's own fallback chain (the #1 cause of "combo works but Hermes falls back") - Tool name validation on DeepSeek 0731 was stricter — this affected all providers, not just Steel ### Lesson learned Steel is a capable backend but adds a network hop and another plugin layer. Camoufox runs locally on CT450 with fewer failure modes. The `browser-steel` plugin still exists (disabled) if needed in future. ## Detail ### Camoufox (current primary) - **Deployed:** Persistent systemd service on CT450 - **Connection:** REST API at `localhost:9093`, profile `anthony`, sessionKey `anthony` - **Key advantage:** Runs on the same host as Hermes — no network hop, no container networking to debug - **Auth:** Already authenticated into services (Uber Eats, LinkedIn, etc.) — no cookie files needed - **Limitation:** Headed via Xvfb, consumes display resources ### Steel Browser (disabled but available) - **Deployed:** 2026-07-29 on CT201, Docker, custom `steel-browser-api:fixed` image - **Status:** Still running on CT201, Hermes not connected - **CDP endpoint:** `http://100.96.244.39:9223` - **REST API:** `http://100.96.244.39:3000` - **UI:** `https://runtipi.kangaroo-eel.ts.net/steel` - **Plugin:** `browser-steel` at `/home/hermes/.hermes/plugins/browser-steel/` — disabled, `plugin_steel` toolset flagged `requires_health=steel` ## Related - [[systems/browser-backend]] - [[concepts/browser-automation]] - [[decisions/rollback-steel-to-camofox]]