Frostwork
Fast HTML extraction for Python and Rust, without a DOM.
Frostwork compiles a set of CSS or XPath selectors and extracts their values in one scan of an HTML response. Reuse the schema across Scrapy callbacks, web-poet pages or standalone code. Working memory tracks parser state, pending matches and returned values, without storing a document tree.
Frostwork supports a focused selector subset, continuously checked against Parsel/lxml. Python rejects
unsupported selectors before scanning; strict=False requests empty columns. There is no parser fallback.
Check the compatibility contract
before migrating code that needs arbitrary tree traversal.
The benchmarks compare throughput, memory and selector coverage with Parsel, lxml and other engines, including workloads where Frostwork loses. Performance depends on page shape, selector count and output volume.
Install
Frostwork requires Python ≥ 3.10. Install the core package, or include the web-poet integration:
pip install frostwork
pip install "frostwork[webpoet]"
Published wheels contain the Rust extension, so installing from PyPI does not need a Rust toolchain. Building an editable checkout does; see the Python development guide.
Extract a named item
Build a Page once, then reuse it for each response:
from frostwork import Page
PRODUCT = (Page()
.field("name", "h1::text") # first match, or None
.field("price", ".price::text")
.field_all("images", "img::attr(src)")) # every match, or []
html = b"<h1>Widget</h1><span class=price>$9</span><img src=/a.png>"
assert PRODUCT.extract(html).to_dict() == {
"name": "Widget", "price": "$9", "images": ["/a.png"],
}
In an ordinary Scrapy callback, pass the original bytes and the response's encoding:
def parse_product(self, response):
yield PRODUCT.extract(response.body, encoding=response.encoding).to_dict()
Use field_all whenever you need every match, and field_join to join text nodes. Without an explicit
encoding, Frostwork checks the BOM and declarations before defaulting to UTF-8. For positional columns
without field names, use the primitive extract API.
The same engine is a Rust library — frostwork::extract(html, &queries, None), with Page/Plan for named
fields and compile-once reuse. See the
runnable example.
Scrapy and web-poet
For a runnable Scrapy project, start with frostwork-demo. Its local storefront examples cover ordinary callbacks, ItemLoader, web-poet, nested products and browser rendering, with tests that run real crawls and compare exported items against Parsel. For existing spiders, follow the migration workflow to audit complete schemas, verify saved responses and monitor extracted items.
A page object declares its selectors; Frostwork fills every field from one scan of the response:
from frostwork.webpoet import FrostPage, field
class ProductPage(FrostPage):
name = field("h1::text")
price = field(".price::text")
images = field("img::attr(src)", all=True)
specs = field(".spec ::text", join=" ")
brand = field("//meta[@itemprop='brand']/@content")
to_item() returns a dict here. Add Returns[YourItem] for a typed item, as shown in the
Python guide.
For injection, install and configure scrapy-poet using its
setup guide, or copy the working settings
and explicitly assigned callbacks from the demo. Outside Scrapy, construct the page directly:
item = await ProductPage(response=http_response).to_item().
Before migrating a spider
Run frostwork-audit --scan myproject/spiders/ to inspect selector literals without importing the spider.
Once you have a schema, PRODUCT.check().raise_for_status() checks its selectors and shared budgets.
Then compare complete items on saved responses
before switching a callback.
The main compatibility boundaries are:
- Selector context: grouped fields support fewer shapes than flat fields. Audit the actual schema.
- HTML values: bare-element selectors return source HTML, which can differ from lxml serialization.
- Encoding: decoding follows browser behavior, including documented differences from Parsel/w3lib.
The compatibility contract contains the exact limits and cases where Frostwork returns values Parsel cannot. The Python guide covers groups, processors, response adapters and runtime item validation.
Build, test, benchmark
make bootstrap # create .venv and install the pinned Python test toolchain
make ci # Rust, Python, lxml differential, encoding, and fuzz gates
make bench # benchmark matrix against Parsel
make soak # multi-seed differential and fuzz soak
make help lists the individual targets.
TESTING.md explains what each gate proves and
what remains outside it.
More
- Architecture and design decisions
- Python API and recipes
- Selector and divergence contract
- Correctness methodology
- Benchmarks
- Parsel migration
- Release history
License
Apache-2.0. See LICENSE.
Metadata
Release files for frostwork 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| frostwork-0.1.6.tar.gz | 660.3 kB | With provenance | Details for frostwork-0.1.6.tar.gz |
Built distributions (wheels)
Total release size: 12.0 MB
Release files / frostwork-0.1.6.tar.gz
| Download URL | frostwork-0.1.6.tar.gz |
|---|---|
| Size | 660.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8a3c084f077cd920cadd50b39a208be8ed0e64f1d1b7ab2dbccd795a9eddd04d
|
|
BLAKE2b-256 checksum How to use checksums |
9b7675bef47ebb67effb4d97483f868e4522867e419e5bbf134d958e904cfd48
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-win_arm64.whl
| Download URL | frostwork-0.1.6-cp310-abi3-win_arm64.whl |
|---|---|
| Size | 533.0 kB |
| Tags | CPython 3.10 Windows ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
ef99ff261e63c49f76d76503822dafdcc572a1204c99f744f5919c1f2ee6a4ff
|
|
BLAKE2b-256 checksum How to use checksums |
56d0f3943ec5c5fe79508fb704983ff08859e2618a859dfa7d134f75aa7cf157
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-win_amd64.whl
| Download URL | frostwork-0.1.6-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 548.9 kB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
cac2334ffc548aca833317fd2987f844fdc0e649cd33e5d58acc6edb21bbd1fe
|
|
BLAKE2b-256 checksum How to use checksums |
7feefab8f1ec55d2e79b1dbca2087c56497b668608f18e4409b35a72db90260d
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-win32.whl
| Download URL | frostwork-0.1.6-cp310-abi3-win32.whl |
|---|---|
| Size | 520.3 kB |
| Tags | CPython 3.10 Windows x86-32 abi3 |
|
SHA-256 checksum How to use checksums |
189d63d53cf5efda988b02f688e8a714f586e5997a35141f02a49549051a1777
|
|
BLAKE2b-256 checksum How to use checksums |
dcc646e88be20aa716c5d9577842cd7babc5b2fe7fcd2cb0593c21cdc33bf1a7
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-musllinux_1_2_x86_64.whl
| Download URL | frostwork-0.1.6-cp310-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 892.0 kB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
58215901ad06f927ac3e45b1c2e84d8d5694132428565b4d340d793242091977
|
|
BLAKE2b-256 checksum How to use checksums |
92f278ab6cfea382a77dc210931b10ed126da5c6d760527b8d41777fbcee069f
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-musllinux_1_2_riscv64.whl
| Download URL | frostwork-0.1.6-cp310-abi3-musllinux_1_2_riscv64.whl |
|---|---|
| Size | 844.5 kB |
| Tags | CPython 3.10 Linux musl 1.2+ RISC-V 64 abi3 |
|
SHA-256 checksum How to use checksums |
6cfe3a5efc434a4728caa3b6309bf1268f34dae4f7ac75fbab8b81724aaa2880
|
|
BLAKE2b-256 checksum How to use checksums |
b68fd63acd2c64ecccb5f263c970c8a6b5aa5b875e4a9523258e366f71a8185e
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-musllinux_1_2_ppc64le.whl
| Download URL | frostwork-0.1.6-cp310-abi3-musllinux_1_2_ppc64le.whl |
|---|---|
| Size | 858.3 kB |
| Tags | CPython 3.10 Linux musl 1.2+ PowerPC 64-le abi3 |
|
SHA-256 checksum How to use checksums |
48d5b52ef42f5b05f1fd32c40ca4b1421eb3cd239ca226e7d65a833b8f502324
|
|
BLAKE2b-256 checksum How to use checksums |
882d7904dc4339e4db653dc574bb9d39ade206681f46ed3751c6ffa3494b9e0d
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-musllinux_1_2_armv7l.whl
| Download URL | frostwork-0.1.6-cp310-abi3-musllinux_1_2_armv7l.whl |
|---|---|
| Size | 947.1 kB |
| Tags | CPython 3.10 Linux musl 1.2+ ARMv7l abi3 |
|
SHA-256 checksum How to use checksums |
edded8fbf6b0fc3f3bb11d26aa882c87780f47ad5195db584575e1eaf5ff9f4b
|
|
BLAKE2b-256 checksum How to use checksums |
84aabc4a0ef32f60c41193b053bf58dad7503f525029d67b17e16cad4f373c86
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-musllinux_1_2_aarch64.whl
| Download URL | frostwork-0.1.6-cp310-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 858.9 kB |
| Tags | CPython 3.10 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
0f7ddb1f88fbbe3c540240d7df422c001fbed98e63d0b2d652d8e1b8c2a22849
|
|
BLAKE2b-256 checksum How to use checksums |
c8ce85846bafb09f5fa37b119eac920d6bd7ab4183e442c5fac51f3a26e6dc23
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-manylinux_2_31_riscv64.whl
| Download URL | frostwork-0.1.6-cp310-abi3-manylinux_2_31_riscv64.whl |
|---|---|
| Size | 669.6 kB |
| Tags | CPython 3.10 Linux glibc 2.31+ RISC-V 64 abi3 |
|
SHA-256 checksum How to use checksums |
98b3d0cf957accc85f2685319163a01e417cbf4cda2ef0143bed6f1731d78de9
|
|
BLAKE2b-256 checksum How to use checksums |
e347d5dbb465782669424fb1be8489c5560b2b234c745c0c00488a2f44727fbe
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | frostwork-0.1.6-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 670.4 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
8a16aed6e2dbff460a159fd8bc9fb2d478fcf1a5004f73b2106c02862c1ccfe1
|
|
BLAKE2b-256 checksum How to use checksums |
8da80b951c5cbf94cdef6b5a5ad126dbdddfcfadaeda5d4db7d6e3496ebc054a
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
| Download URL | frostwork-0.1.6-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl |
|---|---|
| Size | 726.7 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ PowerPC 64-le abi3 |
|
SHA-256 checksum How to use checksums |
b35426049e1988be8841d2fda888df5760f7f0a28cd8dbe7a72d52296d550dcf
|
|
BLAKE2b-256 checksum How to use checksums |
a371764732d316b35b4d23f91923dc2c529df59e3dc93ec81673860cdb361528
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
| Download URL | frostwork-0.1.6-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl |
|---|---|
| Size | 669.2 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARMv7l abi3 |
|
SHA-256 checksum How to use checksums |
f4f050fe76b36b8ab496735e08f27fe403b41b8b792985f701352f505f7f7bac
|
|
BLAKE2b-256 checksum How to use checksums |
f1b0828cc4a6c4b1e6603990aa4e19fd27fb2a2f0b1d05e1dbe1a9f7af53d8c3
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | frostwork-0.1.6-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 681.2 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
8a644730bd019f567de29c7412d73db20b1a2800a5edf570e4d7ae45c15d942c
|
|
BLAKE2b-256 checksum How to use checksums |
2a180110adccd391de068f0c0d6c8c57691f2939faf83d3b3bd33a4b14984c31
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl
| Download URL | frostwork-0.1.6-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl |
|---|---|
| Size | 688.3 kB |
| Tags | CPython 3.10 Linux glibc 2.5+ x86-32 abi3 |
|
SHA-256 checksum How to use checksums |
d5474659bb57bb94aceb016f1ccc52d676b9181ce2778c964d4d1b8ba0b9743c
|
|
BLAKE2b-256 checksum How to use checksums |
8d625c7e8e222df8965de2e8bbdeb528dfaa8edc506fec78e3e6055d60cf85a2
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | frostwork-0.1.6-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 628.5 kB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
0970e48b0dd2b662b31e27bbad677b1dcc44ff73046b930dd49896cc4422a8bf
|
|
BLAKE2b-256 checksum How to use checksums |
fc632d4d20551ecc43703d59e6508e8d4e0e1a235e6510c119cdbfc0033f9c44
|
| 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 Sep 23, 2026.
Transparency logRelease files / frostwork-0.1.6-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | frostwork-0.1.6-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 643.3 kB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
5a5f9ad0ff8fbe6bb76968339202d63771d5bcb7691a5936830a62c96495fca3
|
|
BLAKE2b-256 checksum How to use checksums |
b4320393e89b3280d8cff03e33b9c56a6f6485df371bb5d8ad14393f633468f0
|
| 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 Sep 23, 2026.
Transparency logSecurity for frostwork 0.1.6
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.
Full provenance
All 17 files in this release have been uploaded with provenance metadata.
Attestation for frostwork-0.1.6.tar.gz
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 Sep 23, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.