Use the standalone camofox-browser server directly over HTTP.
Default assumptions for this workspace:
- Base URL:
http://127.0.0.1:9377 - The service is already running.
userIdis mandatory on nearly every useful request.sessionKey(or legacylistItemId) groups tabs; default todefault.
Golden workflow
- Check
/health. - Create a tab with
/tabs. - Call
/tabs/:tabId/wait. - Call
/tabs/:tabId/snapshotand read refs. - Act with
/click,/type,/press,/scroll, or/navigate. - Snapshot again after any state-changing action.
Prefer this loop over HTML scraping.
Hard rules
- Always send
userId. - Prefer
POST /tabswithsessionKeyfor raw server use. - Re-snapshot after click, type, press, or navigation.
- If a field ignores
fill, retry withtypeusingmode: "keyboard". - If
/tabsreturns an empty list, check whetheruserIdwas omitted. - Use direct navigation when the target URL is known; do not over-click through search results if a stable URL exists.
- Use VNC/manual login for MFA, CAPTCHAs, or brittle auth flows, then reuse storage state or persistence.
Minimal endpoint map
Read references/api-cheatsheet.md when you need request/response shapes.
Most-used endpoints:
GET /healthPOST /tabsGET /tabs?userId=...POST /tabs/:tabId/waitGET /tabs/:tabId/snapshot?userId=...POST /tabs/:tabId/clickPOST /tabs/:tabId/typePOST /tabs/:tabId/pressPOST /tabs/:tabId/scrollPOST /tabs/:tabId/navigatePOST /tabs/:tabId/evaluatePOST /sessions/:userId/cookiesGET /sessions/:userId/storage_state
Recommended helper script
Use scripts/camofox.py instead of rewriting raw HTTP every time.
Examples:
python3 skills/camofox-browser-control/scripts/camofox.py health
python3 skills/camofox-browser-control/scripts/camofox.py open --user lotfi --session default --url https://github.com
python3 skills/camofox-browser-control/scripts/camofox.py snapshot --user lotfi --tab <tabId>
python3 skills/camofox-browser-control/scripts/camofox.py click --user lotfi --tab <tabId> --ref e17
python3 skills/camofox-browser-control/scripts/camofox.py type --user lotfi --tab <tabId> --ref e2 --text 'hello' --mode fill
python3 skills/camofox-browser-control/scripts/camofox.py type --user lotfi --tab <tabId> --text '97304' --mode keyboard --submit
python3 skills/camofox-browser-control/scripts/camofox.py navigate --user lotfi --tab <tabId> --url https://example.com
Known quirks
GET /tabswithoutuserIdcan misleadingly show no tabs even when tabs exist.- Refs go stale after page changes. Snapshot again instead of reusing old refs blindly.
clickalready retries normal click, force click, and mouse sequence; success does not guarantee the frontend changed the state you expect, so verify with a fresh snapshot.- Some sites accept direct URL navigation more reliably than UI clicking.
- Some frontend inputs require true keyboard events. Use
mode: "keyboard"plus--submitwhenfilldoes not trigger app logic. - Large multi-step chained calls are more fragile than short calls with verification between them.
Login strategy
For normal forms:
- open → wait → snapshot → type → click/submit → snapshot
For stubborn auth:
- use VNC/noVNC login
- export
storage_state - rely on persistence or restore state on later runs
For cookie bootstrap:
- import Netscape cookies through
/sessions/:userId/cookies - requires
CAMOFOX_API_KEY
Escape hatch
Use /tabs/:tabId/evaluate only when refs/typing/clicking are insufficient. Keep expressions small and targeted.
Local note for this machine
The current host already has a live server on 127.0.0.1:9377, with VNC/noVNC exposed by the container. Treat that as the default target unless the task says otherwise.