Skip to main content

bareduckdb

Simplified, Dynamically Linked DuckDB Python Bindings — Fast, simple, and free-threaded.

PyPI version Python 3.12+ License: MIT

Overview

bareduckdb provides extensible and easy to build Python bindings to DuckDB using Cython.

  • Simple ~3.3k lines of C++, ~2k lines of Cython and ~2.9k lines of Python - easy to extend or customize
  • Arrow-first data conversion supporting Polars, PyArrow, and Pandas
  • Support for latest Python features Free threading, subinterpreters, ABI3 and asyncio
  • Dynamically linked to DuckDB's official library
  • Experimental Enhancements

Experimental Enhancements

  • Explicit Stream vs Materialization Modes - At connection & execution time, select whether you want materialized arrow_tables or streaming arrow_readers.
  • Arrow Deadlock Detection - certain use cases involving reuse of Arrow Readers can cause deadlocks
  • Table Statistics - Extracts and passes table statistics at registration time
  • Polars - No PyArrow Required - Polars can be read and produced without importing / installing PyArrow
  • Polars - Native LazyFrame Pushdown - whereas DuckDB collects() LazyFrames before pushdown, bareduckdb pushes down native Polars predicates
  • Inline Registration - bareduckdb.execute("query", data={...}) allows registration at call time
  • User Defined Table Functions - extracts UDTFs at parse time and executes registered functions
  • **Appender - Row by Row ** Exposes DuckDB's appender API for fast sequential writes to duckdb databases

Platform Notes

Linux, macOS, and Windows are supported. Windows links the same official DuckDB build but reaches it through DuckDB's C API, so a few behaviors differ: registration copies the data, and the experimental enhancements listed above are unavailable. See readme_windows.md for the details. At runtime, bareduckdb.features reports what the installed build supports.

Installation

From PyPI

pip install bareduckdb

From Source

git clone --recurse-submodules https://github.com/iqmo-org/bareduckdb.git
cd bareduckdb
uv sync -v # or: pip install -e .

If already cloned, use git submodule update --init --recursive

Basic Usage

import bareduckdb

# Connect to in-memory database
conn = bareduckdb.connect()

# Execute query and get Arrow Table
result = conn.execute("SELECT 42 as answer").arrow_table()
print(result)

# Convert to Polars/Pandas/PyArrow
df_polars = conn.execute("SELECT * FROM range(100)").pl()
df_pandas = conn.execute("SELECT * FROM range(100)").df()

Async API

import asyncio
from bareduckdb.aio import connect_async

async def run_query():
    async with await connect_async() as conn:
        result = await conn.execute("SELECT * FROM generate_series(1, 1000)")
        return result

result = asyncio.run(run_query())

Polars Integration

import bareduckdb
import polars as pl

conn = bareduckdb.connect()

# Polars -> DuckDB (Arrow Capsule protocol)
df = pl.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
conn.register("my_table", df)

# DuckDB -> Polars (direct conversion)
result = conn.execute("SELECT * FROM my_table", output_type="polars")

Architecture

Design Principles

  1. Keep it in Python — Business logic lives in Python, not Cython/C++
  2. No GIL interaction from DuckDB threads — All Python operations happen before/after query execution
  3. Semantic Versioning — Strict stability guarantees
  4. Arrow-first — All data types map through Arrow's type system

Why Arrow-First?

By forcing all conversions through Arrow, bareduckdb achieves:

  • Consistent type mappings across Polars/Pandas/PyArrow
  • Reduced code complexity (no per-library conversion paths)
  • Better memory efficiency (zero-copy where possible)
  • Future-proof (Arrow is the lingua franca for columnar data)

Thread Safety & Free-Threading

Free-threading support (Python 3.13+):

  • No global locks in critical paths
  • DuckDB threads never acquire the GIL
  • Safe concurrent query execution in --disable-gil mode
  • Atomic operations for Arrow stream coordination

APIs

bareduckdb provides multiple API layers for different use cases:

1. Core API (bareduckdb.core)

Minimal, no-frills interface for maximum performance.

from bareduckdb.core import Connection
conn = Connection()
result = conn.execute("SELECT 1")

2. Async API (bareduckdb.aio)

Non-blocking operations with async/await.

from bareduckdb.aio import connect_async
conn = await connect_async()
result = await conn.execute("SELECT 1")

3. Compatibility API (bareduckdb.compat)

Familiar interface similar to duckdb-python (with intentional differences).

import bareduckdb
conn = bareduckdb.connect()
result = conn.sql("SELECT 1")  # Eager execution

4. DBAPI 2.0 (bareduckdb.dbapi)

Standard Python database interface for compatibility with tools like SQLAlchemy.

from bareduckdb.dbapi import connect
conn = connect()
cursor = conn.cursor()
cursor.execute("SELECT 1")

Key Differences

Experimental Features

When pyarrow is installed, two experimental features are available -

Arrow Statistics and Cardinality

In duckdb-python, Arrow Tables, Readers and Capsules are all converted to Streams via DataSet->Scanner->Reader. These Streams have no cardinality (number of rows) nor statistics (such as: min max, number of distinct values, contains nulls).

Cardinality is used at determining whether to use TopN, which significantly speeds up (w/ less memory) "order by X limit N" queries when N is small relative to size of table. Statistics are used for query planning by the optimizer.

In bareduckdb, Arrow Tables are registered directly (as Tables, not Streams) and used by arrow_scan_dataset which can then retrieve cardinality and column level statistics.

Statistics Options:

The register() method accepts a statistics parameter to control which columns have statistics computed:

import bareduckdb

conn = bareduckdb.connect()

# No statistics (fastest registration, default)
conn.register("table", df, statistics=None)

# Numeric columns only (recommended for most use cases)
conn.register("table", df, statistics="numeric")

# All columns (slowest - includes string min/max)
conn.register("table", df, statistics=True)

# Specific columns by name
conn.register("table", df, statistics=["id", "price", "date"])

# Regex pattern to match column names
conn.register("table", df, statistics=".*_id")  # all columns ending with _id

Setting a Default:

Configure the default statistics mode at connection level:

# All register() calls will use numeric statistics by default
conn = bareduckdb.connect(default_statistics="numeric")
conn.register("table1", df1)  # uses numeric stats
conn.register("table2", df2)  # uses numeric stats
conn.register("table3", df3, statistics=False)  # override: no stats

Performance Impact (500K rows, 2 numeric + 2 string columns):

Mode Registration Time Use Case
None ~0.4ms No filter pushdown needed
"numeric" ~10ms JOIN/filter on numeric columns
True ~22ms Filter pushdown on all columns

The "numeric" option provides the best balance: fast registration with statistics for the columns most commonly used in filters and JOINs (IDs, dates, prices).

Arrow Pushdown

Arrow projection and filter pushdowns are implemented using the Arrow C++ library. Pushdowns are only implemented for Tables currently.

Relational API

Replacement Scans

Automatically discover Arrow tables in the caller's scope without explicit registration:

import bareduckdb
import pyarrow as pa

conn = bareduckdb.connect(enable_replacement_scan=True)
my_data = pa.table({"a": [1, 2, 3], "b": [4, 5, 6]})

result = conn.execute("SELECT * FROM my_data").arrow_table()

Customization: Override _get_replacement(name) method for custom discovery logic (e.g., loading from disk, fetching from API).

Manual Registration: Use .register() for explicit control or .execute(..., data={"name": df}) for inline registration.

Not (Yet?) Supported

  • No Python UDFs (scalar functions)
  • No fsspec integration

User Defined Table Functions

Table functions execute in Python before query execution, enabling data generation and connection injection without GIL interaction:

import bareduckdb
import pyarrow as pa

def generate_data(rows: int, multiplier: int = 1) -> pa.Table:
    return pa.table({
        "id": range(rows),
        "value": [i * multiplier for i in range(rows)]
    })

conn = bareduckdb.connect()
conn.register_udtf("generate_data", generate_data)

result = conn.execute("""
    SELECT * FROM generate_data(100, 10)
    WHERE value > 500
""").arrow_table()

Features:

  • Query preprocessing via DuckDB's parser - references are extracted in C++, dispatch is in Python, and no Python callbacks run during query execution
  • Connection injection: Add conn parameter to access connection during execution
  • Supports any Arrow-compatible object: PyArrow Table, Polars DataFrame, Pandas DataFrame

Arrow Enhancements

  • Deadlock detection

Type Mappings

