Are you the author? Sign in to claim
Cloud OpenCLI on Camofox anti-detection Firefox — 163+ site adapters in one Docker container. noVNC for QR login, cookie

Camofox + OpenCLI — 163+ website adapters in the cloud. One Docker container combining Camofox anti-detection browser + Shim bridge layer.
OpenCLI runs natively on your desktop — a Chrome browser on your laptop, a local daemon controlling it via Chrome Extension. It stops working the moment you close your laptop.
Camofox · OpenCLI moves it to the cloud:
Your computer Cloud server
─────────── ─────────────
┌──────────────────────────────┐
│ Docker container │
│ │
opencli zhihu │ OpenCLI Daemon │
search 'AI agent' ─────▶ (:19825) │
│ │ │
│ │ WebSocket │
│ ▼ │
│ Camofox Shim │
│ │ │
│ │ REST API │
│ ▼ │
│ Camofox Firefox browser │
│ (:9377) │
│ │
Open noVNC link │ VNC remote desktop (:6080) │
in browser ─────────────▶ ← scan QR, cookies persist │
│ │
└──────────────────────────────┘
Log in once, always online. Open Zhihu/Xiaohongshu/Xianyu via noVNC, scan the QR code once, and the cookies are written to the Docker Volume. After that, every opencli command automatically carries the login session — even after container restarts or rebuilds.
Zero changes to OpenCLI source. All 163 adapters call page.goto(), page.evaluate(), and other browser APIs. The Shim impersonates a Chrome Extension, connects to the OpenCLI daemon's WebSocket, intercepts commands, translates them into Camofox REST API calls, and sends results back. OpenCLI has no idea the browser behind it is Firefox.
┌──────────────────────────────────────────────────────────────────┐
│ Docker container │
│ │
│ User runs: opencli zhihu search 'AI agent' │
│ │ │
│ │ HTTP POST /command │
│ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ OpenCLI Daemon (:19825) │ ← unmodified daemon │
│ │ HTTP Server + WebSocket /ext │ │
│ └──────────┬───────────────────────┘ │
│ │ WebSocket forwards commands │
│ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ Camofox Shim (v2) │ ← bridge layer │
│ │ • Impersonates Chrome Extension │ │
│ │ • Connects to daemon /ext WS │ │
│ │ • Translates commands → REST │ │
│ └──────────┬───────────────────────┘ │
│ │ HTTP REST │
│ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ Camofox browser (:9377) │ ← Firefox engine │
│ │ • Anti-detection fingerprinting │ │
│ │ • VNC remote desktop (:6080) │ │
│ │ • Cookie persistence │ │
│ └──────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
OpenCLI sends 14 DaemonCommand types over WebSocket. The Shim maps them to Camofox REST endpoints:
| OpenCLI Command | Purpose | → Camofox API | Status |
|---|---|---|---|
navigate | Page navigation | POST /tabs/:tabId/navigate | ✅ |
exec | JS evaluation | POST /tabs/:tabId/evaluate | ✅ |
screenshot | Screenshot | GET /tabs/:tabId/screenshot | ✅ |
cookies | Get cookies | GET /sessions/:userId/cookies | ✅ |
tabs | Tab management | POST/GET/DELETE /tabs | ✅ |
insert-text | Text input | POST /tabs/:tabId/press | ✅ |
bind | Bind tab | Internal mapping | ✅ |
close-window | Close window | DELETE /sessions/:userId | ✅ |
cdp | Chrome DevTools | — | ❌ Firefox has no CDP |
set-file-input | File upload | — | ❌ Not implemented |
network-capture-* | Network capture | — | ❌ No Firefox equivalent |
wait-download | Download wait | — | ❌ Not implemented |
frames | Iframe list | — | ❌ Not implemented |
8/14 commands implemented, covering all core social platform adapter needs. Unimplemented CDP/network commands don't affect Bilibili, Zhihu, Xiaohongshu, Twitter, etc.
1. User: opencli zhihu search 'AI agent'
2. CLI → HTTP POST /command → daemon(:19825)
3. Daemon → WebSocket /ext → Shim (impersonating Chrome Extension)
4. Shim parses: {action: "navigate", url: "https://www.zhihu.com/search?q=..."}
5. Shim → Camofox: POST /tabs/:tabId/navigate {userId, url}
6. Shim parses: {action: "exec", code: "wait for page load → scrape results"}
7. Shim → Camofox: POST /tabs/:tabId/evaluate {expression: code, timeout: 120000}
8. Camofox returns JSON → Shim → WebSocket → Daemon → CLI → user sees results
The container also runs an opencli gateway (:8080) that exposes all 163+ platform adapters to external agents through two transports, plus a ready-made Claude skill:
| Transport | Endpoint | Auth |
|---|---|---|
| REST | GET/POST /health, /sites, /sites/:site/help, /run, /login | Authorization: Bearer $GATEWAY_API_KEY |
| MCP | POST /mcp (streamable HTTP) | same Bearer token |
list_sites, site_help, run_command, browser, login, doctorxiaohongshu_command, bilibili_command, twitter_command, reddit_command, zhihu_command, douyin_command, weibo_command, youtube_command, hackernews_command, github_commandrun_command + site_helpClaude Desktop (claude_desktop_config.json) or Claude Code (.mcp.json):
{
"mcpServers": {
"camofox-opencli": {
"url": "http://localhost:8080/mcp",
"headers": { "Authorization": "Bearer YOUR_GATEWAY_API_KEY" }
}
}
}
The login tool returns a noVNC URL — open it in your browser to scan a QR code and persist cookies for sites that need authentication.
skills/opencli-camofox/ ships with the container — stdlib-only Python scripts calling the gateway over HTTP. Set OPENCLI_GATEWAY_URL + GATEWAY_API_KEY (or ~/.opencli-gateway.env) and your Claude agent can list_sites, site_help, run, browser, and vnc_login with no extra setup.
| Variable | Default |
|---|---|
GATEWAY_PORT | 8080 |
GATEWAY_API_KEY | (required for auth on REST + MCP) |
OPENCLI_BIN | opencli |
OPENCLI_MANIFEST | /opt/opencli/cli-manifest.json |
A self-contained image is published to GitHub Container Registry on every
change to main. The build bakes in the Camoufox binary, uBlock Origin and
GeoLite2-City.mmdb, so you only need to pull — no network access, no build
context preparation.
docker pull ghcr.io/fectivnfy112357/camofox-opencli:latest
docker run -d --name camofox \
--privileged --shm-size=2g \
-p 9377:9377 -p 6080:6080 -p 19825:19825 -p 8080:8080 \
-e CAMOFOX_USER_ID=yourname \
-e GATEWAY_API_KEY=$(openssl rand -hex 32) \
-e CAMOFOX_API_KEY=my_secret_api_key_123 \
-v camofox_data:/home/node/.camofox \
ghcr.io/fectivnfy112357/camofox-opencli:latest
Then open http://localhost:6080 (noVNC) and log in to the sites you want
through a real browser. Cookies are persisted in camofox_data so subsequent
runs stay signed in.
Forks are checked in as git submodules, so a build needs your fork URLs in
.gitmodules. Run this in a clean checkout:
git clone --recurse-submodules https://github.com/Fectivnfy112357/camofox-opencli.git
cd camofox-opencli
docker compose build --no-cache
docker compose up -d
If you only want OpenCLI / Shim changes to hot-reload without rebuilding the
image, prefer --no-build:
./deploy.sh --no-build
docker exec -it camofox bash
# No login required
opencli bilibili search 'gaming'
opencli v2ex hot
# Login required (see VNC login below)
opencli zhihu search 'AI agent'
opencli xiaohongshu search 'camping'
# List all 163 platforms
opencli list
For platforms requiring login (Zhihu, Xiaohongshu, Twitter, etc.), use noVNC to scan a QR code once — cookies persist automatically:
# Generate a VNC link and auto-navigate to the target site
python3 scripts/camofox-vnc-login.py fectivnfy --url https://www.zhihu.com
# Output: http://textvision.top:6080/vnc.html?autoconnect=true&resize=scale&token=xxxx
# Open in browser → scan QR → done
After logging in once, all opencli commands automatically reuse the session. Cookies are stored in a Docker Volume — they survive container restarts and rebuilds.
cd camofox-opencli
git pull
git submodule update --init --remote
docker compose down && docker compose build --no-cache && docker compose up -d
Submodules stay fresh automatically.
camofox-opencli/.github/workflows/bump-submodules.ymlruns on a daily cron (UTC 03:17) — every submodule pointer lands on upstream HEAD within 24h of a sub-repo push. No secrets to configure: the workflow uses the auto-injectedGITHUB_TOKEN, which hascontents: write+pull-requests: writeon this repo via the workflow'spermissions:block.For instant bumps (instead of waiting up to 24h), each sub-repo has a
.github/workflows/notify-aggregate.ymlthat callsrepository_dispatchon every push. Cross-repo dispatch needs a PAT, so that step is guarded and skipped silently if the sub-repo doesn't haveAGGREGATE_DISPATCH_TOKENset — the daily cron still catches everything.
| Repository | Description | License |
|---|---|---|
| camofox-browser | Camofox fork, added GET cookies endpoint | MIT |
| camofox-shim | WebSocket bridge, OpenCLI ↔ Camofox | MIT |
| OpenCLI | 163+ site adapters CLI tool | MIT |
This project is licensed under the MIT License.
Subproject licenses:
GET /sessions/:userId/cookies endpoint and entrypoint-camofox.sh.All three subprojects retain their upstream MIT licenses. This project is also MIT.
Built with ❤️
40+ tools for querying dashboards, alerts, datasources, and logs in Grafana
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases