[!IMPORTANT] This software does not guarantee (only greatly increases the chance) that any challenge will be bypassed. While this tool passes the initial browser check, Cloudflare and other captcha providers likely require valid network traffic originating from the user’s public IP address to mark a connection as legitimate. If any website does not pass the challenge, please run troubleshooting steps and check if other websites work before you create an GitHub issue.
| Environment Variable | Default | Description |
|---|---|---|
HOST | 0.0.0.0 | Host address to bind the server to. Use 0.0.0.0 to bind to all IPv4 interfaces, :: for all IPv6 interfaces, or 127.0.0.1/localhost for local access only. |
PORT | 8191 | Port to bind the server to. |
PROXY_SERVER | None | Proxy to use in format: protocol://host:port. |
PROXY_USERNAME | None | Username for proxy authentication. |
PROXY_PASSWORD | None | Password for proxy authentication. |
OWUI_API_KEY | None | Bearer token for /load endpoint authentication. Must match EXTERNAL_WEB_LOADER_API_KEY in Open WebUI. |
BROWSER_LOCALE | None | Override the browser's language with a BCP-47 tag, e.g. en-US, de-DE, fr-FR. When unset, the locale is derived from the egress country. |
BROWSER_TIMEZONE | None | Override the browser's timezone with an IANA name, e.g. Europe/Berlin, Asia/Shanghai. When unset, the timezone is derived from the egress IP. |
Set BROWSER_LOCALE to a BCP-47 language tag like en-US, de-DE, fr-FR, pl-PL, or zh-CN to fix the browser's language and Accept-Language header. When unset, Byparr derives the locale from the egress country (e.g. a French proxy → fr-FR), keeping the browser language consistent with the exit IP.
Valid tags are maintained in the IANA Language Subtag Registry. For a friendlier list, see List of ISO 639-1 codes (language) combined with an ISO 3166-1 alpha-2 region code for the full tag, e.g. pt-BR.
Set BROWSER_TIMEZONE to an IANA timezone name like Europe/Berlin or Asia/Shanghai to fix the browser's timezone. An explicit value is used as is, also behind a proxy.
When either BROWSER_TIMEZONE or BROWSER_LOCALE is unset, Byparr looks up its public IP through api.ipify.org, icanhazip.com or checkip.amazonaws.com and maps it to a timezone and language with a GeoIP database downloaded from GitHub. Without a proxy this happens once, on the first request, and the result is reused until Byparr restarts (restart it if its public IP moves to another country). If that lookup fails, the host timezone (TZ, otherwise the system's, otherwise UTC) and en-US are used, and the lookup is retried after 10 minutes. With a proxy (PROXY_SERVER or the X-Proxy-Server header) it runs for every request, through the proxy.
If those hosts are slow or blocked on your network, set both BROWSER_TIMEZONE and BROWSER_LOCALE: the lookup is then skipped entirely and no request is made before the browser starts.
Recently I've partnered with a new in town proxy service - ProxyBase - to offer affordable proxy services that seems to work seamlessly with Byparr! Using my affiliate code byparr (case sensitive!) when signing up will not only get you access to their cost-effective ($0.69/GB with occasional promotions at the time of writing) proxy network but will also help support the continued development of this project. ProxyBase's proxies can significantly improve your success rate when bypassing anti-bot challenges. Check out ProxyBase and enhance your Byparr experience!
v*.*.*/latest - Releases considered stablemain - Latest release from main branch (untested)pr-{number} - Pull request images for testing (automatically cleaned up when PR closes)[!IMPORTANT] Support for NAS devices (like Synology) is minimal. Please report issues, but do not expect it to be fixed quickly. The only ARM device I have is a free Ampere Oracle VM, so I can only test ARM support on that. See #22 and #3
compose.yaml.docker compose up -d
[!WARNING] Byparr performs a lot of R/W operations on your disk. To reduce disk wear, it is recommended to allocate temp storage in RAM by adding the following snippet to your Docker Compose configuration:
shm_size: "1gb" tmpfs: - /tmp:exec,mode=1777,size=1G - /cache:mode=1777,size=512M
Pull and run the image:
docker run -p 8191:8191 ghcr.io/thephaseless/byparr:latest
Optional: set env vars using -e or --env-file.
git clone https://github.com/ThePhaseless/Byparruv run main.pyOnce running, open:
http://localhost:8191/docshttp://localhost:8191/ (redirects to /docs)Byparr can serve as an external web loader for Open WebUI, allowing it to fetch web content through Byparr's anti-bot bypassing capabilities.
Configure Open WebUI with these environment variables:
WEB_LOADER_ENGINE=external
EXTERNAL_WEB_LOADER_URL=http://byparr:8191/load
EXTERNAL_WEB_LOADER_API_KEY=your-secret-key # Optional, must match OWUI_API_KEY
The /load endpoint accepts POST requests with {"urls": ["https://..."]} and returns extracted text content for RAG pipelines.
docker build --target test .If you are running Byparr as an OCI container in Proxmox (or another LXC-based setup) and see a FileNotFoundError from multiprocessing.synchronize/camoufox when processing requests, increase the service's shared memory in compose.yaml:
services:
byparr:
shm_size: 512mb
stdin_open: true
tty: true
shm_size: 512mb is usually enough; stdin_open and tty are only needed if your orchestrator runs the container without a TTY.
uv sync --group testuv run pytest --retries 3 (You can add -n auto for parallelization)F character in terminal, that means test failed even after retries.(top 24 of 30)
1,114 followers · starred Jul 2026
2,452 followers · starred Jul 2026
248 followers · starred Dec 2024
489 followers · starred Sep 2026
[!IMPORTANT] This software does not guarantee (only greatly increases the chance) that any challenge will be bypassed. While this tool passes the initial browser check, Cloudflare and other captcha providers likely require valid network traffic originating from the user’s public IP address to mark a connection as legitimate. If any website does not pass the challenge, please run troubleshooting steps and check if other websites work before you create an GitHub issue.
| Environment Variable | Default | Description |
|---|---|---|
HOST | 0.0.0.0 | Host address to bind the server to. Use 0.0.0.0 to bind to all IPv4 interfaces, :: for all IPv6 interfaces, or 127.0.0.1/localhost for local access only. |
PORT | 8191 | Port to bind the server to. |
PROXY_SERVER | None | Proxy to use in format: protocol://host:port. |
PROXY_USERNAME | None | Username for proxy authentication. |
PROXY_PASSWORD | None | Password for proxy authentication. |
OWUI_API_KEY | None | Bearer token for /load endpoint authentication. Must match EXTERNAL_WEB_LOADER_API_KEY in Open WebUI. |
BROWSER_LOCALE | None | Override the browser's language with a BCP-47 tag, e.g. en-US, de-DE, fr-FR. When unset, the locale is derived from the egress country. |
BROWSER_TIMEZONE | None | Override the browser's timezone with an IANA name, e.g. Europe/Berlin, Asia/Shanghai. When unset, the timezone is derived from the egress IP. |
Set BROWSER_LOCALE to a BCP-47 language tag like en-US, de-DE, fr-FR, pl-PL, or zh-CN to fix the browser's language and Accept-Language header. When unset, Byparr derives the locale from the egress country (e.g. a French proxy → fr-FR), keeping the browser language consistent with the exit IP.
Valid tags are maintained in the IANA Language Subtag Registry. For a friendlier list, see List of ISO 639-1 codes (language) combined with an ISO 3166-1 alpha-2 region code for the full tag, e.g. pt-BR.
Set BROWSER_TIMEZONE to an IANA timezone name like Europe/Berlin or Asia/Shanghai to fix the browser's timezone. An explicit value is used as is, also behind a proxy.
When either BROWSER_TIMEZONE or BROWSER_LOCALE is unset, Byparr looks up its public IP through api.ipify.org, icanhazip.com or checkip.amazonaws.com and maps it to a timezone and language with a GeoIP database downloaded from GitHub. Without a proxy this happens once, on the first request, and the result is reused until Byparr restarts (restart it if its public IP moves to another country). If that lookup fails, the host timezone (TZ, otherwise the system's, otherwise UTC) and en-US are used, and the lookup is retried after 10 minutes. With a proxy (PROXY_SERVER or the X-Proxy-Server header) it runs for every request, through the proxy.
If those hosts are slow or blocked on your network, set both BROWSER_TIMEZONE and BROWSER_LOCALE: the lookup is then skipped entirely and no request is made before the browser starts.
Recently I've partnered with a new in town proxy service - ProxyBase - to offer affordable proxy services that seems to work seamlessly with Byparr! Using my affiliate code byparr (case sensitive!) when signing up will not only get you access to their cost-effective ($0.69/GB with occasional promotions at the time of writing) proxy network but will also help support the continued development of this project. ProxyBase's proxies can significantly improve your success rate when bypassing anti-bot challenges. Check out ProxyBase and enhance your Byparr experience!
v*.*.*/latest - Releases considered stablemain - Latest release from main branch (untested)pr-{number} - Pull request images for testing (automatically cleaned up when PR closes)[!IMPORTANT] Support for NAS devices (like Synology) is minimal. Please report issues, but do not expect it to be fixed quickly. The only ARM device I have is a free Ampere Oracle VM, so I can only test ARM support on that. See #22 and #3
compose.yaml.docker compose up -d
[!WARNING] Byparr performs a lot of R/W operations on your disk. To reduce disk wear, it is recommended to allocate temp storage in RAM by adding the following snippet to your Docker Compose configuration:
shm_size: "1gb" tmpfs: - /tmp:exec,mode=1777,size=1G - /cache:mode=1777,size=512M
Pull and run the image:
docker run -p 8191:8191 ghcr.io/thephaseless/byparr:latest
Optional: set env vars using -e or --env-file.
git clone https://github.com/ThePhaseless/Byparruv run main.pyOnce running, open:
http://localhost:8191/docshttp://localhost:8191/ (redirects to /docs)Byparr can serve as an external web loader for Open WebUI, allowing it to fetch web content through Byparr's anti-bot bypassing capabilities.
Configure Open WebUI with these environment variables:
WEB_LOADER_ENGINE=external
EXTERNAL_WEB_LOADER_URL=http://byparr:8191/load
EXTERNAL_WEB_LOADER_API_KEY=your-secret-key # Optional, must match OWUI_API_KEY
The /load endpoint accepts POST requests with {"urls": ["https://..."]} and returns extracted text content for RAG pipelines.
docker build --target test .If you are running Byparr as an OCI container in Proxmox (or another LXC-based setup) and see a FileNotFoundError from multiprocessing.synchronize/camoufox when processing requests, increase the service's shared memory in compose.yaml:
services:
byparr:
shm_size: 512mb
stdin_open: true
tty: true
shm_size: 512mb is usually enough; stdin_open and tty are only needed if your orchestrator runs the container without a TTY.
uv sync --group testuv run pytest --retries 3 (You can add -n auto for parallelization)F character in terminal, that means test failed even after retries.(top 24 of 30)
1,114 followers · starred Jul 2026
2,452 followers · starred Jul 2026
248 followers · starred Dec 2024
489 followers · starred Sep 2026