Patchwright stealth + Vibium-style LLM-friendly CLI for agentic browser automation.
Project description
vibatchium
Agent-piloted browser automation that clears Cloudflare. Patched Playwright + multi-session daemon + credential vault + vision clicking + prompt-injection safety. One MCP server, N parallel Chromes, persistent per-session profiles.
pipx install vibatchium # or: pip install vibatchium
patchright install chrome
vb setup # register MCP + an auto-discoverable skill so agents reach for vb (idempotent)
Bleeding edge from
master:pipx install git+https://github.com/trueoriginlabs/vibatchium
Coding agents (Codex / Cursor / Claude Code): read
AGENTS.mdfirst — it has the one-call recipes (explore,research) and the env-discovery traps to skip.
vb explore https://example.com # one-call: text-first (screenshot only as a fallback)
vb research --target https://example.com \ # parallel fan-out, N intents
--intent "pricing model" --intent "customers" --intent "tech stack"
Status: active development, alpha. 606 tests green. 31/31 on bot.sannysoft.com. Cleared HackerOne Cloudflare cold-launch. Apache-2.0 (AGPL only via the opt-in nodriver extra).
Updating
vb update # upgrade to the latest PyPI release + restart the daemon
vb update --version 0.6.8 # or pin a specific version
vb update detects how vibatchium was installed (pipx or pip, with a PEP-668
--break-system-packages fallback) and then stops the running daemon so the
next command loads the new code. Manual equivalent:
pipx upgrade vibatchium # or: pip install -U vibatchium
vb shutdown # bounce the daemon — it serves old code until you do
vb --version # confirm
The daemon-restart step is the one people miss: the long-running daemon keeps serving the old version until it's bounced.
vb updatedoes it for you; if you upgrade by hand, runvb shutdown(the nextvbcall auto-respawns the new version). Optional features upgrade viapipx install 'vibatchium[all]' --force.
Why vibatchium
| Vibium | Patchwright | Browser-Use | vibatchium | |
|---|---|---|---|---|
LLM-friendly @eN refs + map / diff map |
✅ | ❌ | ❌ | ✅ |
| Cloudflare CDP-leak patches | ❌ | ✅ | ❌ | ✅ |
| Multiple parallel browsers, one daemon | ❌ | manual | ❌ | ✅ |
| Per-session persistent profile (cookies, login) | ✅ | manual | manual | ✅ |
| CDP-attach to manually-logged-in Chrome | ❌ | manual | ❌ | ✅ |
| Encrypted credential vault (passwords + TOTP) | ❌ | ❌ | ❌ | ✅ |
| IMAP email-code polling (2FA) | ❌ | ❌ | ❌ | ✅ |
| Per-session proxy + WebRTC leak guard | ❌ | manual | ❌ | ✅ |
| Vision-first clicking with spend cap | ❌ | ❌ | ✅ | ✅ |
| Prompt-injection classifier on scraped content | ❌ | ❌ | ❌ | ✅ (0% FP / 204 samples) |
| Live-view stream with takeover (WebSocket) | ❌ | ❌ | partial | ✅ |
| Bearer-token REST shim + caps gating | ❌ | ❌ | manual | ✅ |
research command (parallel fan-out) |
❌ | ❌ | ❌ | ✅ |
Multi-session in 10 lines
vb session new work
vb --session work start
vb --session work go https://github.com # log in by hand once
vb session new banking
vb --session banking start
vb --session banking go https://bank.example.com
vb --session work click @e3 & # truly parallel —
vb --session banking fill @e5 hi & # separate Chromes, no cookie bleed
wait
vb session list
Active-session resolution: --session FLAG → $VIBATCHIUM_SESSION env → ~/.config/vibatchium/active-session → default. Cap via VIBATCHIUM_MAX_SESSIONS=4 (default 4).
Documentation
AGENTS.md— coding-agent contract (Codex / Cursor / Claude Code)
Server modes
| Mode | Surface | Auth |
|---|---|---|
vb mcp |
stdio JSON-RPC; defaults to the lean ~80-verb profile (--caps=full/all for the full surface; --caps=... for a custom bucket set) |
n/a (stdio) |
vb serve |
FastAPI on 127.0.0.1:8000; every verb at POST /v1/<verb>; WebSocket live-view at /v1/stream/<session> |
bearer token (~/.cache/vibatchium/rest-token, mode 0600) |
REST capability gating: vb serve --caps=core,nav,input,vision restricts the HTTP surface the same way mcp --caps does. Without it, REST grants local-code-equivalent access (eval + secret_* + file-writing verbs all exposed) — safe for localhost dev, not for hosted/multi-tenant.
Stealth tiers — what clears what
Stealth is a ladder, not a boolean. Pick the lowest tier that clears your target (higher tiers cost more setup / a visible browser / a manual login). vibatchium does not claim cold-launch defeat of behavioral walls — those need a real human-driven session, and attach-mode is the honest answer.
| Tier | How | Clears | Doesn't clear |
|---|---|---|---|
| Standard (default) | headless cold launch, real channel=chrome, de-Headless'd UA |
Cloudflare IUAM / managed challenge, bot.sannysoft 31/31, JS-runtime fingerprinting |
aggressive Turnstile, DataDome/Kasada, anything behind a login |
| Hardened | retry --headed; vb humanize on; --backend nodriver (pip install vibatchium[nodriver], AGPL) for the hardest Cloudflare gates |
aggressive Cloudflare/Turnstile, GPU/screen tells that headless leaves | behavioral biometrics, DataDome/Kasada sensor-fusion |
| Attach | vb attach to a Chrome you launched and logged into |
DataDome / Kasada / HUMAN behavioral walls, and any authenticated session — your real fingerprint + cookies | nothing here is automated cold; it needs the human login first |
Escalation ladder when a wall trips: headless → --headed → humanize on →
--backend nodriver → attach-mode after a manual login. Patchright's CDP-layer
patches apply in all tiers, including attach (connect_over_cdp).
The
fetchverb is an orthogonal fast-path, not a tier: once you're past a wall in the browser,vb fetchreuses that session's cookies+proxy to hit JSON/API endpoints at TLS-fingerprint-correct speed — but it runs no JS, so it can't clear a JS challenge itself.
Attach mode — the practical Cloudflare workaround
For DataDome / Kasada / hardened auth that walls cold-launch automation:
google-chrome --remote-debugging-port=9222 --user-data-dir=/tmp/cdp-profile &
# log into the walled site by hand
vb attach http://localhost:9222
vb go https://target.example.com # now reads as your real browser
Patchright's CDP-layer stealth still applies over connect_over_cdp — attach mode gets the same protocol-level patches as cold launch, plus your real-browser fingerprint and any cookies from the manual login.
Security model
Credentials never appear in logs, HAR captures, observe cache, or agent-visible response fields (grep-tested in CI). Vault uses XSalsa20-Poly1305 with key from OS keyring or VIBATCHIUM_SECRETS_KEY. All vibatchium-written files are 0600; directories 0700.
For the REST shim: without --caps, the bearer token grants every verb including eval, secret_*, and file-writing verbs. Local-code-equivalent — always pass --caps=... for hosted-mode. Live-view binds 127.0.0.1 only by default (--insecure-public to override).
Honest limits
- 5+ concurrent sessions = 1-2GB RAM. Each persistent-context Chrome is ~200-400MB. Bump cap with
VIBATCHIUM_MAX_SESSIONS=8. - Vision spend cap is process-wide. N fan-out agents share one daily/lifetime budget.
- Init scripts don't work on patchright backend.
chrome.runtimestaysundefined— accepted trade for stealth wins. - Login walls (X, LinkedIn) require attach mode. Cold-launch fan-out can't defeat sites requiring authenticated sessions.
- Synthetic input has a CDP coordinate signature. Every
click/type/hover/scrollrides Playwright over CDPInput.dispatchMouseEvent/dispatchKeyEvent(pageX==screenX, noCoalescedEvents). Patchright patches the JS-context leaks, not the Input domain, andhumanize onimproves trajectory/timing realism but does not change the per-event signature. Behavioral walls that fingerprint it (DataDome/Kasada/HUMAN) want attach-mode against a real headful Chrome you drive — OS-level synthetic input (CDP-Patches) is headful + active-tab only and doesn't fit a headless, N-parallel daemon. fetchis a static-fingerprint lane, not a browser. The curl_cffifetchverb matches Chrome's JA3/HTTP2 but runs no JavaScript — it clears TLS-fingerprint gates, not DataDome/Kasada/Turnstile JS challenges. Fall back togofor those.- Single daemon = single point of failure. No HA built in.
License
Apache-2.0 core. Every default-install extra is permissive too — the fetch lane's curl_cffi is MIT. The only copyleft option is the opt-in nodriver backend (AGPL-3.0) — consult licensing before integrating it commercially. Nothing GPL/AGPL ships in the base install or [all].
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 vibatchium-0.11.0.tar.gz.
File metadata
- Download URL: vibatchium-0.11.0.tar.gz
- Upload date:
- Size: 400.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cfd5c8e6d689c9e16cb4c4688b3aef962f7468a0913c7aa355c14e24c6b88577
|
|
| MD5 |
bfb48f435e4164a156eb4cdc0b4b5793
|
|
| BLAKE2b-256 |
de0b1f18de517e83bb11da7c26220aff892408f86bce159967f815556e5f7917
|
Provenance
The following attestation bundles were made for vibatchium-0.11.0.tar.gz:
Publisher:
publish.yml on trueoriginlabs/vibatchium
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vibatchium-0.11.0.tar.gz -
Subject digest:
cfd5c8e6d689c9e16cb4c4688b3aef962f7468a0913c7aa355c14e24c6b88577 - Sigstore transparency entry: 1925426065
- Sigstore integration time:
-
Permalink:
trueoriginlabs/vibatchium@65fb7adcbd031362d98773a4a09d136a71963e47 -
Branch / Tag:
refs/tags/v0.11.0 - Owner: https://github.com/trueoriginlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@65fb7adcbd031362d98773a4a09d136a71963e47 -
Trigger Event:
push
-
Statement type:
File details
Details for the file vibatchium-0.11.0-py3-none-any.whl.
File metadata
- Download URL: vibatchium-0.11.0-py3-none-any.whl
- Upload date:
- Size: 288.7 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 |
ba7531cfae3fc5723adb255469e046a15f9fe4d96f9128887eefa4b3ee324dd5
|
|
| MD5 |
51f42ca107cb501c3b4861a7a936b785
|
|
| BLAKE2b-256 |
2c5671af79a999ded4c89a7f0e1efbf6bf3e80839ee3bee6f3a0d86b61871288
|
Provenance
The following attestation bundles were made for vibatchium-0.11.0-py3-none-any.whl:
Publisher:
publish.yml on trueoriginlabs/vibatchium
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vibatchium-0.11.0-py3-none-any.whl -
Subject digest:
ba7531cfae3fc5723adb255469e046a15f9fe4d96f9128887eefa4b3ee324dd5 - Sigstore transparency entry: 1925426191
- Sigstore integration time:
-
Permalink:
trueoriginlabs/vibatchium@65fb7adcbd031362d98773a4a09d136a71963e47 -
Branch / Tag:
refs/tags/v0.11.0 - Owner: https://github.com/trueoriginlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@65fb7adcbd031362d98773a4a09d136a71963e47 -
Trigger Event:
push
-
Statement type: