Stealth Chromium build with a drop-in Playwright harness — fetches and launches the ChromiumFish browser.
Project description
chromiumfish (Python)
Stealth Chromium with a drop-in Playwright harness.
pip install chromiumfish
chromiumfish fetch # download + cache the browser build
Usage
Sync
from chromiumfish.sync_api import Chromiumfish
with Chromiumfish(persona_seed=27182, headless=True) as browser:
page = browser.new_page()
page.goto("https://abrahamjuliot.github.io/creepjs/")
page.screenshot(path="fp.png")
Async
import asyncio
from chromiumfish.async_api import AsyncChromiumfish
async def main():
async with AsyncChromiumfish(persona_seed=27182) as browser:
page = await browser.new_page()
await page.goto("https://example.com")
print(await page.title())
asyncio.run(main())
The returned object is a standard Playwright Browser, so new_context,
new_page, routing, tracing, etc. all work as usual.
Options
| Argument | Default | Description |
|---|---|---|
persona_seed |
None |
Integer seed for a stable, internally-consistent fingerprint persona. |
headless |
True |
Run headless (SwiftShader). |
proxy |
None |
Playwright proxy dict, e.g. {"server": "http://host:port", "username": ..., "password": ...}. |
window_size |
(1920, 1080) |
Window dimensions. |
version |
pinned | Override the browser build version. |
download |
True |
Auto-download the build if missing. |
timezone |
None |
"auto" resolves the egress IP's IANA timezone via the downloadable ip2tz DB and sets the browser's TZ; an IANA string (e.g. "Europe/Berlin") is used verbatim. |
args |
None |
Extra Chromium flags. |
**launch_kwargs |
— | Forwarded to chromium.launch(). |
IP-to-Timezone
timezone="auto" aligns the browser clock with the egress IP (handy behind a
proxy). It uses a compact ip2tz database downloaded once and cached; you can
also query it directly:
from chromiumfish import lookup_timezone, resolve_timezone
lookup_timezone("8.8.8.8") # -> "America/Los_Angeles"
resolve_timezone(proxy="http://user:pass@host:port") # egress IP -> timezone
The DB auto-updates: it tracks the latest monthly build (cached, re-checked
weekly), so you get fresh data without upgrading the SDK. Pin a fixed version
with CHROMIUMFISH_GEOIP_VERSION=2026.06 for reproducibility.
CLI
chromiumfish fetch [--browser-version X] [--force] # download + cache
chromiumfish path # print binary path
chromiumfish clear # wipe the cache
chromiumfish --version
Builds are cached under ~/.cache/chromiumfish/<version>/ (override with
CHROMIUMFISH_CACHE_DIR). Pin a build with CHROMIUMFISH_VERSION.
Attribution
IP Geolocation by DB-IP — the ip2tz timezone
database is derived from DB-IP City Lite, used under CC BY 4.0.
License
MIT © Arman Hossain. See the repository.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chromiumfish-0.1.2.tar.gz.
File metadata
- Download URL: chromiumfish-0.1.2.tar.gz
- Upload date:
- Size: 3.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c87d5ed4d167b79f9c50f3cfed960f9e14c6054f079e5bc9f3d7ad6af057de72
|
|
| MD5 |
df7220ed36a90d8bea05feb3f295017d
|
|
| BLAKE2b-256 |
795ec88f8f817ba92584a8914ebaccbf67260e38ad44a981be2f830c66eda38c
|
Provenance
The following attestation bundles were made for chromiumfish-0.1.2.tar.gz:
Publisher:
pypi.yml on arman-bd/chromiumfish
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chromiumfish-0.1.2.tar.gz -
Subject digest:
c87d5ed4d167b79f9c50f3cfed960f9e14c6054f079e5bc9f3d7ad6af057de72 - Sigstore transparency entry: 1756297306
- Sigstore integration time:
-
Permalink:
arman-bd/chromiumfish@21b2470834ac2c4b6839df2131919be5a997ac06 -
Branch / Tag:
refs/tags/py-v0.1.2 - Owner: https://github.com/arman-bd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@21b2470834ac2c4b6839df2131919be5a997ac06 -
Trigger Event:
push
-
Statement type:
File details
Details for the file chromiumfish-0.1.2-py3-none-any.whl.
File metadata
- Download URL: chromiumfish-0.1.2-py3-none-any.whl
- Upload date:
- Size: 4.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86d64335487722e575834d40ae4a930e1b34e244eca8ab5bcbeb6a42feca84c7
|
|
| MD5 |
7adc96b0ada2f490ad263c249bb00389
|
|
| BLAKE2b-256 |
e601142640ccedb1b768af9b6065dbf4a7f9c196e8eb8f7d465264c76b89096e
|
Provenance
The following attestation bundles were made for chromiumfish-0.1.2-py3-none-any.whl:
Publisher:
pypi.yml on arman-bd/chromiumfish
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chromiumfish-0.1.2-py3-none-any.whl -
Subject digest:
86d64335487722e575834d40ae4a930e1b34e244eca8ab5bcbeb6a42feca84c7 - Sigstore transparency entry: 1756297319
- Sigstore integration time:
-
Permalink:
arman-bd/chromiumfish@21b2470834ac2c4b6839df2131919be5a997ac06 -
Branch / Tag:
refs/tags/py-v0.1.2 - Owner: https://github.com/arman-bd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@21b2470834ac2c4b6839df2131919be5a997ac06 -
Trigger Event:
push
-
Statement type: