Skip to main content

UQA Engine

UQA Engine is an embeddable database engine that lets one application use a PostgreSQL 18-compatible SQL surface across the behavior covered by its differential suite, full-text search, vector search, graph queries, and ranked retrieval through a shared Rust runtime.

It is designed for applications that need more than a relational table but do not want to assemble a separate database, search server, vector store, and graph engine for every query path.

What you can build

  • Run relational queries, joins, aggregates, CTEs, windows, JSON operations, and transactions with PostgreSQL 18 compatibility across the verified SQL surface.
  • Search text with BM25 or Bayesian BM25, retrieve vectors with KNN, and combine both signals in hybrid queries.
  • Store named graphs, execute Cypher and regular path queries, and call graph traversal or centrality functions from SQL.
  • Start in memory for experiments, then choose the default SQLite backend or the pure-Rust redb backend without changing the query API.
  • Use the same SQL result and parameter shapes against a local or Cloud UQA node through authenticated Rust, Python, Node.js, and browser HTTP engines.
  • Embed the engine in Rust or use the Python, Node.js, and browser WASM bindings included in the workspace.

New in 0.5.4

Version 0.5.4 reduces repeated catalog and index work during session creation, UPDATE and DDL. Typed constraint expressions preserve PostgreSQL identities and output; constraint catalog scans and private views retain their transaction semantics across concurrent DDL. Native Arrow and DuckDB foreign handlers are independent, opt-in features, with memory available by default. See the release history.

Catalog lookups reuse retained metadata, native SQLite equality probes seek stored keys directly, and retrieval filters read selected candidates. HNSW, IVF and full-text occurrence commits avoid repeated decoding and spill work within their existing memory allowances. Idle maintenance skips unnecessary wakeups and statistics passes.

The engine provides native DiskANN vector indexes through memory, native SQLite, SQLite Key/Value and redb. Bounded graph navigation and product quantization select candidates; complete-tensor reranking preserves canonical cosine scores and the existing probability conversion. Indexes retain transaction, rollback and reopen behavior, and EXPLAIN distinguishes estimated work from actual query counters. See the SQL configuration and score contract and matching Rust, Python, Node.js and browser examples.

Independent SQL notification subscriptions retain their original database and selected role, with bounded queues and explicit cleanup. Rust, Python, Node.js and Browser WASM also provide authenticated HTTP/SSE clients with visible loss and reconnection events for compatible servers. See the direct Rust API, language bindings and HTTP contract.

Persistent databases upgrade to SQLite record format 62 and redb record format 58; native mapping 17 and coordination format 2 are unchanged. Initial open creates physical constraint catalog records and restores retained expression identities atomically, preserving user rows. Close every owner before taking a pre-upgrade backup, update all owners together, and follow the 0.5.4 upgrade guide for migration, feature selection, custom Rust adapters and rollback requirements.

Mathematical foundation

A Typed Carrier Algebra for Unified Query Execution states the implementation-grounded theory behind UQA Engine. It distinguishes document support, weighted relations, decorated postings, ranked views, SQL bags, join tuples, graph context, and aggregate state while showing how they compose through one typed planning and execution framework.

The manuscript consolidates and revises the published work on unified query algebra, its graph-data extension, and the Bayesian framework for hybrid search. For academic use, cite the software and the papers relevant to the features used; machine-readable metadata is provided in CITATION.cff.

Try it in a terminal

Install the prebuilt Python package to get both the Python binding and the usql command:

python -m pip install uqa==0.5.4
usql

To build from this repository, you need Rust 1.90 or newer and the native build tools required by Cargo dependencies.

Start the interactive usql shell from the repository:

cargo run -p uqa-cli --bin usql

Create a table and run a text search:

CREATE TABLE notes (
    id INTEGER PRIMARY KEY,
    title TEXT,
    body TEXT
);

CREATE INDEX notes_body_gin ON notes USING gin (body);

INSERT INTO notes (id, title, body) VALUES
    (1, 'Rust async', 'Futures and the Tokio runtime'),
    (2, 'Embedded Rust', 'Drivers for constrained devices'),
    (3, 'Web application', 'Forms, routing, and templates');

SELECT id, title, _score
FROM notes
WHERE text_match(body, 'rust async')
ORDER BY _score DESC
LIMIT 5;

Use a file-backed database by adding --db:

cargo run -p uqa-cli --bin usql -- --db notes.uqa

Execute one command without entering the shell:

cargo run -p uqa-cli --bin usql -- -c "SELECT 1 AS ready"

Embed it in Rust

Add the released package to your application:

cargo add uqa@0.5.4

Korean and Japanese text analysis are separate optional features that this command does not enable: nori adds the Korean analyzer with its embedded dictionary, and kuromoji the Japanese one. Enable the ones an application uses, for example cargo add uqa@0.5.4 --features nori,kuromoji or features = ["nori", "kuromoji"] on the dependency in Cargo.toml; uqa-engine takes the same features. A build without them rejects requests for those analyzers. The usql CLI and the Python, Node.js, and browser WASM packages enable both by default.

uqa is the primary Rust package on crates.io. It is a thin facade over uqa-engine that also re-exports the core Value type; applications that need the implementation package directly can depend on uqa-engine. Public component crates including uqa-engine, uqa-client, uqa-api, and uqa-cli are also published independently. The following example creates an in-memory engine, inserts data, and runs SQL through the same interface used by a persistent engine.

use uqa::Engine;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let engine = Engine::new();

    engine.sql(
        "CREATE TABLE notes (id INTEGER PRIMARY KEY, title TEXT, body TEXT)",
        &[],
    )?;
    engine.sql(
        "CREATE INDEX notes_body_gin ON notes USING gin (body)",
        &[],
    )?;
    engine.sql(
        "INSERT INTO notes (id, title, body) VALUES
         (1, 'Rust async', 'Futures and the Tokio runtime'),
         (2, 'Embedded Rust', 'Drivers for constrained devices')",
        &[],
    )?;

    let result = engine.sql(
        "SELECT id, title, _score
         FROM notes
         WHERE text_match(body, 'rust async')
         ORDER BY _score DESC",
        &[],
    )?;

    for row in result.rows {
        println!("{row:?}");
    }

    Ok(())
}

Run the complete example from this repository:

cargo run -p uqa-engine --example text_search

Additional runnable examples cover hybrid search and encrypted storage:

cargo run -p uqa-engine --example hybrid_search
cargo run -p uqa-engine --example sqlcipher_encrypted_catalog
cargo run -p uqa-engine --example compressed_encrypted_catalog

Connect to a local or Cloud UQA node

uqa-client::HttpEngine sends SQL directly to the authenticated HTTP data plane shared by local and Cloud nodes. Native applications can resolve a project through the installed CLI once during construction, while services can continue to supply an explicit URL and token or trusted UQA_URL and UQA_TOKEN environment variables.

use uqa_client::{HttpEngine, SQLParam};
use uqa_core::Value;

# async fn example() -> Result<(), Box<dyn std::error::Error>> {
let engine = HttpEngine::cloud("notes", Some("example")).await?;
let result = engine
    .sql(
        "SELECT id, title FROM notes WHERE id = $1",
        &[SQLParam::scalar(Value::Int(42))],
    )
    .await?;
assert_eq!(result.rows.len(), 1);
# Ok(())
# }

Python and Node.js provide matching local and cloud project constructors; browsers retain explicit URL/token and environment construction because they cannot execute the CLI or access its credential store. Every client calls /v1/sql, /v1/sql/batch, and /v1/sql/stream directly after construction. See the HTTP Engine reference for connection, binding examples, result, streaming, CORS, and security contracts.

Choose a query path

Goal Starting point
Relational SQL Engine::sql or the usql shell
Local or Cloud SQL over HTTP uqa_client::HttpEngine
Streaming larger results Engine::sql_cursor or Engine::sql_columnar
Full-text retrieval text_match, fts_match, or bayesian_match
Vector retrieval VECTOR(N), TENSOR(N), knn_match, and explicit IVF or HNSW indexes
Hybrid ranking Automatic mixed-modality AND, exact fuse_bayesian_evidence or fuse_log_odds, Engine::hybrid_search, or explicit robust pool_positive_evidence and Engine::robust_hybrid_search
Graph queries Engine::run_cypher, SQL cypher, rpq, or graph_* functions
Fluent query construction uqa_api::QueryBuilder

Persistence and encryption

Engine::new() keeps data in memory, while Engine::open(path) and usql --db <path> use the default persistent SQLite backend. Persistent engines restore schemas, documents, text postings, graphs, scoring parameters, models, views, and statistics when reopened.

uqa-storage owns provider-independent contracts and shared data structures, while uqa-storage-sqlite owns SQLite connections, catalogs, indexes, transactions, graph persistence, and compressed storage. Rust callers using concrete storage types must use the updated provider imports.

Applications that want a pure-Rust single-file store can compose the engine with uqa-storage-redb. The provider owns the database, and every Engine::new_session() receives independent transaction state over the same file.

use std::sync::Arc;
use uqa::Engine;
use uqa_storage::PersistentStorageProvider;
use uqa_storage_redb::RedbStorage;

let provider: Arc<dyn PersistentStorageProvider> =
    Arc::new(RedbStorage::open("notes.redb")?);
let engine = Engine::from_persistent_provider(provider)?;
# Ok::<(), Box<dyn std::error::Error>>(())

The redb path supports the catalog, documents, full-text search, graphs, durable B-tree indexes, exact brute-force vectors, physical IVF and HNSW indexes, transactions, and savepoints. It uses the same SQL DDL and query API as SQLite; the main capability difference is that redb does not provide encryption at rest. See the Key/Value storage design for storage and transaction details.

Persistent full-text indexes use clustered postings rather than one physical row or key per (term, doc_id): one (table, field, term, doc_id / 65,536) value stores delta-encoded document IDs, term frequencies, and document lengths, while positions live in a separate value. Ranking opens score-only cursors, reuses one decode buffer for at most 128 postings per block, and leaves positional payloads unread unless a positional consumer asks for them. SQLite schema v22 and the shared Key/Value backend automatically migrate the previous per-document posting format on open; each SQLite or redb rewrite is atomic, idempotent, and rolls back without changing the old data when validation fails.

Security-sensitive deployments should use the SQLCipher path exposed by Engine::open_encrypted. Compressed encrypted containers are also available when compression is required, but they have a narrower, explicitly documented threat model and require an external trusted anchor for whole-file rollback detection.

Read the compressed VFS security contract before selecting that format.

Language bindings

Environment Workspace package Notes
Rust facade uqa Primary dependency re-exporting uqa-engine and uqa_core::Value
Rust engine uqa-engine Direct embedded implementation API and runnable examples
Rust HTTP uqa-client Authenticated local and Cloud data-plane SQL, atomic batches, and NDJSON streaming
Python uqa-python pyo3/maturin bindings, the installed usql command, and synchronous local and Cloud HTTP SQL
Node.js uqa-node Node-API bindings with asynchronous embedded and local or Cloud HTTP SQL methods
Browser uqa-wasm Emscripten embedded engine with IndexedDB persistence plus fetch-based local and Cloud HTTP SQL

Released Node.js applications install @cognica-io/uqa from npm; npm selects an exact-version native optional package under @cognica-io for the current supported platform. Browser applications install the independent @cognica-io/uqa-wasm package.

Prebuilt Linux Python wheels target glibc 2.28 or newer.

The memory foreign-data wrapper is included by default. Enable arrow for native Arrow IPC sources or duckdb for native DuckDB sources; the features are independent and disabled by default. Foreign-table definitions and catalog inspection remain available for every handler; see the feature contract.

Build and test

Install the commit hook, then build and test the workspace:

bash scripts/install-git-hooks.sh
cargo build --workspace --locked
cargo test --workspace --locked

Run a focused test during development:

cargo test -p uqa-engine --test integration queries::sql_joins::

See CONTRIBUTING.md for contributor checks, crate ownership for implementation boundaries, and verification for compatibility tests and benchmarks.

PostgreSQL 18 compatibility

Compatibility remains incomplete. The manual and manifest-derived ledger distinguish verified behavior from remaining SQL, type, protocol and client work. The unmodified upstream regression corpus has PostgreSQL reference evidence; its complete UQA execution is still unaudited.

The repository includes a deterministic TPC-H-derived scale-factor 0.001 fixture with all 22 default queries. The self-contained correctness gate compares exact columns, row order, NULLs, text bytes, and type-aware canonical numeric values with checked-in PostgreSQL 18.4 results:

cargo test -p uqa-engine --test integration sql_tpch::

The broader PostgreSQL 18.4 gate validates the compatibility manifest and compares every checked-in value or SQLSTATE probe with a live server. Build usql in release mode before running it:

cargo build --release -p uqa-cli
python3 tests/parity/pg18/run_diff.py --validate-manifest
python3 tests/parity/pg18/run_diff.py

Stateful routine, constraint, type-and-temporal, trigger, and rewrite-rule oracles plus the pinned psycopg, pgx, and node-postgres matrix are documented in PG18 differential probes. The current milestone and open-gate ledger is the PostgreSQL 18 compatibility plan.

Current performance verification uses the deterministic regression inventory and the separate controlled-runner protocol. Dated TPC-H, posting and relevance measurements remain in the TPC-H benchmark and performance design; they are not current-release measurements.

Contributor checks, benchmark build gates, and repository conventions are documented in CONTRIBUTING.md.

Documentation

Document Use it for
Reference manual and tutorials Learning the engine, supported SQL, public APIs, and internal architecture
Runnable examples Comparing the same search, vector, graph, storage, and extension scenarios across Rust, Python, Node.js, and Browser WASM
Design documentation index Finding the right technical contract or architecture document
System architecture Crate boundaries, query planning, carriers, execution, storage, and extension points
Vector indexes Brute-force, IVF, HNSW and DiskANN behavior, parameters, persistence and correctness contracts
Vector-search benchmark Reproducing vector latency, throughput, construction cost, recall, and accuracy reports
Engine state ownership Session isolation, locks, epochs, and publication rules
Concurrent storage transactions Overlapping logical writes, snapshots, conflicts, atomic publication, and provider ownership
Key/Value storage Swappable provider contract, redb behavior, transactions, and current capability limits
Upgrade guide Package updates, Rust API changes, persistent format upgrades, and backup restoration
Compressed VFS security Encryption format, authenticated metadata, rollback limits, and deployment guidance
Performance Reproducible baselines, regression gates, bottlenecks, and benchmark limitations
Parity fixtures SQL, relevance, and vector-calibration compatibility fixtures
Citation metadata Software citation and DOI metadata for the underlying research papers
Licensing policy AGPL, FOSS, noncommercial, commercial, and contribution paths
History Release-by-release changes

Project layout

Cypher default-label validation belongs to uqa-graph; Engine supplies the selected graph snapshot and retains its transaction boundary. Graph tests cover nested pattern requirements and missing-label diagnostics, while durable graph lifecycle tests remain with Engine.

RPQ syntax and its parser are shared through uqa-core; planner estimates no longer import the graph runtime. Existing graph syntax imports remain available, and parser tests move with their implementation.

The repository is a Rust workspace with small crates for the algebra, storage, scoring, graph, SQL, planning, execution, engine, CLI, APIs, and language bindings. The full dependency map and ownership rules live in the system architecture, keeping this README focused on using the project.

Model training uses shared native execution for Rust and SQL callers: uqa-execution converts projected table rows, parses training JSON, invokes uqa-ml, and publishes the trained result through Engine's model transaction boundary. Pure training-input and persisted IVF-parameter tests live with their owning crates. See the ownership design.

Creation namespace selection and index-target visibility run in SQL and native execution. Engine lends live schema, role, relation, and session guards; CTAS and index creation retain their existing authorization and collision-check order.

Contributing

See CONTRIBUTING.md for local gates, test conventions, crate boundaries, pull request guidelines, and the current contributor-licensing requirement.

AI-assisted contributions follow AI_POLICY.md, including semantic preservation, algebraic proofs for feature additions, and maintainer judgment on code and design.

License

UQA Engine is open-source software licensed under AGPL-3.0-only. See LICENSE.

Two optional additional permissions are available:

  • the FOSS exception lets a complete qualifying open-source application retain its OSI-approved license while UQA Engine and modifications to UQA Engine remain under the AGPL; and
  • the noncommercial application exception lets a qualifying personal, educational, academic, or charitable application keep its independent code under terms chosen by its author while UQA Engine and modifications to UQA Engine remain under the AGPL.

Separate commercial licensing is available for proprietary applications, closed modifications, SaaS, and OEM distribution. The complete decision guide is in the licensing policy.

Metadata

Release files for uqa 0.5.4

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

Source distribution (sdist)

Source distribution for uqa 0.5.4
File Size Uploaded
uqa-0.5.4.tar.gz 27.3 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for uqa 0.5.4
File
uqa-0.5.4-cp38-abi3-win_arm64.whl CPython 3.8 abi3 Windows ARM64 Details
uqa-0.5.4-cp38-abi3-win_amd64.whl CPython 3.8 abi3 Windows x86-64 Details
uqa-0.5.4-cp38-abi3-manylinux_2_28_x86_64.whl CPython 3.8 abi3 Linux glibc 2.28+ x86-64 Details
uqa-0.5.4-cp38-abi3-manylinux_2_28_aarch64.whl CPython 3.8 abi3 Linux glibc 2.28+ ARM64 Details
uqa-0.5.4-cp38-abi3-macosx_11_0_arm64.whl CPython 3.8 abi3 macOS 11.0+ ARM64 Details
uqa-0.5.4-cp38-abi3-macosx_10_12_x86_64.whl CPython 3.8 abi3 macOS 10.12+ x86-64 Details

