{"id":50297222,"url":"https://github.com/alexferrari88/changedetection.io-camoufox","last_synced_at":"2026-05-28T09:35:06.381Z","repository":{"id":358854979,"uuid":"1243369223","full_name":"alexferrari88/changedetection.io-camoufox","owner":"alexferrari88","description":"Camoufox fetcher plugin for changedetection.io without source patches","archived":false,"fork":false,"pushed_at":"2026-05-19T09:38:52.000Z","size":150,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-19T12:23:34.894Z","etag":null,"topics":["anti-detect","camoufox","changedetectionio","playwright","python","web-monitoring"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alexferrari88.png","metadata":{"files":{"readme":"README.md","changelog":"changedetection_camofox/__init__.py","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-19T09:24:17.000Z","updated_at":"2026-05-19T09:38:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/alexferrari88/changedetection.io-camoufox","commit_stats":null,"previous_names":["alexferrari88/changedetection.io-camoufox"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/alexferrari88/changedetection.io-camoufox","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexferrari88%2Fchangedetection.io-camoufox","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexferrari88%2Fchangedetection.io-camoufox/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexferrari88%2Fchangedetection.io-camoufox/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexferrari88%2Fchangedetection.io-camoufox/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alexferrari88","download_url":"https://codeload.github.com/alexferrari88/changedetection.io-camoufox/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexferrari88%2Fchangedetection.io-camoufox/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33603475,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anti-detect","camoufox","changedetectionio","playwright","python","web-monitoring"],"created_at":"2026-05-28T09:35:01.506Z","updated_at":"2026-05-28T09:35:06.341Z","avatar_url":"https://github.com/alexferrari88.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# changedetection.io-camoufox\n\n`changedetection.io-camoufox` is a changedetection.io plugin that adds Camoufox-backed fetchers without patching changedetection.io source.\n\nIt registers two fetch backends:\n\n```text\nextra_browser_camoufox       Native Camoufox Python/Playwright fetcher; best compatibility.\nextra_browser_camofox_rest   Experimental adapter for a running jo-inc/camofox-browser REST server.\n```\n\n## Why the `extra_browser_` prefix?\n\nchangedetection.io 0.55.3 validates API `fetch_backend` values with a regex that accepts `system`, `html_requests`, `html_webdriver`, and `extra_browser_*`. A normal plugin name such as `html_camoufox` can appear in the UI but may be rejected by POST/PUT API calls. Using `extra_browser_camoufox` lets the plugin work through both the UI and API while still requiring **zero source changes** to changedetection.io.\n\n## Recommended approach\n\nUse `extra_browser_camoufox`.\n\nIt launches Camoufox directly inside the changedetection.io container via the Python `camoufox` package. The returned objects are normal Playwright Firefox `browser/context/page` objects, so changedetection.io browser steps, screenshots, custom JS, visual selectors, and restock processors can reuse changedetection.io's existing Playwright-oriented internals.\n\nUse `extra_browser_camofox_rest` only when you already operate [`jo-inc/camofox-browser`](https://github.com/jo-inc/camofox-browser) and want a low-risk first smoke test. The REST adapter can fetch HTML and screenshots through `/tabs`, `/evaluate`, and `/screenshot`, but it does **not** yet implement changedetection.io browser steps.\n\n## Requirements\n\n- changedetection.io 0.55.3 or newer, already installed/running.\n- Linux container/host dependencies required by Playwright Firefox/Camoufox.\n- Camoufox binaries fetched with `camoufox fetch` before production use.\n\nThe package intentionally does **not** declare `changedetection.io` as a dependency, because it is meant to be installed inside an existing changedetection.io image/runtime and should not cause pip to reinstall the host app.\n\n## Install in Docker Compose\n\n### Option A — `EXTRA_PACKAGES` from GitHub/PyPI\n\n```yaml\nservices:\n  changedetection:\n    image: ghcr.io/dgtlmoon/changedetection.io:0.55.3\n    environment:\n      - EXTRA_PACKAGES=changedetection.io-camoufox[geoip]\n      - CAMOUFOX_HEADLESS=true\n      - CAMOUFOX_HUMANIZE=false\n      - CAMOUFOX_GEOIP=false\n      - PLAYWRIGHT_SERVICE_WORKERS=block\n```\n\nThen prefetch Camoufox once inside the container/image:\n\n```bash\ndocker compose exec changedetection camoufox fetch\n```\n\n### Option B — custom image\n\nSee [`examples/Dockerfile`](examples/Dockerfile). This is better for production because browser binaries are fetched during image build rather than at first check.\n\n## Select per watch\n\nUI: Watch → Edit → Fetch → choose **Camoufox - stealth Firefox (plugin)**.\n\nAPI:\n\n```bash\ncurl -X PUT \"$CHANGEDETECTION_BASE_URL/api/v1/watch/$WATCH_UUID\" \\\n  -H \"x-api-key: $CHANGEDETECTION_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"fetch_backend\":\"extra_browser_camoufox\"}'\n```\n\n## Runtime environment\n\n```text\nCAMOUFOX_HEADLESS=true|false|virtual   default true\nCAMOUFOX_HUMANIZE=true|false|1.5       default false\nCAMOUFOX_GEOIP=true|false              default false; requires camoufox[geoip]\nCAMOUFOX_BLOCK_IMAGES=true|false       default false\nCAMOUFOX_OS=windows,macos,linux        optional fingerprint OS pool\nCAMOUFOX_EXECUTABLE=/path/to/camoufox  optional externally managed Camoufox bundle\nPLAYWRIGHT_SERVICE_WORKERS=block       recommended for deterministic monitoring\nWEBDRIVER_DELAY_BEFORE_CONTENT_READY=5 changedetection-compatible wait\n```\n\nProxy support reuses changedetection.io's `proxy_override` and `playwright_proxy_*` environment variables. Because changedetection.io 0.55.x skips passing per-watch proxies to `extra_browser_*` fetchers, the native fetcher also recovers the selected watch proxy from `/datastore/\u003cwatch_uuid\u003e/watch.json` + `/datastore/proxies.json`.\n\nFor Camoufox IP/timezone/locale consistency, enable `CAMOUFOX_GEOIP=true` when using a residential proxy and the `camoufox[geoip]` extra.\n\n## Current status\n\nAlpha. The native fetcher is the target production path. The REST fetcher is intentionally narrower and exists to prove integration with an already-running `camofox-browser` service.\n\nSee [`docs/architecture.md`](docs/architecture.md) for the design trade-offs and known risks.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexferrari88%2Fchangedetection.io-camoufox","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falexferrari88%2Fchangedetection.io-camoufox","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexferrari88%2Fchangedetection.io-camoufox/lists"}