Skip to main content

Fast URL → fully-rendered HTML + optional screenshot for Python, powered by Chromium via CDP

Project description

onyxweb

onyxweb takes a URL and returns the HTML a real browser renders, after the page's JavaScript has run. It's a Python package, but the work happens in a Rust core that drives Chromium over the Chrome DevTools Protocol. There's no Node process in the middle like Playwright, and no separate WebDriver like Selenium.

The common tools each fall short somewhere. requests and httpx are fast but don't run JavaScript, so a modern site returns an empty <div id="root">. Playwright renders the page, but every call crosses from Python into Node, which adds up over thousands of URLs. Selenium is older, slower, and keeps a driver between the caller and the browser. onyxweb returns the rendered HTML, fast, from a single install, with nothing extra in the call chain.

The response is the post-JavaScript HTML, and on request a screenshot, the full HTTP response (status, real headers, TLS cert, redirect chain, content hashes), and a read on whether the site sits behind a WAF. It targets high-throughput, read-mostly work like security recon, subdomain sweeps, and change detection, where a single process pulls hundreds of URLs a minute.

Requires Python 3.10+.

import onyxweb

html = onyxweb.fetch("https://example.com")        # rendered HTML, post-JS
png  = onyxweb.screenshot("https://example.com")   # PNG by default (jpeg/webp too)
both = onyxweb.fetch_all("https://example.com")     # HTML and image from one visit

# The CSS/BS4 queries run in Rust, so there's no Python parse on every page
print(html.dom.title())            # "Example Domain"
print(html.dom.find("h1").text)    # "Example Domain"
print(html.dom.links())            # ["https://www.iana.org/..."]

Requirements

  • Python 3.10+
  • A Chromium binary. onyxweb --install downloads the pinned chrome-headless-shell (~180 MB, one time), or point onyxweb at a system chromium / chrome.

Install

Two steps, the same idea as Playwright: a small wheel, then a one-time browser download.

uv add onyxweb              # or pip install onyxweb, or pipx install onyxweb
uv run onyxweb --install    # download chrome-headless-shell

If chromium is already on the PATH, skip --install. onyxweb looks for a browser in this order: chrome_path= or ONYXWEB_CHROME__PATH, then the --install download, then chromium / chrome on the PATH.

Wheels are prebuilt for linux (x86_64, aarch64), macOS (arm64), and Windows x86_64. On anything else, including Intel macOS, pip builds from source, which needs a stable Rust toolchain (install rustup). The --install step is the same either way.

Benchmarks

This is the reason the core is Rust rather than a wrapper over Playwright. 48-URL gauntlet, 16-core Linux, chrome-headless-shell 148. Full method is in BENCHMARKS.md.

Tool Config URL/s
onyxweb P=16, mode=both 8.54
Playwright-python P=16 5.82
Chromium headless, fork per URL P=16 4.51
Servo 0.1.0, in-process P=8 1.13

At equal concurrency that's about 1.9 s/URL for onyxweb against 2.7 s/URL for Playwright. Most of the gap is the Python-to-Node hop onyxweb doesn't have to make.

CLI

onyxweb https://example.com                    # HTML to stdout
onyxweb https://example.com -o page.html        # HTML to a file
onyxweb https://example.com -s shot.png         # HTML plus a screenshot file
onyxweb https://example.com --screenshot-only shot.webp   # image only
onyxweb https://example.com --json              # HTML and metadata as JSON

Image format follows the output extension (.jpg/.jpeg, .webp, otherwise png); override it with --format and --quality. The config options are all flags too: --user-agent, --width, --height, --timeout-ms, --locale, --timezone, --proxy, --header K=V, --no-js, --chrome PATH, and a few more (onyxweb --help lists them all). Presets plug in with --preset:

onyxweb --preset full.stealth.BASIC https://www.tesla.com/
onyxweb --preset shell.recon.FAST https://example.com -o page.html
onyxweb --preset list        # print every preset and exit

The Client

The module-level fetch / screenshot / fetch_all share one lazily-created Client, which is fine for a script or a notebook. For anything high-volume, make a dedicated Client to set the concurrency and reuse the warm browser instead of paying the launch cost on every call.

with onyxweb.Client(
    concurrency=16,
    viewport=(1920, 1080),
    user_agent="MyScraper/1.0",
    locale="en-GB",
    timezone="Europe/London",
    block_urls=["*doubleclick*", "*.googletagmanager.com/*"],
) as client:
    for r in client.batch(urls, capture="html"):   # runs N at a time inside tokio
        ...

Configuration takes three forms, whichever fits: flat keyword arguments like above, a ClientConfig object, or ONYXWEB_* environment variables, which pydantic loads on its own.

A single Client is safe to share across threads. Every method releases the GIL before it goes into Rust, so N Python threads do real parallel work, capped by the Client's concurrency.

with onyxweb.Client(concurrency=16) as client:
    with ThreadPoolExecutor(max_workers=16) as pool:
        results = list(pool.map(client.fetch, urls))

There's a full async version as well. It constructs the same way and takes the same config; the methods return coroutines.

async with onyxweb.AsyncClient(concurrency=16) as ac:
    r = await ac.fetch(url)
    htmls = await asyncio.gather(*(ac.fetch(u) for u in urls))

client.config is a live view of the config. Assign to it at any depth and the next fetch uses the new value. The fields Chrome needs at startup (concurrency, the chrome options) can't change after launch, so assigning to those raises a ValueError right at that line rather than failing silently.

client.config.network.user_agent = "Bot/2.0"    # takes effect next fetch
client.config.concurrency = 32                   # ValueError, make a new Client for this

Two engines: shell and full

There are two Chromium builds to choose from, and the right one depends on what the target runs.

onyxweb.Client(engine="shell")   # default, the bundled chrome-headless-shell
onyxweb.Client(engine="full", chrome_path="/usr/bin/google-chrome")

shell is the default: the small bundled chrome-headless-shell, fast and light. The catch is that it's the old headless mode, which WAFs like Akamai can detect and flag even with a spoofed user agent.

full is a real Chrome running in --headless=new, launched with the automation tells stripped out (navigator.webdriver reads false, a real Chrome user agent, and so on). It's close enough to a normal browser to get past the Akamai/Cloudflare-class sites the shell can't. It's heavier, and it needs a full Chrome binary, so either pass chrome_path= or have google-chrome / chromium installed. It pairs naturally with bypass_anti_bot.

Anti-bot

r.anti_bot is populated on every fetch, whether or not a bypass is requested. Even a plain fetch reports that a host sits behind Akamai, which is a useful recon signal on its own.

r.anti_bot          # AntiBot(vendor="akamai", kind="challenge", resolved=True) or None
r.anti_bot.vendor   # "akamai" / "cloudflare" / "datadome" / ... or None if it's generic
r.anti_bot.kind     # "challenge" (a JS interstitial) or "block" (a hard 403/429)
r.anti_bot.resolved # True if the real page was reached

bypass_anti_bot is the switch that actually tries to get through, and it's vendor-agnostic (Akamai, Cloudflare, DataDome, PerimeterX, Imperva). It does two things. First, it waits out challenge interstitials, the "checking your browser" page that runs a JS check and then reloads itself to the real content, polling until the real page settles so there's no settle time to guess. Second, it self-heals a hard block: on a 403 or 429 with a WAF signature it drops just the anti-bot cookies (_abck, bm_*, datadome, cf_clearance, and similar), keeps everything else, and retries once.

onyxweb.Client(bypass_anti_bot=True)          # on for the whole client
client.fetch(url, bypass_anti_bot=True)       # on for one fetch

It's off by default. The recon and stealth presets turn it on. It works best on the full engine, since the shell gets hard-blocked. An interactive captcha it can't solve will time out, returning whatever is on the screen.

On where it lands: in testing, the full engine with stealth pulled real content past Akamai, DataDome, PerimeterX, and Cloudflare on sites like tesla.com, ticketmaster, and hermes. It does not beat Kasada (footlocker, nike's launch pages) or an interactive captcha, and when it can't get through it reports that plainly through .anti_bot rather than returning a challenge stub as if the fetch had succeeded.

Per-fetch options

Each client.fetch(url, ...) takes overrides that apply to just that one call. Afterward the pool tab is reset to its baseline (scripts removed, blocks cleared, headers restored), so nothing set on one fetch leaks into the next.

client.fetch(
    url,
    scripts=[HOOK_JS],              # runs before any page script; for hooks and patches
    post_load_scripts=[             # runs on the loaded page; returns land in r.post_load_results
        "Array.from(document.querySelectorAll('a')).map(a => a.href)",
    ],
    block_urls=["*://*.tracker.example/*"],   # network block for this fetch only
    block_navigation=True,          # abort navigations the page tries after it loads
    actions=[onyxweb.Click(selector="#login")],   # CDP-trusted click / fill / hover / wait
    extra_headers={"Referer": "https://ref.example/"},   # cross-origin Referer works here
)

The result carries the side channels so they line up with the HTML:

r.post_load_results    # one entry per post_load_script, json-decoded
r.console_messages     # the page's console.* output
r.errors               # console errors and uncaught exceptions
r.final_url            # after redirects
r.status_code

The response

Every result carries the whole HTTP response, not just the body. The shape deliberately follows blasthttp, so a rendered onyxweb response drops straight into BBOT's HTTP_RESPONSE.

r = client.fetch("https://example.com")

r.metadata.status_code     # 200
r.metadata.mime_type       # "text/html"
r.metadata.protocol        # "h2" / "http/1.1" / "h3"
r.metadata.remote_ip       # "93.184.216.34"
r.metadata.redirect_chain  # [RedirectHop(url=..., status=301, ...), ...]
r.metadata.cert_info       # CertInfo(common_name, sans, issuer, ...) or None
r.metadata.body_hashes     # Hashes(md5, mmh3, sha256)

r.headers["content-type"]  # case-insensitive
r.headers.set_cookie       # every Set-Cookie value
r.headers.cookies          # parsed name -> value
r.headers.raw              # the canonical "Name: Value\r\n..." block

The hashes are computed in Rust and come out byte-for-byte identical to Python's hashlib and mmh3.hash() (mmh3 being the signed 32-bit MurmurHash3 at seed 0), so they line up with BBOT and blasthttp. Worth knowing: on HTTP/2 and HTTP/3 there is no textual header block on the wire, the headers are binary. So headers.raw is a canonical reconstruction from the real received headers, and it is never a fabricated HTTP/1.1 200 OK status line. The names and values are always the real ones.

Querying the DOM

r.dom is a Rust-parsed DOM (parsed lazily, on first use) with both CSS selectors and BeautifulSoup-style lookups. The parse and the queries run in Rust, which keeps the HTML-parsing cost off Python across a lot of pages.

r.dom.query("a[href^='https://']")     # list of Elements
r.dom.query_one("meta[name='generator']")
r.dom.exists("script[type='module']")  # bool
r.dom.find("nav", class_="main-nav")   # BS4-style
r.dom.find_all("div", class_="card", limit=10)
r.dom.title(); r.dom.links(); r.dom.images()
r.dom.contains("Cloudflare")           # plain substring, skips the parse entirely

Injecting JavaScript, and presets

ScriptsConfig injects JS into each page through CDP, with the timing and scope options usually needed:

Client(scripts={
    "on_new_document":       [js],   # before any page script, on every navigation
    "on_dom_content_loaded": [js],   # wrapped in a DOMContentLoaded listener
    "on_load":               [js],   # wrapped in a window.load listener
    "isolated_world":        [js],   # a separate JS world; page scripts can't see its globals
    "url_scoped":            {"/path": [js]},   # only when the URL contains the key
})

Two limits worth stating up front, both CDP's rather than onyxweb's: init scripts don't reach cross-origin iframes or workers, and a change to scripts.* at runtime only affects new pool tabs, not the ones already open.

Presets are just dicts spread into Client(...). They're organized engine-first, because the shell and the full engine want opposite recipes, and then by purpose.

from onyxweb.presets.shell import recon, stealth as shell_stealth
from onyxweb.presets.full import stealth as full_stealth

Client(**recon.FAST).fetch(url)                    # fast shell sweep, JS off
Client(**shell_stealth.BASIC).fetch(url)           # against naive detection (shell)
Client(**full_stealth.BASIC).fetch("https://www.tesla.com/")   # against a real WAF (full Chrome)
Preset What it sets When to use it
full.stealth.BASIC real Chrome, automation tells stripped, bypass_anti_bot, no JS patches Akamai/Cloudflare-class WAFs (needs a full Chrome binary)
shell.stealth.BASIC UA and Sec-CH-UA swap, JS patches, bypass_anti_bot sites with naive JS bot checks, not a real WAF bypass
shell.stealth.FINGERPRINT BASIC plus a WebGL vendor override and canvas noise a bit more fingerprint diversity on the shell
shell.recon.FAST JS off, 5 s timeout, an ad/tracker block list subdomain sweeps where only the bytes matter, fast
shell.archival.FULL_PAGE 1920x1080, 30 s timeout, a 2 s post-load settle change-detection snapshots of SPA-heavy sites

Making a custom one is just a dict literal:

CRAWLER = {
    "user_agent": "CorpCrawler/2.0",
    "extra_headers": {"X-Token": os.environ["TOKEN"]},
    "block_urls": ["*://*.tracker.example/*"],
}
with Client(**CRAWLER) as c: ...

The shell stealth patches are modeled on rebrowser-patches. They're opt-in and each one is commented with the specific check it's meant to defeat, so nothing is hidden. They're for naive client-side bot checks, not WAFs. The shell is old-headless and Akamai-class WAFs hard-block it no matter how many patches are applied, so use the full engine for those. Stealth also deliberately leaves some things untouched, listed here rather than left as a surprise: the TLS ClientHello (it already matches real Chrome, since it's the same BoringSSL build), cross-origin iframes (Cloudflare Turnstile runs in one), workers, behavioral timing, and the Runtime.enable CDP tell, which would need a patched Chromium binary to remove.

