OpenYXDB
Read and write Alteryx YXDB files from Python and C++.
Built on Alteryx's official open-source YXDB implementation, released under GPLv3. This fork modernizes the build system, fixes bugs, adds cross-platform support, and wraps the C++ core in a Python package with first-class PyArrow, Pandas, and Polars integration.
What changed from the Alteryx original
- Cross-platform support -- builds and runs on Linux, macOS, and Windows (the original targeted Windows only)
- Python bindings via nanobind, published to PyPI as
openyxdb - PyArrow, Pandas, Polars, and DuckDB read/write integration with automatic type mapping
- Bug fixes -- block index was never written to disk (broke files with more than 65,536 records), reference-counting crash on GCC
- Modern CMake (3.20+, target-based), pixi for dependency management, Catch2 test suite, GitHub Actions CI
What is YXDB?
YXDB is the native binary format used by Alteryx Designer. Two on-disk layouts are in active use: the original format used by the classic engine and a newer columnar-friendly variant emitted by the AMP engine.
This library reads both layouts automatically -- the file's magic bytes are
sniffed at open time and the appropriate decoder is selected. New files written
through openyxdb.Writer use the original format.
The newer E2 layout is only partially documented. Its reader validates record framing and rejects ambiguous integer encodings, invalid scalar prefixes, and unresolved blob references rather than returning guessed values. A bounded set of producer variants is therefore known to fail explicitly until their byte encoding can be verified.
Choosing between OpenYXDB and SigilYX
OpenYXDB wraps Alteryx's own C++ implementation. Reach for it when you want that provenance, a C++ library to link against, or GPLv3.
SigilYX is an independent Rust implementation of the same format under Apache-2.0. It decodes straight into Arrow buffers rather than through Python objects, so it is substantially faster and uses less memory on large files, and it offers constant-memory batch reads. Prefer it for large inputs, for throughput-sensitive Python work, or when GPLv3 does not suit your project.
For reading large files through OpenYXDB, scan_yxdb streams in batches and
keeps peak memory bounded; to_pyarrow and friends materialise the whole file.
Install
pip install openyxdb
Usage
import openyxdb
# Read to PyArrow, Pandas, or Polars
table = openyxdb.to_pyarrow("data.yxdb")
df = openyxdb.to_pandas("data.yxdb")
df = openyxdb.to_polars("data.yxdb")
# Write from any of them
openyxdb.from_polars(df, "output.yxdb")
openyxdb.from_pandas(df, "output.yxdb")
openyxdb.from_pyarrow(table, "output.yxdb")
All 17 YXDB field types are supported: Bool, Byte, Int16, Int32, Int64, FixedDecimal, Float, Double, String, WString, V_String, V_WString, Date, Time, DateTime, Blob, and SpatialObj.
Polars integration
Importing openyxdb automatically monkey-patches polars with YXDB support (no-op if polars is not installed). No extra setup is required.
Top-level aliases
import polars as pl
import openyxdb # registers everything on import
# Eager read - returns a DataFrame
df = pl.read_yxdb("data.yxdb")
# Lazy scan - returns a LazyFrame with projection & predicate pushdown
lf = pl.scan_yxdb("data.yxdb")
df = lf.select("col_a", "col_b").filter(pl.col("col_a") > 10).collect()
Namespace plugins
# Write a DataFrame directly
df.yxdb.write("output.yxdb")
# Stream a LazyFrame through the streaming engine and write in chunks
lf.yxdb.sink("output.yxdb", chunk_size=65_536)
lf.yxdb.sink() (and the top-level openyxdb.sink_yxdb(lf, path)) execute the
lazy plan on Polars' streaming engine and write the result to the YXDB file in
chunks, so the writer never buffers more than chunk_size rows in Python at a
time. Polars 1.x does not expose a public plugin API for custom sink_*
formats, so the query result still passes through a single collect() call
before being chunk-written; true per-batch push sinks require upstream Polars
support.
Pushdown support
scan_yxdb implements pushdown against the underlying reader:
| Optimization | Supported | Notes |
|---|---|---|
| Projection pushdown | Yes | Only requested columns are decoded from disk. |
| Row-limit pushdown | Yes | head(n) / fetch(n) stops decoding once n rows produced. |
| Batched streaming | Yes | Default 65 536 rows; honours Polars' batch_size hint. |
| Predicate pushdown | Partial | Predicates evaluate per batch after decode. YXDB has no per-block statistics, so genuine file-level skipping isn't possible; combined with head predicates still short-circuit once enough rows are collected. |
Manual registration
If you import openyxdb after polars is already loaded, everything is registered automatically. To re-register or verify:
openyxdb.register_polars()
DuckDB integration
import duckdb, openyxdb
con = duckdb.connect()
# Register a YXDB file as a SQL view
openyxdb.register_duckdb(con, "yx", "data.yxdb")
con.execute("SELECT COUNT(*) FROM yx WHERE score > 90").fetchone()
# Or get a relation directly
rel = openyxdb.to_duckdb("data.yxdb", con)
# Write the result of a DuckDB query to YXDB
openyxdb.from_duckdb(
"SELECT id, score FROM yx WHERE score > 90",
"top_scores.yxdb",
con=con,
)
DuckDB support is provided through Arrow interop: YXDB files are loaded into an
Arrow table and registered on the connection. A native DuckDB table function
(SELECT * FROM read_yxdb('file.yxdb')) would require a C++ extension, which is
out of scope for this package.
Building from source
pixi install
pixi run build
pixi run test
Limitations
- Spatial indexes are skipped on read and not created on write.
- Spatial objects are accessible only as raw blobs (SHP-encoded binary).
- Little-endian architectures only (x86, ARM).
Testing
The reader has been validated against 1,012 real-world E1 YXDB files sourced from the community corpus at Sigilweaver/YXDB-Sources, covering a wide range of field types, encodings, record counts (0 to 200k+), and filenames including non-ASCII characters - 100% pass rate.
The 1.3.0 streaming sink (sink_yxdb) and DuckDB round-trip paths are exercised against a sampled 25-file subset of the corpus in addition to the per-feature unit tests. Full Python suite: 1,040 passed.
License
GPLv3 -- see LICENSE.
Metadata
Release files for openyxdb 1.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| openyxdb-1.5.0.tar.gz | 2.6 MB | Details |
Built distributions (wheels)
Total release size: 7.2 MB
Release files / openyxdb-1.5.0.tar.gz
| Download URL | openyxdb-1.5.0.tar.gz |
|---|---|
| Size | 2.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
933df27021758c1694d896bea495016fccbaf0b7ace2327e041808afe52095dc
|
|
BLAKE2b-256 checksum How to use checksums |
a167f806464b40da26d14826eb3e4785737562e5d0e49bf9ad5115bd7ba00095
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp314-cp314-win_amd64.whl
| Download URL | openyxdb-1.5.0-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 438.4 kB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
c1423ec903e2e3f58a0b8d086bcd6fde5ff50def0ed758b75e5dac9e83241113
|
|
BLAKE2b-256 checksum How to use checksums |
3cec3673c1095b3fa4c24bce637a8707da5ad74c595769f5902584e92b2d7bd4
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | openyxdb-1.5.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 288.2 kB |
| Tags | CPython 3.14 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
372be7112bfdd18bb8a53e5f57f0c00fab5493dc0c22d5de860484731cdf8201
|
|
BLAKE2b-256 checksum How to use checksums |
ec78eb765200fd0f1c7d370410fe269474b90dde123d2381915b22cfd0e9efff
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | openyxdb-1.5.0-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 213.0 kB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c4fae670692c228199bd3bfa268db397a55498ccf0ff9b26612e7c836ecd9685
|
|
BLAKE2b-256 checksum How to use checksums |
98c8abb35a75ad6c62401b7c9085981d20df36fa372864c81196637540c82926
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp313-cp313-win_amd64.whl
| Download URL | openyxdb-1.5.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 423.6 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
4b8f660bb0421311713be3277692c0f85a0a28ed91c24cce2fb21a828b7ead2d
|
|
BLAKE2b-256 checksum How to use checksums |
4c42bb8fa4e7719823a76f928abc17a6edf3be56e46adfca16417e01a2006f12
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | openyxdb-1.5.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 287.9 kB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
6bdd3ef5f59e898c8f75183479ef70587d1ddf53d8de16cc0869cf2dac6ac22d
|
|
BLAKE2b-256 checksum How to use checksums |
c2da51acb04d9932e47b85548031210d8d8fb7684bf5047a7753692f69917d10
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | openyxdb-1.5.0-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 212.8 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
1431c316c259733ee1ba526e4ee8089cfc7e7c78e12af3999cc44855afdd1f72
|
|
BLAKE2b-256 checksum How to use checksums |
f9fb1b0ebec3cb9de72348888c36b27468c6b44b51b96af3f12fcc34f419d0ef
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp312-cp312-win_amd64.whl
| Download URL | openyxdb-1.5.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 423.6 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
97db10dc5219d70cdde008af9af18cae9e2e8ef4dbac587048fadaa534d49037
|
|
BLAKE2b-256 checksum How to use checksums |
e8690c3eb466064d9a2de3db725932ab7f2b3fd6383290d7c3a68ace0f51abd7
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | openyxdb-1.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 288.1 kB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
7018d40d4e1cfdebc86c2c54feb69b6f5d5b5abb1fbf2878465a2fddfe806001
|
|
BLAKE2b-256 checksum How to use checksums |
a259d8f5cfc9af029cfcda2953314a4ccf31c1bac59473da9857821d133d6c6a
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | openyxdb-1.5.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 212.8 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
af76b5be61273c0b3215c71f24a221c7cf74ddfb283b00a1dfd8cc10f8fa2770
|
|
BLAKE2b-256 checksum How to use checksums |
77d89237b3713e93d86746d719c2a0a22d93be132d286f0c70e8dc0446771f73
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp311-cp311-win_amd64.whl
| Download URL | openyxdb-1.5.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 423.4 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
3c8d5956a922d6e5290f3418988d9f032ed70c63e5582eebd746c23893071505
|
|
BLAKE2b-256 checksum How to use checksums |
743cc48d7706db5b27630a50edfe6aefae8168e805e96099c92af833c03c15e9
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | openyxdb-1.5.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 288.7 kB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
3b21bc4cb70776345c25cb0b0822a1a04d8dfab657ccafa1008ae103234d3a13
|
|
BLAKE2b-256 checksum How to use checksums |
b26eb58a741e2c2a5a62b95d72a2271ebd1e56e2ce7f8df84a9c4f7a84b3a3c7
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | openyxdb-1.5.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 213.4 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
127a6817de1028e7651f0fd272e38e3a0ac5636efbcc229766d161175f853075
|
|
BLAKE2b-256 checksum How to use checksums |
37f5653a51c76790c9b1a4ce7629b6ddb26bcdcb87f48fd463bfea2dfa22a45c
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp310-cp310-win_amd64.whl
| Download URL | openyxdb-1.5.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 423.1 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
c6104a8ee60b26a3744f1e0ed8532adb3ce2e3baaa1a15272cb2cf8c5de20204
|
|
BLAKE2b-256 checksum How to use checksums |
ec3b5c575dfe3db3f7255972203baf7861b69d7e26e38cbdb229236f2a622118
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | openyxdb-1.5.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 288.9 kB |
| Tags | CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
d62a823f6200587f8a53e32926d2bc8a927df4bcd923526f3006bc05d548a13d
|
|
BLAKE2b-256 checksum How to use checksums |
9da4981e65fdf5931965df2cdc79d473c68e87a2bb4e3bb588c69314cbdc3b17
|
| 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 20, 2026.
Transparency logRelease files / openyxdb-1.5.0-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | openyxdb-1.5.0-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 213.6 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
831307c615877f71d612c50d5620c334a0aa8b2cc93ff68af1d829a41902462f
|
|
BLAKE2b-256 checksum How to use checksums |
49def010ed8bf7e25552dd96c475f351d685fd24069b7669bcf527037084fcc5
|
| 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 20, 2026.
Transparency log