Total release size: 336.8 MB

Release files / uqa-0.5.4.tar.gz

Download URL uqa-0.5.4.tar.gz
Size 27.3 MB
Tags Source
SHA-256 checksum
How to use checksums
b9985f7075e787b11c55f3893a49cab22aee60b93432664749ffaf1e89da8793
BLAKE2b-256 checksum
How to use checksums
7dc7a748ff780a46a652b1aaa1c96ccfe2afa279b415f8fbc07f3091c8e13138
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 Oct 15, 2026.

Transparency log

Release files / uqa-0.5.4-cp38-abi3-win_arm64.whl

Download URL uqa-0.5.4-cp38-abi3-win_arm64.whl
Size 51.2 MB
Tags CPython 3.8 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
ffd5f7884d97623282a64139d3ced91687ab3d7e4ca3f598b559f5359d6f3bc8
BLAKE2b-256 checksum
How to use checksums
31e4fd329ccbcdafef6d155e2afec87a360728b925cbf03dd87207660809a60a
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 Oct 15, 2026.

Transparency log

Release files / uqa-0.5.4-cp38-abi3-win_amd64.whl

Download URL uqa-0.5.4-cp38-abi3-win_amd64.whl
Size 54.0 MB
Tags CPython 3.8 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
312bb12ed7472daec8036285a26ef405db57f32b85cb8587e09a34c9c50ea0ac
BLAKE2b-256 checksum
How to use checksums
18b877c5add7d4f9ad017bde1f873ea611b21c2647639623a0e21308d5b7c6cb
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 Oct 15, 2026.

Transparency log

Release files / uqa-0.5.4-cp38-abi3-manylinux_2_28_x86_64.whl

Download URL uqa-0.5.4-cp38-abi3-manylinux_2_28_x86_64.whl
Size 52.7 MB
Tags CPython 3.8 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
949092820b53730e982ef15aeae8be21f65c475c646640bf283ff8b72af1e806
BLAKE2b-256 checksum
How to use checksums
99ada96c2e4b6ec6c3ef9cd2988c76d38d0c9bd0f2335be68179f2f264788bf8
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 Oct 15, 2026.

Transparency log

Release files / uqa-0.5.4-cp38-abi3-manylinux_2_28_aarch64.whl

Download URL uqa-0.5.4-cp38-abi3-manylinux_2_28_aarch64.whl
Size 50.7 MB
Tags CPython 3.8 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
a41a65a7205ca8fd69b9ec3157065020c40e95fca8ca04a10241ef1514b619a3
BLAKE2b-256 checksum
How to use checksums
e4e05390406e6aaea36e4240d12bceeb18de706d2946e83161734e73a0e9b0aa
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 Oct 15, 2026.

Transparency log

Release files / uqa-0.5.4-cp38-abi3-macosx_11_0_arm64.whl

Download URL uqa-0.5.4-cp38-abi3-macosx_11_0_arm64.whl
Size 49.3 MB
Tags CPython 3.8 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f061f96734096a7a195a20646c5d5842615d10636f3473aa1371b3d5019385d6
BLAKE2b-256 checksum
How to use checksums
4d65f49d6ea4bfb4987ca38a9d41bc896675a456aeac2c87257fa25986d46009
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 Oct 15, 2026.

Transparency log

Release files / uqa-0.5.4-cp38-abi3-macosx_10_12_x86_64.whl

Download URL uqa-0.5.4-cp38-abi3-macosx_10_12_x86_64.whl
Size 51.6 MB
Tags CPython 3.8 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
382664de75bc20da1b78dd42cdfe527b59dba791e0e3f6cd8f8ed7249dd68656
BLAKE2b-256 checksum
How to use checksums
bd3c544207064d6eb19327cb53d057f55b5b8d58af838eb874ef0efb6f486a98
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 Oct 15, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.5.4 This release

7 release files

0.5.3

7 release files

0.5.2

7 release files

0.5.1

7 release files

0.4.9

7 release files

0.4.8

7 release files

0.4.7

7 release files

0.4.6

7 release files

0.4.0

6 release files

0.3.8

7 release files

0.3.7

7 release files

0.3.6

7 release files

0.3.5

7 release files

0.3.0

6 release files

0.2.3

7 release files

0.2.2

7 release files

0.2.1

7 release files

0.2.0

7 release files

0.1.12

7 release files

0.1.11

7 release files

0.1.10

7 release files

0.1.9

7 release files

0.1.8

7 release files

0.1.7

7 release files

0.1.6

7 release files

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