Config reference

Everything lives under a nested sub-config, and the flat keyword arguments map onto the nested field.

Section Fields
top level concurrency, wait_until, wait_after_ms, wait_after_post_load_ms, bypass_anti_bot, capture_console_level
viewport width, height, device_scale_factor, mobile
network user_agent, user_agent_metadata, proxy, proxy_bypass_list, extra_headers, ignore_https_errors, block_urls, disable_cache, offline, latency_ms, download_bps, upload_bps
emulation locale, timezone, geolocation, prefers_color_scheme, javascript_enabled
scripts on_new_document, on_dom_content_loaded, on_load, isolated_world, isolated_world_name, url_scoped
timeout navigation_ms, launch_ms, screenshot_ms
chrome path, args, user_data_dir, headless, engine

Environment variables use the ONYXWEB_ prefix with __ for nesting, so ONYXWEB_CONCURRENCY=32, ONYXWEB_VIEWPORT__WIDTH=1920, ONYXWEB_NETWORK__USER_AGENT='...'. The proxy accepts http://user:pass@host:port (auth handled internally) and can be changed at runtime; when proxying localhost during testing, pair it with proxy_bypass_list="<-loopback>".

wait_until is either "load" (the default, window.onload) or "domcontentloaded" (parser done, faster, but it can miss work an SPA does after DCL). wait_after_ms and wait_after_post_load_ms are fixed sleeps for pages that hydrate late.

Errors

Timeouts, both onyxweb's own navigation timeout and Chromium's CDP timeout, raise the builtin TimeoutError. Anything else raises onyxweb.OnyxwebError, which is a subclass of RuntimeError, so existing except RuntimeError still catches it.

try:
    r = client.fetch(url)
except TimeoutError:
    ...
except onyxweb.OnyxwebError:   # bad URL, DNS failure, CDP error, chrome not found, ...
    ...

batch is the exception to this, it never raises. A URL that fails comes back as the exception object in its input position in the list, with .url and .kind attached, so one bad URL in a batch of thousands doesn't take down the rest.

Logging

Set ONYXWEB_LOG (or RUST_LOG as a fallback) to error (the default), warn, info, debug, or trace, or call onyxweb.set_log_level(...) at runtime. A bare level narrows to onyxweb's own logs, so debug won't be buried under tungstenite and hyper noise.

ONYXWEB_LOG=debug python script.py

Development

Development needs uv and a stable Rust toolchain (rustup; the channel is pinned in rust-toolchain.toml). uv manages the Python version through .python-version.

uv sync                             # venv, deps, and the Rust extension built in editable mode
uv run onyxweb-download-chrome      # fetch chrome-headless-shell
uv run pytest                       # the test suite
uv run ruff check .                 # lint
uv run mypy python/onyxweb          # typecheck
uv run pytest -m benchmark -s       # the perf gauntlet, skipped by default

