Skip to main content

Object Storage Client

A unified object storage client for Rust and Python, supporting S3, GCS, Azure Blob Storage, HTTP/HTTPS, and Local Filesystem. It provides a simple, URL-based API for object operations, including cross-provider copy and move.

Features

  • Unified API: Single interface for various storage backends.
  • Cross-Provider: Copy or move objects between different storage providers (e.g., S3 to Local FS).
  • Listing: List a prefix, or the whole bucket from a bucket-root URL (e.g. s3://bucket). Listing is flat and
  • recursive — every key under the prefix is returned, not just the immediate level.
  • Existence checks: Test whether an object or bucket exists without raising on a miss.
  • Bucket creation: Create buckets/containers on S3, GCS and Azure (or directories for local paths).
  • Pre-signed URLs: Generate time-limited, credential-free URLs for S3, GCS and Azure.
  • Multi-Language: Native Rust library with Python 3.13+ bindings.
  • Streaming: Async streaming support for both Rust and Python.
  • CLI: osc command-line tool for quick operations.

Supported Schemes

  • s3://bucket/path (AWS S3)
  • gs://bucket/path or gcs://bucket/path (Google Cloud Storage)
  • az://, wasb://, wasbs://, abfs://, or abfss:// (Azure Blob Storage)
  • http://host/path or https://host/path (HTTP/HTTPS)
  • file:///absolute/path, /absolute/path, ~/path.txt or local_path (Local Filesystem)

For the cloud schemes the host is the bucket / container and the path is the object key. The path is optional: a bucket-root URL such as s3://bucket (or s3://bucket/) is valid and addresses the bucket itself — use it to list the whole bucket, create it, or check that it exists.


Environment Variables

Credentials are read from the environment the first time a backend is used — the client never takes them as constructor arguments. The bucket / container always comes from the URL host, so a single process can talk to several buckets across several providers at once. That is exactly what makes the cross-provider copy and move shown in the walk-throughs below work: export the variables for every provider you touch, and a single ObjectStorageClient can shuttle objects between them. The local filesystem needs no variables.

AWS S3 (s3://)

Also covers S3-compatible stores such as Garage and SeaweedFS.

export S3_ACCESS_KEY_ID="AKIA..."
export S3_SECRET_ACCESS_KEY="..."
export AWS_REGION="eu-north-1"
# Optional: temporary credentials
export AWS_SESSION_TOKEN="..."
# Optional: custom endpoint for S3-compatible stores (e.g. Garage)
export AWS_ENDPOINT_URL_S3="http://localhost:3900"

# Convenience overrides honoured by this client (take precedence when set):
#   S3_REGION, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY
# Allow plain HTTP (e.g. a local Garage):
#   export S3_ALLOW_HTTP=true

Google Cloud Storage (gs:// / gcs://)

# Path to a service-account JSON key file...
export GOOGLE_SERVICE_ACCOUNT="/path/to/service-account.json"
# (GOOGLE_SERVICE_ACCOUNT_PATH and the standard
#  GOOGLE_APPLICATION_CREDENTIALS are also recognised.)

# ...or the service-account JSON supplied inline instead of a path:
#   export GOOGLE_SERVICE_ACCOUNT_KEY='{"type":"service_account", ...}'

Azure Blob Storage (az://, wasb(s)://, abfs(s)://)

export AZURE_STORAGE_ACCOUNT_NAME="mystorageaccount"

# Pick ONE authentication method:
# 1. Shared account key
export AZURE_STORAGE_ACCOUNT_KEY="..."
# 2. Shared Access Signature (SAS) token
#   export AZURE_STORAGE_SAS_KEY="?sv=..."
# 3. Service principal (Azure AD)
#   export AZURE_STORAGE_CLIENT_ID="..."
#   export AZURE_STORAGE_CLIENT_SECRET="..."
#   export AZURE_STORAGE_TENANT_ID="..."

Local Filesystem (file://)

No environment variables — no credentials are required.


CLI Usage (osc)

The osc tool allows you to interact with object storage directly from your terminal.

Installation

Install the osc binary directly from the Bixority Codeberg crate registry with Cargo. Point Cargo at the registry with an environment variable, then install:

export CARGO_REGISTRIES_BIXORITY_INDEX="sparse+https://codeberg.org/api/packages/bixority/cargo/"
cargo install object-storage-client --registry bixority

Alternatively, install straight from Git:

cargo install --git https://codeberg.org/bixority/object-storage-client

Or, if you have the source code, install it from the local checkout:

cargo install --path .

Examples

  • Upload a local file:

    osc put my_file.txt s3://my-bucket/remote_file.txt
    
  • Upload a directory recursively:

    osc put --recursive my_dir s3://my-bucket/remote_dir/
    
  • Download an object:

    osc get gs://my-bucket/data.json ./local_data.json
    
  • Copy between providers:

    osc cp s3://source-bucket/image.png az://dest-container/image.png
    
  • Move an object:

    osc mv s3://my-bucket/old_name.txt s3://my-bucket/new_name.txt
    
  • List objects:

    osc ls s3://my-bucket/logs/
    
  • Delete an object:

    osc rm s3://my-bucket/temp_file.tmp
    
  • Check whether an object exists (prints true/false):

    osc exists s3://my-bucket/report.pdf
    
  • Create a bucket (S3, GCS, Azure, or a directory for local paths):

    osc mb s3://my-new-bucket
    
  • Check whether a bucket exists (prints true/false):

    osc bucket-exists s3://my-bucket
    
  • Stream an object:

    osc get-stream gs://my-bucket/large_file.bin
    
  • Generate a pre-signed URL (S3, GCS, Azure):

    # Pre-signed download URL, valid for the default 1 hour
    osc sign s3://my-bucket/report.pdf
    
    # Pre-signed upload URL (PUT), valid for 15 minutes
    osc sign --method PUT --expires-in 900 s3://my-bucket/upload.bin
    
    # Pre-signed upload URL binding the exact size and type the client must send
    # (S3 only): the upload is rejected unless Content-Length and Content-Type
    # match, so the object store enforces size/type up front.
    osc sign --method PUT --content-length 1048576 \
        --content-type application/pdf s3://my-bucket/upload.pdf
    

Rust Usage

Installation

The crate is published to the Bixority Codeberg crate registry. Point Cargo at the registry with an environment variable:

export CARGO_REGISTRIES_BIXORITY_INDEX="sparse+https://codeberg.org/api/packages/bixority/cargo/"

Then add object-storage-client to your Cargo.toml:

[dependencies]
object-storage-client = { version = "0.0.36", registry = "bixority" }
tokio = { version = "1.0", features = ["full"] }

Alternatively, you can depend on it directly from Git:

[dependencies]
object-storage-client = { git = "https://codeberg.org/bixority/object-storage-client" }
tokio = { version = "1.0", features = ["full"] }

Walk-through

A single client works across every provider — the scheme in each URL selects the backend, so you can upload to S3, then copy or move the object straight to GCS, Azure or the local disk with no intermediate download on your side.

use object_storage_client::{ObjectStorageClient, SignMethod, SignOptions};
use std::time::Duration;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = ObjectStorageClient::new();

    // Create a bucket (S3/GCS/Azure, or a directory for file:// URLs); idempotent
    client.create_bucket("s3://my-bucket").await?;

    // Upload data to S3
    client.put("s3://my-bucket/hello.txt", &b"Hello from Rust!"[..]).await?;

    // Download it back
    let retrieved = client.get("s3://my-bucket/hello.txt").await?;
    println!("Retrieved: {}", String::from_utf8_lossy(&retrieved));

    // List the whole bucket from a bucket-root URL (flat, recursive: every key
    // is returned). Pass a prefix such as "s3://my-bucket/logs/" to narrow it.
    let keys = client.list("s3://my-bucket").await?;
    println!("Bucket keys: {keys:?}");

    // Existence checks (missing -> Ok(false), never an error)
    if client.bucket_exists("s3://my-bucket").await? {
        println!("my-bucket is present");
    }
    if client.exists("s3://my-bucket/hello.txt").await? {
        println!("hello.txt is present");
    }

    // --- Move data across providers with one client ---

    // Copy S3 -> Google Cloud Storage (source is left in place)
    client
        .copy("s3://my-bucket/hello.txt", "gs://my-gcs-bucket/hello.txt")
        .await?;

    // Move GCS -> Azure Blob Storage (source is deleted afterwards)
    client
        .move_object("gs://my-gcs-bucket/hello.txt", "az://my-container/hello.txt")
        .await?;

    // Copy Azure -> local disk for a working copy
    client
        .copy("az://my-container/hello.txt", "file:///tmp/hello_local.txt")
        .await?;

    // --- Pre-signed URLs: time-limited, credential-free access (S3/GCS/Azure) ---

    // Pre-signed download (GET) link, valid for one hour
    let download_url = client
        .get_pre_signed_url(
            "s3://my-bucket/hello.txt",
            SignMethod::Get,
            Duration::from_secs(3600),
            &SignOptions::default(),
        )
        .await?;
    println!("Share this download link: {download_url}");

    // Pre-signed upload (PUT) link binding the exact size and type the client
    // must send (S3 only); the store rejects mismatched uploads up front.
    let upload_url = client
        .get_pre_signed_url(
            "s3://my-bucket/upload.bin",
            SignMethod::Put,
            Duration::from_secs(900),
            &SignOptions {
                content_length: Some(1_048_576),
                content_type: Some("application/octet-stream".to_string()),
            },
        )
        .await?;
    println!("Upload directly to: {upload_url}");

    Ok(())
}

Python 3.14+ Usage

Installation

The package is published on PyPI. Note that it requires Python 3.13+.

pip install object-storage-client

Or if you are developing locally, you can use maturin:

maturin develop

Walk-through

The same client handles every provider; the scheme in each URL picks the backend, so copying or moving an object between S3, GCS, Azure and local disk is a single call.

import asyncio
from object_storage_client import ObjectStorageClient

async def main():
    client = ObjectStorageClient()

    # Create a bucket (S3/GCS/Azure, or a directory for file:// URLs); idempotent
    await client.create_bucket("s3://my-bucket")

    # Check whether a bucket exists (returns a bool; never raises for a miss).
    if await client.bucket_exists("s3://my-bucket"):
        print("my-bucket is present")

    # Upload data to S3
    await client.put_object("s3://my-bucket/hello.txt", b"Hello from Python!")

    # Check whether an object exists (returns a bool; never raises for a miss).
    # If you prefer the missing case to raise FileNotFoundError, use
    # get_object_metadata() or get_object() instead.
    if await client.object_exists("s3://my-bucket/hello.txt"):
        print("hello.txt is present")

    # Fetch full metadata (raises FileNotFoundError if the object is missing)
    meta = await client.get_object_metadata("s3://my-bucket/hello.txt")
    print(f"Size: {meta['size_bytes']}, type: {meta['content_type']}")

    # Download data
    data = await client.get_object("s3://my-bucket/hello.txt")
    print(f"Retrieved: {data.decode()}")

    # List objects
    items = await client.list_objects("s3://my-bucket/")
    print(f"Bucket items: {items}")

    # Stream data
    stream = await client.get_object_stream("s3://my-bucket/hello.txt")
    async for chunk in stream:
        print(f"Chunk size: {len(chunk)}")

    # --- Move data across providers with one client ---

    # Copy S3 -> Google Cloud Storage (source is left in place)
    await client.copy_object("s3://my-bucket/hello.txt", "gs://my-gcs-bucket/hello.txt")

    # Move GCS -> Azure Blob Storage (source is deleted afterwards)
    await client.move_object("gs://my-gcs-bucket/hello.txt", "az://my-container/hello.txt")

    # Copy Azure -> local disk for a working copy
    await client.copy_object("az://my-container/hello.txt", "file:///tmp/hello_local.txt")

    # --- Pre-signed URLs (S3/GCS/Azure): credential-free, time-limited access ---

    download_url = await client.get_pre_signed_url("s3://my-bucket/hello.txt")
    # Bind the exact Content-Length and Content-Type the client must send (S3
    # only); the store rejects uploads that don't match.
    upload_url = await client.get_pre_signed_url(
        "s3://my-bucket/upload.bin",
        method="PUT",
        expires_in_secs=900,
        content_length=1_048_576,
        content_type="application/octet-stream",
    )
    print(f"Download: {download_url}\nUpload: {upload_url}")

if __name__ == "__main__":
    asyncio.run(main())

Developer Instructions

Prerequisites

  • Rust 1.98+ (or latest stable)
  • Python 3.14+
  • maturin (for Python bindings)

Building

  • Rust: cargo build --release
  • Python: maturin build --release
  • CLI: cargo build --bin osc

Testing

cargo nextest run --workspace

Metadata

Release files for object-storage-client 0.1.18

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

Source distribution (sdist)

Source distribution for object-storage-client 0.1.18
File Size Uploaded Provenance Actions
object_storage_client-0.1.18.tar.gz 73.5 kB Without provenance Details for object_storage_client-0.1.18.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for object-storage-client 0.1.18
File Actions
object_storage_client-0.1.18-cp315-cp315-win_amd64.whl CPython 3.15 CPython 3.15 Windows x86-64 Details for object_storage_client-0.1.18-cp315-cp315-win_amd64.whl
object_storage_client-0.1.18-cp315-cp315-manylinux_2_28_aarch64.whl CPython 3.15 CPython 3.15 Linux glibc 2.28+ ARM64 Details for object_storage_client-0.1.18-cp315-cp315-manylinux_2_28_aarch64.whl
object_storage_client-0.1.18-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.15 CPython 3.15 Linux glibc 2.17+ x86-64 Details for object_storage_client-0.1.18-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
object_storage_client-0.1.18-cp315-cp315-macosx_11_0_arm64.whl CPython 3.15 CPython 3.15 macOS 11.0+ ARM64 Details for object_storage_client-0.1.18-cp315-cp315-macosx_11_0_arm64.whl
object_storage_client-0.1.18-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details for object_storage_client-0.1.18-cp314-cp314-win_amd64.whl
object_storage_client-0.1.18-cp314-cp314-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ ARM64 Details for object_storage_client-0.1.18-cp314-cp314-manylinux_2_28_aarch64.whl
object_storage_client-0.1.18-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ x86-64 Details for object_storage_client-0.1.18-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
object_storage_client-0.1.18-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details for object_storage_client-0.1.18-cp314-cp314-macosx_11_0_arm64.whl

Total release size: 28.7 MB

Release files / object_storage_client-0.1.18.tar.gz

Download URL object_storage_client-0.1.18.tar.gz
Size 73.5 kB
Tags Source
SHA-256 checksum
How to use checksums
ae25ca9e49a8a0d1e97d958cc9e36e7f7ffe360176e9f7c213e12cf2925d0e8d
BLAKE2b-256 checksum
How to use checksums
4d5dc43e0851d0922de3cad51186c0abab78f7a519721b066f964717538063c3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / object_storage_client-0.1.18-cp315-cp315-win_amd64.whl

Download URL object_storage_client-0.1.18-cp315-cp315-win_amd64.whl
Size 3.6 MB
Tags CPython 3.15 Windows x86-64
SHA-256 checksum
How to use checksums
fd277de00bf47a7d6cad9f24b82dad8cc9dea257c70b2b3e7d69df8e52a5c1d1
BLAKE2b-256 checksum
How to use checksums
1d235a98f3b233660d01e00cba96100959d3f4aa788a302f4c7f69b69afbcf3f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / object_storage_client-0.1.18-cp315-cp315-manylinux_2_28_aarch64.whl

Download URL object_storage_client-0.1.18-cp315-cp315-manylinux_2_28_aarch64.whl
Size 3.8 MB
Tags CPython 3.15 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
edb3558e8b2051206c93dc65d7560f3726ccf50ed635e74e496b6b5f4aae5fb7
BLAKE2b-256 checksum
How to use checksums
ae6a1dc41ba5f3c79c76bcb75f90bc6ab0bb0c6f3920013f33c740f31468f3e9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / object_storage_client-0.1.18-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL object_storage_client-0.1.18-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 4.0 MB
Tags CPython 3.15 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
af5cfb514ab3679dd639f0ad5843770081db656127cfc2caf8fa43c9cf0d62be
BLAKE2b-256 checksum
How to use checksums
ad65b055472132f492d776c44f9a576a7228c0102ad5acc424c92c0b0c9aaa46
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / object_storage_client-0.1.18-cp315-cp315-macosx_11_0_arm64.whl

Download URL object_storage_client-0.1.18-cp315-cp315-macosx_11_0_arm64.whl
Size 2.9 MB
Tags CPython 3.15 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
5e03a60e5a39338619842cd912854ebb92e375c05de87c2512d92f22198d45cf
BLAKE2b-256 checksum
How to use checksums
588e78e6ba0ac1a1a7d6b77f802904825f77edddb405bc1bf5fafcf62ce34b7a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / object_storage_client-0.1.18-cp314-cp314-win_amd64.whl

Download URL object_storage_client-0.1.18-cp314-cp314-win_amd64.whl
Size 3.6 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
cc723fffd837b168db589b9e2278be720c79a7b78f83a9c661b930059a65265a
BLAKE2b-256 checksum
How to use checksums
82188f0eaf14a7ce63cdb2326959b61ea05fa83f0561d8783a7d072c62d88381
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / object_storage_client-0.1.18-cp314-cp314-manylinux_2_28_aarch64.whl

Download URL object_storage_client-0.1.18-cp314-cp314-manylinux_2_28_aarch64.whl
Size 3.8 MB
Tags CPython 3.14 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
143e4a9c146d9852820af551d3edabbcc94e48251c19f831c415a5ccef5e7389
BLAKE2b-256 checksum
How to use checksums
ae2a4130c22bf26c147f48d16dc956dd115655463aa8ed666cbf388e797d3042
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / object_storage_client-0.1.18-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL object_storage_client-0.1.18-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 4.0 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
b4b6c39dd9bee677f157dd87610cda7790175d7c0aaa23442f274377b816ed97
BLAKE2b-256 checksum
How to use checksums
86845d7da32b324bdcbe314e272ff6d2b927d8a1284bb61e8137d850084cb620
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / object_storage_client-0.1.18-cp314-cp314-macosx_11_0_arm64.whl

Download URL object_storage_client-0.1.18-cp314-cp314-macosx_11_0_arm64.whl
Size 2.9 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
3cb371f8bae6693055a4eac7778030e3c46ba452c0547fe7e99dde9bce19605b
BLAKE2b-256 checksum
How to use checksums
3eac4818cdf6db4cb6f02b38699242c54fecf8967318ba184d7aa1cc1b4d6320
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for object-storage-client 0.1.18

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A 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.

Release history Release notifications | RSS feed

This release

0.1.18 This release

9 release files No provenance

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