285 lines
11 KiB
JSON
285 lines
11 KiB
JSON
{
|
|
"id": "camofox-browser",
|
|
"name": "Camofox Browser",
|
|
"description": "Anti-detection browser automation for AI agents using Camoufox (Firefox-based)",
|
|
"version": "1.11.2",
|
|
"envVars": {
|
|
"CAMOFOX_API_KEY": {
|
|
"description": "Secret key for the cookie-import endpoint. Cookie import is disabled when unset. Only set this if you need to import browser cookies and the server is local or access-controlled.",
|
|
"required": false,
|
|
"sensitive": true
|
|
},
|
|
"CAMOFOX_ACCESS_KEY": {
|
|
"description": "Global bearer token for all routes (except /health). When set, every request must include Authorization: Bearer <key>. Recommended when exposing the server beyond localhost.",
|
|
"required": false,
|
|
"sensitive": true
|
|
},
|
|
"CAMOFOX_CRASH_REPORT_ENABLED": {
|
|
"description": "Enable or disable anonymized crash/hang telemetry. Set to 'false' to disable all outbound telemetry.",
|
|
"required": false,
|
|
"sensitive": false,
|
|
"default": "true"
|
|
},
|
|
"CAMOFOX_CRASH_REPORT_URL": {
|
|
"description": "Telemetry endpoint URL. Override to point to a self-hosted endpoint instead of the default.",
|
|
"required": false,
|
|
"sensitive": false,
|
|
"default": "https://camofox-telemetry.askjo.workers.dev/report"
|
|
},
|
|
"CAMOUFOX_EXECUTABLE": {
|
|
"description": "External Camoufox executable to use instead of downloading the bundled browser. Compatibility aliases: CAMOUFOX_EXECUTABLE_PATH, CAMOFOX_EXECUTABLE_PATH.",
|
|
"required": false,
|
|
"sensitive": false
|
|
}
|
|
},
|
|
"configSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"description": "Camoufox browser server URL"
|
|
},
|
|
"port": {
|
|
"type": "number",
|
|
"description": "Server port (used if url not set)",
|
|
"default": 9377
|
|
},
|
|
"autoStart": {
|
|
"type": "boolean",
|
|
"description": "Auto-start the camofox-browser server with the Gateway",
|
|
"default": true
|
|
},
|
|
"maxSessions": {
|
|
"type": "number",
|
|
"description": "Maximum concurrent browser sessions (server default: 50)",
|
|
"default": 5
|
|
},
|
|
"maxTabsPerSession": {
|
|
"type": "number",
|
|
"description": "Maximum tabs per session (server default: 10)",
|
|
"default": 3
|
|
},
|
|
"sessionTimeoutMs": {
|
|
"type": "number",
|
|
"description": "Session inactivity timeout in milliseconds (server default: 1800000)",
|
|
"default": 600000
|
|
},
|
|
"browserIdleTimeoutMs": {
|
|
"type": "number",
|
|
"description": "Kill browser after this many ms with no sessions (0 = never)",
|
|
"default": 300000
|
|
},
|
|
"maxOldSpaceSize": {
|
|
"type": "number",
|
|
"description": "Node.js V8 heap limit in MB",
|
|
"default": 128
|
|
},
|
|
"apiKey": {
|
|
"type": "string",
|
|
"description": "Secret key for cookie import endpoint. Cookie import is disabled if unset. Set via CAMOFOX_API_KEY env var."
|
|
},
|
|
"accessKey": {
|
|
"type": "string",
|
|
"description": "If set, all routes (except /health) require Authorization: Bearer <key>. Set via CAMOFOX_ACCESS_KEY env var."
|
|
},
|
|
"crashReportEnabled": {
|
|
"type": "boolean",
|
|
"description": "Enable anonymized crash/hang telemetry. Set false to disable all outbound telemetry.",
|
|
"default": true
|
|
},
|
|
"crashReportUrl": {
|
|
"type": "string",
|
|
"description": "Telemetry endpoint URL. Override to point to a self-hosted endpoint. Set via CAMOFOX_CRASH_REPORT_URL env var.",
|
|
"default": "https://camofox-telemetry.askjo.workers.dev/report"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"telemetry": {
|
|
"crashReporter": {
|
|
"description": "Anonymized crash/hang telemetry for identifying failure patterns. All credentials are environment secrets on the endpoint -- nothing sensitive ships in this package.",
|
|
"enabled": true,
|
|
"optOut": "CAMOFOX_CRASH_REPORT_ENABLED=false",
|
|
"endpoint": "https://camofox-telemetry.askjo.workers.dev/report",
|
|
"endpointSource": "https://github.com/jo-inc/camofox-browser/blob/main/workers/crash-reporter/index.ts",
|
|
"endpointVerification": "https://camofox-telemetry.askjo.workers.dev/source",
|
|
"selfHostable": true,
|
|
"selfHostOverride": "CAMOFOX_CRASH_REPORT_URL",
|
|
"dataCollected": [
|
|
"error type and anonymized stack trace",
|
|
"node/platform version and uptime",
|
|
"memory and resource counters (no content)",
|
|
"HMAC-hashed private domains (not reversible)",
|
|
"public domains verbatim (e.g. cloudflare.com, amazon.com)"
|
|
],
|
|
"dataNeverCollected": [
|
|
"page content or DOM",
|
|
"URLs with paths, query params, or credentials",
|
|
"cookies, tokens, API keys, or secrets",
|
|
"IP addresses or email addresses",
|
|
"user-identifiable information"
|
|
]
|
|
}
|
|
},
|
|
"uiHints": {
|
|
"url": {
|
|
"label": "Server URL",
|
|
"placeholder": "http://localhost:9377"
|
|
},
|
|
"port": {
|
|
"label": "Server Port",
|
|
"placeholder": "9377"
|
|
},
|
|
"autoStart": {
|
|
"label": "Auto-start server with Gateway"
|
|
},
|
|
"maxSessions": {
|
|
"label": "Max Sessions",
|
|
"placeholder": "5"
|
|
},
|
|
"maxTabsPerSession": {
|
|
"label": "Max Tabs per Session",
|
|
"placeholder": "3"
|
|
},
|
|
"sessionTimeoutMs": {
|
|
"label": "Session Timeout (ms)",
|
|
"placeholder": "600000"
|
|
},
|
|
"browserIdleTimeoutMs": {
|
|
"label": "Browser Idle Timeout (ms)",
|
|
"placeholder": "300000"
|
|
},
|
|
"maxOldSpaceSize": {
|
|
"label": "Node Heap Limit (MB)",
|
|
"placeholder": "128"
|
|
},
|
|
"apiKey": {
|
|
"label": "Cookie Import API Key (CAMOFOX_API_KEY)",
|
|
"placeholder": "Leave empty to disable cookie import"
|
|
},
|
|
"accessKey": {
|
|
"label": "Global Access Key (CAMOFOX_ACCESS_KEY)",
|
|
"placeholder": "Leave empty for localhost-only access"
|
|
},
|
|
"crashReportEnabled": {
|
|
"label": "Enable Telemetry"
|
|
},
|
|
"crashReportUrl": {
|
|
"label": "Telemetry Endpoint URL",
|
|
"placeholder": "https://camofox-telemetry.askjo.workers.dev/report"
|
|
}
|
|
},
|
|
"tools": [
|
|
"camofox_create_tab",
|
|
"camofox_snapshot",
|
|
"camofox_click",
|
|
"camofox_type",
|
|
"camofox_navigate",
|
|
"camofox_scroll",
|
|
"camofox_screenshot",
|
|
"camofox_close_tab",
|
|
"camofox_evaluate",
|
|
"camofox_list_tabs",
|
|
"camofox_import_cookies"
|
|
],
|
|
"contracts": {
|
|
"tools": [
|
|
"camofox_create_tab",
|
|
"camofox_snapshot",
|
|
"camofox_click",
|
|
"camofox_type",
|
|
"camofox_navigate",
|
|
"camofox_scroll",
|
|
"camofox_screenshot",
|
|
"camofox_close_tab",
|
|
"camofox_evaluate",
|
|
"camofox_list_tabs",
|
|
"camofox_import_cookies"
|
|
]
|
|
},
|
|
"runtimeDependencies": {
|
|
"camoufox": {
|
|
"description": "Camoufox anti-detection browser (Firefox fork). Downloaded at install time by camoufox-js unless CAMOUFOX_EXECUTABLE points to an external bundle.",
|
|
"source": "https://github.com/nicedayzhu/camoufox/releases",
|
|
"installer": "camoufox-js (npm)",
|
|
"installedBy": "postinstall script: npx camoufox-js fetch, skipped when CAMOUFOX_EXECUTABLE is set",
|
|
"sizeApprox": "300MB",
|
|
"platforms": [
|
|
"linux-x86_64",
|
|
"linux-aarch64",
|
|
"macos-x86_64",
|
|
"macos-aarch64"
|
|
],
|
|
"verifiedBy": "camoufox-js verifies download integrity via GitHub release checksums"
|
|
}
|
|
},
|
|
"permissions": {
|
|
"network": {
|
|
"outbound": [
|
|
{
|
|
"target": "User-specified URLs (browsed pages)",
|
|
"purpose": "Browser automation -- navigating to URLs the agent requests",
|
|
"gatedBy": "Agent request via API"
|
|
},
|
|
{
|
|
"target": "https://camofox-telemetry.askjo.workers.dev/report",
|
|
"purpose": "Anonymized crash/hang telemetry",
|
|
"gatedBy": "CAMOFOX_CRASH_REPORT_ENABLED (default: true, set false to disable)"
|
|
}
|
|
],
|
|
"inbound": {
|
|
"target": "localhost:9377 (default)",
|
|
"purpose": "REST API for browser automation",
|
|
"gatedBy": "CAMOFOX_ACCESS_KEY (optional -- when set, all routes require Bearer auth)"
|
|
}
|
|
},
|
|
"filesystem": {
|
|
"read": [
|
|
{
|
|
"path": "~/.camofox/cookies/",
|
|
"purpose": "Read Netscape cookie files for authenticated browsing",
|
|
"gatedBy": "CAMOFOX_API_KEY (disabled entirely when unset)"
|
|
},
|
|
{
|
|
"path": "/proc/self/status (Linux only)",
|
|
"purpose": "Memory and resource metrics for telemetry",
|
|
"gatedBy": "Only read when telemetry is enabled"
|
|
}
|
|
],
|
|
"write": [
|
|
{
|
|
"path": "~/.camofox/profiles/<hashed-userId>/",
|
|
"purpose": "Persisted session state (cookies + localStorage) so users stay logged in across restarts",
|
|
"gatedBy": "persistence plugin (enabled by default, disable via camofox.config.json)"
|
|
},
|
|
{
|
|
"path": "~/.camofox/traces/<hashed-userId>/",
|
|
"purpose": "Optional Playwright session traces for debugging",
|
|
"gatedBy": "trace: true flag on tab creation (opt-in per session, off by default)"
|
|
}
|
|
]
|
|
},
|
|
"subprocess": [
|
|
{
|
|
"binary": "Camoufox (Firefox fork)",
|
|
"purpose": "The browser engine -- core functionality",
|
|
"isolation": "lib/launcher.js (child_process isolated from route handlers)"
|
|
},
|
|
{
|
|
"binary": "yt-dlp (optional)",
|
|
"purpose": "YouTube transcript extraction (fast path)",
|
|
"isolation": "plugins/youtube/youtube.js (child_process isolated from route handlers)"
|
|
}
|
|
]
|
|
},
|
|
"securityModel": {
|
|
"architecture": "All process.env reads are in lib/config.js. All child_process usage is in lib/launcher.js and plugins/youtube/youtube.js. server.js has route handlers but zero process.env reads and zero child_process imports. No single file combines secrets access with network sends.",
|
|
"cookieImport": "DISABLED by default. Requires CAMOFOX_API_KEY to be explicitly set. Without the key, the server rejects all cookie requests with 403. Cookie files are read from a sandboxed directory (~/.camofox/cookies/) with path traversal protection.",
|
|
"accessControl": "CAMOFOX_ACCESS_KEY provides global bearer auth for all routes (except /health). Recommended for any non-localhost deployment.",
|
|
"crashReporting": "Anonymized via lib/reporter.js (L28-290). Private domains are HMAC-hashed. No page content, cookies, tokens, IPs, or user data is ever sent. Relay source is in-repo and auditable. Verification endpoint: GET /source returns commit hash and sha256.",
|
|
"binaryDownload": "Camoufox is downloaded at npm install time by camoufox-js unless CAMOUFOX_EXECUTABLE points to an external Camoufox bundle. Downloaded binaries come from official GitHub releases with integrity verification by camoufox-js.",
|
|
"sessionPersistence": "User sessions are persisted to ~/.camofox/profiles/ so authenticated browsing survives restarts. UserIds are hashed for directory names. Disable via persistence plugin config.",
|
|
"noEmbeddedSecrets": "Zero credentials, private keys, or tokens ship in this package. All secrets are environment variables or Cloudflare Worker secrets."
|
|
}
|
|
}
|