Skip to main content

Web access for LLM agents. One static binary. No Chrome.

Project description

unbrowser

Web access for LLM agents. One static binary. No Chrome.

Single-file native headless browser optimized for LLM agents. Runs JavaScript via QuickJS, returns a low-token page summary on every navigate, and gives you stable element refs for click/type/submit. Tens of MB RAM per session, no Chrome dependency.

pip install pyunbrowser   # PyPI name; the import is `from unbrowser import ...`

The wheel ships the native binary for your platform — there's nothing else to install.

Quick start

from unbrowser import Client

with Client() as ub:
    r = ub.navigate("https://news.ycombinator.com")
    for s in ub.query(".titleline > a")[:3]:
        print(s["text"], s["attrs"]["href"])

Why

curl This Playwright / headless Chrome
Static / SSR pages ✅ but token-heavy ✅ low-token BlockMap overkill
SPA-shell sites (with exec_scripts) ⚠️ partial
Bot-walled (cookie handoff)
Run in Lambda / Workers / edge ❌ Chrome too big
Per-page cost at 100K/day ~free ~free $$$
LLM-shaped output DIY parse ✅ inline BlockMap DIY parse

What it does

  • navigate(url) — fetch, parse, return {status, url, bytes, headers, blockmap, challenge}. With exec_scripts=True, runs page JS in QuickJS (bounded by a 30s watchdog so it can't wedge).
  • query(selector) — CSS query → [{ref, tag, attrs, text}]. Refs are stable handles for click/type/submit.
  • extract() — auto-strategy structured data: tries JSON-LD → __NEXT_DATA__ → Nuxt → OpenGraph → microdata → text fallback, returns highest-confidence hit.
  • click(ref) / type(ref, text) / submit(ref) — interaction. POST and GET forms supported. Checkboxes/radios tracked.
  • cookies_set(...) — paste cookies from a real Chrome session to bypass bot detection (Cloudflare, PerimeterX, Datadome). Solve once, replay forever.

Full RPC reference, BlockMap shape, challenge detection, profile system, and architecture: github.com/protostatis/unbrowser.

Honest limits

  • Heavy framework SPAs (Ember/React) often don't auto-mount inside QuickJS even with exec_scripts=True — the watchdog ensures it returns, check density.likely_js_filled to decide whether to escalate.
  • No screenshots (out of scope by design).
  • Hardest-tier anti-bot (FingerprintJS Pro, Kasada, advanced Akamai BMP) needs the cookie handoff path. The binary detects and labels the challenge for you.

License

Apache-2.0.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyunbrowser-0.0.4.tar.gz (11.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pyunbrowser-0.0.4-py3-none-manylinux_2_35_x86_64.whl (4.1 MB view details)

Uploaded Python 3manylinux: glibc 2.35+ x86-64

pyunbrowser-0.0.4-py3-none-macosx_11_0_arm64.whl (3.6 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file pyunbrowser-0.0.4.tar.gz.

File metadata

  • Download URL: pyunbrowser-0.0.4.tar.gz
  • Upload date:
  • Size: 11.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyunbrowser-0.0.4.tar.gz
Algorithm Hash digest
SHA256 3923891245c6c07242d3f67d8e12ac787f60b6b070552be19fa8d2264844bf88
MD5 c9bb9fdc84fe5fca3ffc55d7bd62e436
BLAKE2b-256 f6af68e4dfcbcfb81aeff60382bea3e01dd6f4fa1ff362443830560bb44ba349

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyunbrowser-0.0.4.tar.gz:

Publisher: release.yml on protostatis/unbrowser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyunbrowser-0.0.4-py3-none-manylinux_2_35_x86_64.whl.

File metadata

File hashes

Hashes for pyunbrowser-0.0.4-py3-none-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 caca7e6e18abd569bd710cddc9c0c4d2f0025bb1aab24262ca1e3cd7afb8d0b4
MD5 9dc8cd5db58e7540d216f5950c5bf575
BLAKE2b-256 04958e97338703df6651137f13a28b85d30c373d6108c7a7703e930c5d65e1ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyunbrowser-0.0.4-py3-none-manylinux_2_35_x86_64.whl:

Publisher: release.yml on protostatis/unbrowser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyunbrowser-0.0.4-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyunbrowser-0.0.4-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 77713a640c0ca126bedd410c39428c35285fc97eb986143093c2e0b9263d8a84
MD5 263aa70095da1ad062741d56301bc96a
BLAKE2b-256 40bac006bb1c4df618c8455ea17ddb1c942edb30e8be55670a19f22b9bb4aa2b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyunbrowser-0.0.4-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on protostatis/unbrowser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page