v0.2.0 — contracts, CDP engines, and things that were declared but did not work
The theme of this release is capabilities that were declared and did not work — the
worst state for a capability table to be in, because the validator accepts your spec and
the failure arrives much later.
Highlights
Every engine actually runs. 126 verified engine × binary × display combinations, up
from 51, each one launched against a served page rather than read off a table. Playwright,
Patchright, playwright-stealth, rebrowser, Selenium, undetected-chromedriver, SeleniumBase,
Botasaurus, Camoufox, nodriver, zendriver, pydoll — plus engine=http, which needs no
browser at all. Chromium, Chrome, Firefox, WebKit and Brave, headless, headed and xvfb.
Contracts, enforced. A node's declarations are load-bearing: the linter decides whether
a graph verifies its mutations by trusting mutates, and the scheduler parallelises on
reads/writes. A node that misdeclares itself does not fail — it silently switches those
checks off. Declarations are now checked at import, at composition, and at run time.
Two diagrams. browsergraph planes draws the architecture: a task decomposes into
planes, each offering interchangeable candidates, and the chosen route moves as evidence
arrives. browsergraph space draws the configuration space — click stealth=undetected
and five engines grey out at once.
Notebooks work. Jupyter, Kaggle and Colab run every cell inside an asyncio loop, which
Playwright's sync API refuses. The adapter is now driven from a worker thread, so
engine=playwright works in a notebook with no setup — screenshots and video included.
browsergraph bootstrap. Probe, pip, browser binary, system libraries, a Chrome
already on PATH — re-launching after every step, because an installer's exit code is not
evidence that a browser starts.
Fixed
- A failed Playwright launch poisoned the whole interpreter for every later call.
- Escalation never reached its alternatives; an unbounded retry burned every attempt on the
engine that had just failed. - Selenium could not drive Firefox at all — a snap wrapper script plus Chrome's flag syntax.
- Every Firefox session leaked a geckodriver process; a snap-confined process cannot be
signalled even by its owner, and selenium swallows its own teardown failure. - The default
LLMConfigreturnedHTTP Error 404against a healthy Ollama. - Phone extraction invented a number on python.org, whose homepage prints a Fibonacci series.
focusreported negative savings, anddoctorreported a working engine as missing.
Full detail in CHANGELOG.md.
Install
pip install "browsergraph[playwright] @ git+https://github.com/aidonerightcorp/browsergraph.git"
browsergraph bootstrap
browsergraph doctorOr run the whole tour on Kaggle
without installing anything.
618 tests, mypy and ruff clean.