All types convert through Arrow:

  • UUIDs: Returned as strings (Arrow doesn't have native UUID type)
  • Decimals: Arrow Decimal128/Decimal256
  • Timestamps: Arrow Timestamp with timezone preservation
  • Nested Types: Struct/List/Map fully supported

Development

Building from Source

# Clone with submodules (sparse checkout is automatic)
git clone --recurse-submodules https://github.com/iqmo-org/bareduckdb.git
cd bareduckdb

# Install development dependencies
uv sync

# Build in development mode
pip install -e .

* Note 1: DuckDB submodule version must match the library version. * Note 2: PyArrow version must match the runtime version for Table registration / Pushdown

Disclaimer

For official Python bindings, see: https://github.com/duckdb/duckdb-python

License

bareduckdb is licensed under the MIT License. See LICENSE for details.

All original copyrights are retained by their respective owners, including DuckDB and DuckDB-Python

Metadata

Release files for bareduckdb 0.12.155

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for bareduckdb 0.12.155
File
bareduckdb-0.12.155-cp315-cp315t-win_amd64.whl CPython 3.15 CPython 3.15 free-threading Windows x86-64 Details
bareduckdb-0.12.155-cp315-cp315t-musllinux_1_2_x86_64.whl CPython 3.15 CPython 3.15 free-threading Linux musl 1.2+ x86-64 Details
bareduckdb-0.12.155-cp315-cp315t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.15 CPython 3.15 free-threading Linux glibc 2.26+ x86-64, Linux glibc 2.28+ x86-64 Details
bareduckdb-0.12.155-cp315-cp315t-macosx_11_0_arm64.whl CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64 Details
bareduckdb-0.12.155-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details
bareduckdb-0.12.155-cp314-cp314t-musllinux_1_2_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.2+ x86-64 Details
bareduckdb-0.12.155-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.26+ x86-64, Linux glibc 2.28+ x86-64 Details
bareduckdb-0.12.155-cp314-cp314t-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 Details
bareduckdb-0.12.155-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details
bareduckdb-0.12.155-cp312-abi3-musllinux_1_2_x86_64.whl CPython 3.12 abi3 Linux musl 1.2+ x86-64 Details
bareduckdb-0.12.155-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 abi3 Linux glibc 2.26+ x86-64, Linux glibc 2.28+ x86-64 Details
bareduckdb-0.12.155-cp312-abi3-macosx_11_0_arm64.whl CPython 3.12 abi3 macOS 11.0+ ARM64 Details

Total release size: 363.6 MB

Release files / bareduckdb-0.12.155-cp315-cp315t-win_amd64.whl

Download URL bareduckdb-0.12.155-cp315-cp315t-win_amd64.whl
Size 13.9 MB
Tags CPython 3.15 CPython 3.15 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
9a44408405652cbbd53cefac6b1e5d2dcf6bf12d508c84bdd6a2661eaaafd779
BLAKE2b-256 checksum
How to use checksums
8e71a4ef8022027c2f7798fd1fa963f8b9400aa404e30903e7f5785c597c6ac6
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 Aug 27, 2026.

Transparency log

Release files / bareduckdb-0.12.155-cp315-cp315t-musllinux_1_2_x86_64.whl

Download URL bareduckdb-0.12.155-cp315-cp315t-musllinux_1_2_x86_64.whl
Size 36.4 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
2219ab41ce367744f2675e562af676d0569b41c818f9fa99893e2951c76020d2
BLAKE2b-256 checksum
How to use checksums
8aadb11cdd7ae7271942439281073015d6151079c91190bad92c58131bbb0a2a
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 Aug 27, 2026.

Transparency log

Release files / bareduckdb-0.12.155-cp315-cp315t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl

Download URL bareduckdb-0.12.155-cp315-cp315t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 34.6 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
6ade2d7132b0d3d9292f093edb8d9dcf75097e8dc3b7a874e424309d62dd906a
BLAKE2b-256 checksum
How to use checksums
943928e30beacab96617700763295fd230ad5b3c01c75bb49899d01a1a0377cd
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 Aug 27, 2026.

Transparency log

Release files / bareduckdb-0.12.155-cp315-cp315t-macosx_11_0_arm64.whl

Download URL bareduckdb-0.12.155-cp315-cp315t-macosx_11_0_arm64.whl
Size 36.6 MB
Tags CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
d0ca0537ef7f43084a2c64fe8b85a1e92fbc93b33cb328297f2da386496b0f41
BLAKE2b-256 checksum
How to use checksums
33a586f4f9f0c2300549b2ddf99d2b2b4f947a1212f548c902938dfbeaae0639
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 Aug 27, 2026.

Transparency log

Release files / bareduckdb-0.12.155-cp314-cp314t-win_amd64.whl

Download URL bareduckdb-0.12.155-cp314-cp314t-win_amd64.whl
Size 13.9 MB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
1a09ef9e91f02b33c86030da9efd282521144f5bfa33367a82c348d2770d4e14
BLAKE2b-256 checksum
How to use checksums
0a0c2fff764f08b5013529125a008d34d5204d7b6dff069d81094bd9e4323527
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 Aug 27, 2026.

Transparency log

Release files / bareduckdb-0.12.155-cp314-cp314t-musllinux_1_2_x86_64.whl

Download URL bareduckdb-0.12.155-cp314-cp314t-musllinux_1_2_x86_64.whl
Size 36.4 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
d0dc103089ec2e207ad1122a2325ce91b27d103e13e0e09fbae16df69f19fd3b
BLAKE2b-256 checksum
How to use checksums
93d972673220fa473db996724e96ca1ac24909d7038dc6eadc8b1acf8be998ea
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 Aug 27, 2026.

Transparency log

Release files / bareduckdb-0.12.155-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl

Download URL bareduckdb-0.12.155-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 34.6 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
602bcfcfafd1ab800493a0363f46ed13697f5bf1279fbd3ed7190906175d478a
BLAKE2b-256 checksum
How to use checksums
ee180512d7be258577e0fd9c7acf994484a41c72a209497da842a5406d3de01c
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 Aug 27, 2026.

Transparency log

Release files / bareduckdb-0.12.155-cp314-cp314t-macosx_11_0_arm64.whl

Download URL bareduckdb-0.12.155-cp314-cp314t-macosx_11_0_arm64.whl
Size 36.6 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
08cdc55980a3221cb6530d685ad08701ed3c8b78b2f806716d3026316bbc043d
BLAKE2b-256 checksum
How to use checksums
4557f49333b6da361be666fd87fe504528230058a258e9598a8ccc7344cfb66d
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 Aug 27, 2026.

Transparency log

Release files / bareduckdb-0.12.155-cp312-abi3-win_amd64.whl

Download URL bareduckdb-0.12.155-cp312-abi3-win_amd64.whl
Size 13.4 MB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
576c32f3fad0a2573171485409b1439b595bf9f518c6157c26b3048a8e2c8bbc
BLAKE2b-256 checksum
How to use checksums
4b6b0523de9d0ccc41bfec8c6b881e5787d427898017371abf02a65a54825861
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 Aug 27, 2026.

Transparency log

Release files / bareduckdb-0.12.155-cp312-abi3-musllinux_1_2_x86_64.whl

Download URL bareduckdb-0.12.155-cp312-abi3-musllinux_1_2_x86_64.whl
Size 36.2 MB
Tags CPython 3.12 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
bef351a2d5f40004c8dd7feb295c576e09b8cd6ba02fdb9800f7f4e575fa413b
BLAKE2b-256 checksum
How to use checksums
0df168afda0a61539feb6a5ccdba0b80824784023d7ab14a6514cda5a48e56dc
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 Aug 27, 2026.

Transparency log

Release files / bareduckdb-0.12.155-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl

Download URL bareduckdb-0.12.155-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 34.4 MB
Tags CPython 3.12 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
5b2071948525f26a3620a3fbbcf698c4c9d824bc51cd88446e5b13541b7fdaa8
BLAKE2b-256 checksum
How to use checksums
3d01ba97277104be71e8188a12ad9f0830a732c714ef9bb1fb98386929f46779
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 Aug 27, 2026.

Transparency log

Release files / bareduckdb-0.12.155-cp312-abi3-macosx_11_0_arm64.whl

Download URL bareduckdb-0.12.155-cp312-abi3-macosx_11_0_arm64.whl
Size 36.6 MB
Tags CPython 3.12 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
2d6d2495e70cd184448f46fd6c75967c3e9765ed75966e3b8e82c7d2fa5d506e
BLAKE2b-256 checksum
How to use checksums
c7a4975e0e6e9fa71a7e301b88bfc24aa6c1f568b98acb1dc9fc28f1c968a031
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 Aug 27, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page