Skip to main content

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="alpha-7", headless=True) as browser:
    page = browser.new_page()
    page.goto("https://example.com")
    page.screenshot(path="fp.png")

Async

import asyncio
from chromiumfish.async_api import AsyncChromiumfish

async def main():
    async with AsyncChromiumfish(persona_seed="alpha-7") 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 String id for a stable, internally-consistent fingerprint persona (any string; a number works too).
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.

AI agent

ChromiumFish ships a native in-browser agent (perceive → think → act, driven by an OpenAI-compatible LLM). launch_agent starts the browser with the agent layer and connects over CDP; run_task drives it from a plain-language goal.

from chromiumfish import launch_agent

# LLM config: a nearby .env (OPENAI_API_*), or pass api_key=/api_base=/model= to launch_agent
with launch_agent(typing="human") as agent:   # typing: "human" (default) / "fast" / "instant"
    r = agent.run_task("Search DuckDuckGo for 'chromiumfish' and give me the first result's URL.")
    print(r.final_text)

run_task returns an AgentResult (success, final_text, steps, summary()); pass a prior run's steps back as plan= to replay a flow deterministically. Install the agent extra (pip install "chromiumfish[agent]") for the websocket-client dependency. Point at a local build with CHROME_BIN=…/ChromiumFish. Full guide: chromiumfish.com/ai-agent.

External agents

Prefer a third-party framework (Hermes, OpenClaw, browser-use, Playwright, …)? chromiumfish serve exposes a plain CDP endpoint — with your persona/proxy/timezone active — for any of them to attach to:

chromiumfish serve --persona-seed alice            # -> http://127.0.0.1:9222
# e.g. Hermes ~/.hermes/config.yaml: browser: { cdp_url: "http://127.0.0.1:9222" }

Or run it as an MCP server for Claude Code/Desktop, Cursor, etc. — pip install "chromiumfish[mcp]" (Python ≥3.10), then:

chromiumfish mcp --persona-seed alice              # exposes browser tools over MCP (stdio)

Full guide: chromiumfish.com/agents.

CLI

chromiumfish fetch [--browser-version X] [--force]   # download + cache
chromiumfish path                                     # print binary path
chromiumfish serve [--port 9222] [--persona-seed S]  # CDP endpoint for external agents
                   [--proxy URL] [--window-size WxH] [--timezone Z] [--headless]
                   [--browser-version X] [--extra-args ARGS] [--timeout S]
chromiumfish mcp   [--persona-seed S] [--headed]      # MCP server (Claude, Cursor, ...)
                   [--proxy URL] [--window-size WxH] [--typing T] [--llm-key K]
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.

Release files for chromiumfish 0.2.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for chromiumfish 0.2.4
File Size Uploaded
chromiumfish-0.2.4.tar.gz 29.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for chromiumfish 0.2.4
File Interpreter ABI Platform
chromiumfish-0.2.4-py3-none-any.whl Python 3 none any Details

Total release size: 64.6 kB

Release files / chromiumfish-0.2.4.tar.gz

Download URL chromiumfish-0.2.4.tar.gz
Size 29.2 kB
Tags Source
SHA-256 checksum
How to use checksums
5be9346cb3e4b62349b1ecc95d5ab839f86b76f13529031e4d64bcff5fdc75a0
BLAKE2b-256 checksum
How to use checksums
968412a7722ec7a6285a06c4c72b8484db7293ddac454cbe8176d43b581d9178
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 18, 2026.

Transparency log

Release files / chromiumfish-0.2.4-py3-none-any.whl

Download URL chromiumfish-0.2.4-py3-none-any.whl
Size 35.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f9f04aa7efa0d4c656f27f04d1f28775603b333a32d7aae68b5a0740ef24c77c
BLAKE2b-256 checksum
How to use checksums
c5823015c56ab478a06f8e3d880a68393c70ed67eaa05cfa067d300a2d967c9b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 18, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

This release

0.2.4 This release

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page