Editing anything in src/*.rs triggers a rebuild on the next uv run, so there's no manual build step. The tests are all Python end-to-end; there are deliberately no Rust unit tests, so there's a single test layer to reason about.

License

BSD 3-Clause. The bundled chrome-headless-shell is also BSD-3-Clause (it's Google's Chrome for Testing).

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

onyxweb-0.2.0.tar.gz (233.9 kB view details)

Uploaded Source

Built Distributions

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

onyxweb-0.2.0-cp314-cp314-win_amd64.whl (3.8 MB view details)

Uploaded CPython 3.14Windows x86-64

onyxweb-0.2.0-cp314-cp314-macosx_11_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

onyxweb-0.2.0-cp313-cp313-win_amd64.whl (3.8 MB view details)

Uploaded CPython 3.13Windows x86-64

onyxweb-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

onyxweb-0.2.0-cp313-cp313-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

onyxweb-0.2.0-cp313-cp313-macosx_11_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

onyxweb-0.2.0-cp312-cp312-win_amd64.whl (3.8 MB view details)

Uploaded CPython 3.12Windows x86-64

onyxweb-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

onyxweb-0.2.0-cp312-cp312-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

onyxweb-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

onyxweb-0.2.0-cp311-cp311-win_amd64.whl (3.8 MB view details)

Uploaded CPython 3.11Windows x86-64

onyxweb-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

onyxweb-0.2.0-cp311-cp311-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

onyxweb-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

onyxweb-0.2.0-cp310-cp310-win_amd64.whl (3.8 MB view details)

Uploaded CPython 3.10Windows x86-64

onyxweb-0.2.0-cp310-cp310-manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

onyxweb-0.2.0-cp310-cp310-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

File details

Details for the file onyxweb-0.2.0.tar.gz.

File metadata

  • Download URL: onyxweb-0.2.0.tar.gz
  • Upload date:
  • Size: 233.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for onyxweb-0.2.0.tar.gz
Algorithm Hash digest
SHA256 74a363f108cc0f0a8d4ead902967497caf2f733caaf08623a11efd23dee20170
MD5 8cbb149700a42dbc33b8851ecbad4e8b
BLAKE2b-256 360d58b08209f862eb2274c163d8701da71d7e23d55f46a783c12be9ea24e609

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0.tar.gz:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: onyxweb-0.2.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 3.8 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for onyxweb-0.2.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 fbe69969a158c36aa2640980f10728a25b25e3de65ccf7a35b0e3a99f7389d37
MD5 1f18d797a00bb8fb92f585aa9ae5b588
BLAKE2b-256 1927e8c15537bc001501123adceea80a4129313599e2dc79e4af5e90b3161beb

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp314-cp314-win_amd64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for onyxweb-0.2.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a320a855d82e8e0c746ae8434419bff6d877a2329c1ed6364096f129ea90989f
MD5 7a04c886df5e10f515dede604162146c
BLAKE2b-256 fe6b2d10d0560eb88e25f2f375dcfd57e1ae4312e88f827895e06c4ef0d81572

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: onyxweb-0.2.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 3.8 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for onyxweb-0.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 bd7897c7a309d4f0c2e334227fa939e68978528b4985b8ad6d0fce253544fff1
MD5 b69a53829671479999c29837fc1fb706
BLAKE2b-256 649a8a767bb25e8701c5f6e80690a093aeec74a3aefb397cca503f78d3fea136

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for onyxweb-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 dd25f5ca5140935f7d02a4f83a361490a4a6e71f1126be53619d26caa2567c21
MD5 e619f699d02a5a4fd8001222168bdf28
BLAKE2b-256 ff05e890f79b751ca0a77dd3744a972ce00803832f0131c33b30c5778b24f10e

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for onyxweb-0.2.0-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4304faa1618cb67b7a86b3e4ec1d63e048aaa8aac109752f34e80a054a0f27b1
MD5 d5c2b852c9983080fc9003edd22a9eb4
BLAKE2b-256 cfacc3c49be41cb485c7d174ca33b2d5d35dfb0abba39fee8f46aa65d3dfc1b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp313-cp313-manylinux_2_28_aarch64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for onyxweb-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b2c78b6f56389b1cdf1eedf8a10dde676346fce2c00904407141d1d562b32cfa
MD5 70bf9f90db5b36d69cf32282b8de314c
BLAKE2b-256 87c55c8d5494f8527b0809efcbc710a25e58fc2b870ececfd9266ad3de068d00

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: onyxweb-0.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 3.8 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for onyxweb-0.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d35004fc77795be2efa9240367cad79613b35068882e1bb2911b13cf7a70afc5
MD5 24331b45ca1d800abd6793e73dda7775
BLAKE2b-256 f418c147c0c5e8bb88a41592b51fcbd2f38e77869033c976a1ea4c2b889a13ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for onyxweb-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a8411e9d9e489e149f20b7f7808e27c0bf9a3b32a7d49ef84db19946b1bbf29b
MD5 3588b64b23bed93c480160515877b132
BLAKE2b-256 e37326e2d1ab49dc885b7c713c4f30adeb4f126f3f49830c5b2a6d9a70e6652b

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for onyxweb-0.2.0-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 89fda276fb1a10017b6d0da113cee12f8c2271041c4b7eb3195c3d11dde14d1a
MD5 32363e7bd2ee4d32635c3e9898a3e8d6
BLAKE2b-256 b572ebf0753e5e77d1436bf06a71272ca3b169c85f31fa8711d43fbfb1f828c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp312-cp312-manylinux_2_28_aarch64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for onyxweb-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4587df271824e1ec1ac50d2a31c9a28fa9b6533dc7b0f064d980fa98911fbc0c
MD5 0f292b647e068ba5858ecc522aad158a
BLAKE2b-256 97212cf045364967ab5875d3588157311d2d940356a2bb0de066f3676953d5ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: onyxweb-0.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 3.8 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for onyxweb-0.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d154372882cc62adc70470d7ce1e046c421eb3dc613ece1e4a9ec6fda497b432
MD5 ccfe9ea1cb32569a92fbf4b7a1b8f482
BLAKE2b-256 dafb5e03bd7232a81dd3279ee4c368d3b10ee126ae206b93c37bfea4772ef2a8

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for onyxweb-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 363d3d631361659e68d28cfa588a185bd89f0dd56035d4b6b7738f8b7a18af0f
MD5 77d7c5087a20c8fc72983ba2f97afb2d
BLAKE2b-256 161c0ec6629e4b5ea21461f34e1abc216bfef6d31b00c2360f9f386193098938

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for onyxweb-0.2.0-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fd18ae66a6a281e48817db1b143941313de19a3e5c325c1c0b2bb276dbd15174
MD5 818d32d1f4e25efcb98ad7b04acffcba
BLAKE2b-256 49eb0be29f2b1f453a502f33a11dfd1e75d3bd9665e8c9d7a561bea8307d219d

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp311-cp311-manylinux_2_28_aarch64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for onyxweb-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d69376d994ea9b16c69b83f513df8de5a67258eceb9be01cd3f22a2fd3fb0940
MD5 1c2b2756bde8bfd806b22c408218d299
BLAKE2b-256 3beec7bfeddd30aac098466d1dac1754607b7817dda21687a5ed5b7dc2dfb7da

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: onyxweb-0.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 3.8 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for onyxweb-0.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1ed8b836e0f20f2c893f8f90ecbff43c101d151c298a2bdc58ad1368e2c952ac
MD5 16d16e05872201f7ca01d614a1a48ce4
BLAKE2b-256 84f11b2a1254b7cd4301a41eb3ffbb2059d9c7226561b7c2da3b028a219527e8

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp310-cp310-win_amd64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for onyxweb-0.2.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f1ec23dd2400273dc2c46b221ce5b04f7422b48929563970236680f313356990
MD5 01bfc709694d2cd169aad096f1db66e8
BLAKE2b-256 71ededc6dbd4489d9e240cefa7abc65a941a0a5e4a45fb00499b8622c72d8652

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp310-cp310-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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

File details

Details for the file onyxweb-0.2.0-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for onyxweb-0.2.0-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7650c4abf6b7d4407e5f24099c43fc0f30197fd3722076a80e37157ea0434e97
MD5 d5469c5ebb2fedb130f1d33addb3c5ef
BLAKE2b-256 3b1665792c3b94a6716b7c614e1f9b8c22578030a9291a6596e137d3427e48da

See more details on using hashes here.

Provenance

The following attestation bundles were made for onyxweb-0.2.0-cp310-cp310-manylinux_2_28_aarch64.whl:

Publisher: publish.yml on ausmaster/onyxweb

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