Skip to main content

deltalite

Streaming, partition-level upsert for Delta Lake tables that replaces delta-rs's SQL MERGE with a bounded-memory merge engine. Memory is bounded by the size of the incoming batch and a few concurrency knobs — never by the size of the target table.

delta-rs stays the storage and protocol layer (transaction log, checkpoints, Parquet encoding, S3 conditional-put commits, conflict resolution). deltalite replaces only the merge execution, and writes output files through a streaming writer that produces the same files and Add-action statistics as delta-rs's RecordBatchWriter without holding a second copy of each file.

import deltalite

table = deltalite.DeltaLiteTable.open("s3://bucket/my_table")
stats = table.upsert(record_batch, primary_keys=["id"], partition_key="day")
print(f"v{stats.version}: +{stats.rows_inserted} / ~{stats.rows_updated}")

Why

delta-rs MERGE executes a DataFusion hash join whose memory scales with the scanned target, and it can deadlock under a bounded memory pool (delta-io/delta-rs#4614). For a large, slowly-changing table merged against a comparatively small batch — the typical incremental-sync shape — that means either OOM risk or a hang.

deltalite takes a different route:

  1. Build a primary-key hash set over the (small) source batch.
  2. Stream the (large) target one Parquet row group at a time, dropping rows whose key is in the source set.
  3. Write survivors plus the source rows into new files.
  4. Commit every touched partition in one atomic Delta commit.

Peak memory is bounded by the source batch and the concurrency knobs, not by the table. In validation, resident memory stayed flat from 62k- to 1M-row partitions (~4× below MERGE) at matching write volume, via exact content-based file selection.

Installation

pip install deltalite
# or
uv add deltalite

Prebuilt cp312-abi3 wheels are published for manylinux (2_28) and musllinux on x86_64/aarch64, and macOS on arm64/x86_64. A single wheel works on any CPython 3.12 or newer. No Rust toolchain is needed to install.

Usage

upsert accepts anything with the pyarrow C-stream interface — a pyarrow.Table, a RecordBatch, or a RecordBatchReader:

import pyarrow as pa
import deltalite

table = deltalite.DeltaLiteTable.open(
    "s3://bucket/events",
    storage_options={
        "AWS_REGION": "us-east-1",
        "AWS_ACCESS_KEY_ID": "...",
        "AWS_SECRET_ACCESS_KEY": "...",
    },
)

batch = pa.table({
    "id":  [1, 2, 3],
    "day": ["2026-01-01", "2026-01-01", "2026-01-02"],
    "val": ["a", "b", "c"],
})

stats = table.upsert(
    batch,
    primary_keys=["id"],
    partition_key="day",          # omit for an unpartitioned table
    commit_metadata={"source": "my-sync"},
)

print(stats)
# UpsertStats(version=42, partitions_touched=2, files_added=2, files_removed=1, ...)

Rows in the batch whose primary key already exists are replaced; new keys are inserted. Deletes are not expressed through upsert — it is an insert-or-replace by key. Duplicate primary keys within a single batch are rejected (raising DeltaLiteError) rather than silently double-inserted.

API

DeltaLiteTable

Method Description
DeltaLiteTable.open(uri, storage_options=None) Open an existing Delta table. storage_options is the usual object-store dict (S3/GCS/Azure/local).
DeltaLiteTable.is_deltatable(uri, storage_options=None) True if a Delta table exists at uri.
DeltaLiteTable.table_exists(uri, storage_options=None) True if the log at uri holds a commit or a checkpoint, the same check as DeltaTable.is_deltatable. Storage errors raise; they never read as False.
.upsert(data, primary_keys, partition_key=None, **opts) Insert-or-replace data by key. Returns UpsertStats. See knobs below.
.history_upsert(data, key_columns, order_column, valid_from_column, valid_to_column, partition_column, current_partition, tie_break_column, **opts) Apply versions to an SCD2 history table in one data commit. Returns HistoryUpsertStats. See "History upsert" below.
.key_buckets(data, key_columns, n) Bucket ids for splitting a history_upsert source by key. See "History upsert" below.
.compact(**opts) Small-file compaction, the replacement for DeltaTable.optimize.compact. Returns a stats dict. See "Compaction" below.
.restore(version, *, commit_metadata=None) delta-rs's restore to version, in one commit, with the GIL released. Returns numRemovedFile, numRestoredFile and the committed version. The handle moves onto the restored table.
.version() Current table version (int).
.reload() Bring the table state up to date with the log (incremental; falls back to a full re-open).
.table_id() The table id from the metadata action (str).
.configuration() Table configuration, delta.* properties and custom keys (dict[str, str]).
.schema_arrow() Table schema as a pyarrow Schema.
.schema_json() Table schema as the Delta JSON document (str), as DeltaTable.schema().to_json() returns it.
.partition_columns() Partition column names (list[str]).
.num_files() Number of active data files (int).
.files() Active data files as dicts: path (relative to the table root), size, modification_time (epoch ms), partition_values (dict[str, str | None]).
.file_uris() URIs of the table's active data files.
.history(limit) Recent commit history entries.

version, table_id, configuration, schema_*, partition_columns, num_files, files and file_uris read the loaded snapshot in memory and do no I/O; call reload() first when the table may have moved. history reads the log.

UpsertStats

Returned by upsert. Counts: version, partitions_touched, files_added, files_removed, files_carried_over, files_probed (candidate files the probe read), files_probe_cached (candidate files the probe decided from the probe cache), rows_updated, rows_inserted, rows_copied, source_rows, null_pk_rows. Per-phase wall-clock timings (milliseconds): ingest_ms (importing the pyarrow source), initial_open_ms (the full snapshot load in DeltaLiteTable.open, reported on the first upsert through a handle and 0 afterwards, so a sum over a handle's upserts counts it once), open_ms (snapshot refreshes around the upsert), relax_ms (nullability-relax check), plan_ms (listing + pruning files), rewrite_ms (reading + rewriting the touched partitions), probe_ms (probing, summed over partitions, part of rewrite_ms), commit_ms (committing to the Delta log), maintenance_ms (checkpoint/log cleanup, non-zero only on checkpoint-boundary commits). columns_relaxed counts non-nullable columns flipped to nullable before the write.

History upsert

history_upsert writes an SCD2 history table: one row per version of a key. Open versions (valid_to_column null) live in the current_partition value of partition_column. A closed version lives in the partition named by its valid_to_column as %Y-%m in UTC, which is what pyarrow.compute.strftime(valid_to, "%Y-%m") returns for a UTC timestamp. The table must be partitioned by exactly partition_column, a string column, or the call raises DeltaLiteUnsupportedTableError.

Per key (key_columns, compared null-safely: a null key part matches a null key part):

  1. Rows with the same order_column value collapse to the one with the highest tie_break_column value. On an equal tie-break value, the later row wins.
  2. Only rows with an order value strictly greater than the key's open row are kept. Equal rows count as rows_reread, lower rows as rows_backwards.
  3. The kept rows form a chain: each closes at the next kept row's valid_from_column, and the newest stays open.
  4. When a key keeps a row and has an open row, the open row closes at the first kept row's valid_from_column and moves to its month partition.

The source must not carry valid_to_column or partition_column, since the operation sets them. A null order value or a null valid_from_column raises DeltaLiteError. tie_break_column must have a fixed-width type, such as an integer or a timestamp, and is written only when the table has that column. Closed rows are only appended, so earlier closed versions of a key stay. A source that keeps no row, such as a re-run of the same input, makes no commit and returns committed=False, so a re-run after a crash is safe. That includes the nullability relax: it commits only when the call also writes rows.

Each call reads the key and order columns of every current-partition file that its stats do not rule out, so a file that holds only re-read keys is not rewritten. The probe cache is not used. The knobs are the upsert ones that apply: commit_metadata, max_parallel_files, max_buffered_bytes, max_fetch_bytes, probe_concurrency, read_batch_size, target_file_size, max_row_group_bytes, max_source_bytes, read_ahead_row_groups and the multipart and ranged-read settings. max_parallel_partitions is accepted and has no effect, because only the current partition is rewritten. A commit that finds a newer table version is never rebased onto it, since delta-rs does not check a concurrent commit that only adds files: the call plans again against the new version, up to five times, then raises DeltaLiteCommitConflictError.

HistoryUpsertStats counts rows_in, rows_deduped, rows_reread, rows_backwards, versions_opened, versions_closed (open rows closed), chain_rows_closed (kept rows written closed), rows_copied, files_added, files_removed, files_carried_over, files_probed, bytes_read (stored size of the rewritten files) and bytes_written, with version, committed and the upsert timings.

DeltaLiteTable.key_buckets(data, key_columns, n) returns a pyarrow.UInt32Array with a bucket id in 0..n for every row, for splitting a source that is too large for one call into calls on disjoint keys. The key columns are first cast to the table's types, as history_upsert casts them before it matches keys, so source values that become one table key always share a bucket. Each key is then encoded with arrow-row (null-safe) and hashed with xxHash64 under a fixed seed, then reduced modulo n. The ids are the same in every process that runs one deltalite build, for keys of the same Arrow types. arrow-row may change its encoding between arrow releases, so do not persist the ids.

Compaction

compact plans bins exactly as delta-rs's optimize.compact does, from the loaded log with no storage reads, and commits them the same way (ZSTD level 4, one OPTIMIZE commit, dataChange=false). Each bin is streamed one file and one byte-bounded batch at a time through the upsert's fetch and decode budgets, so memory follows the knobs, not the bin. Output files and row groups are also capped by decoded size, so a bin that decodes past a cap writes more than one file where delta-rs writes one.

Knob Default Meaning
target_file_size table's delta.targetFileSize Bin size and output file size (compressed bytes).
max_parallel_bins 2 Bins rewritten at once.
slot_budget_bytes none Memory for the whole call: caps the decode and fetch budgets at a quarter each and lowers max_parallel_bins so the output files fit the rest.
max_decoded_file_bytes 1 GiB An output file closes when its decoded bytes reach this (keeps files under the 2 GiB Arrow offset limit).
max_row_group_decoded_bytes 128 MiB An output row group closes at this many decoded bytes.
partitions all Only these partition values.
min_partition_removable_files 1 Rewrite a partition only when its bins remove at least this many more files than they write. 1 is delta-rs's behavior.
max_bins_per_commit one commit Commit every N bins instead.
max_replan_rounds 1 Times the partitions of bins dropped on a conflict are planned and rewritten again.
commit_max_retries 15 Commit attempts after another writer committed first.
dry_run False Plan only; report what would be rewritten.

Conflicts: when another writer commits first, compaction keeps each bin whose input files are all still live and drops the others (deleting their output), so it never resurrects rows a merge replaced. A concurrent schema, partitioning or protocol change raises DeltaLiteCommitConflictError. Tables the upsert refuses are refused here too (DeltaLiteUnsupportedTableError). The result dict carries deltalite's counters plus delta-rs's numFilesAdded, numFilesRemoved, partitionsOptimized, numBatches, totalConsideredFiles and totalFilesSkipped.

Exceptions

All inherit from DeltaLiteError, so you can catch the base or branch on kind:

Exception Raised when
DeltaLiteError Base class / generic failure.
DeltaLiteCommitConflictError Concurrent commit won the conditional-put race (retry-exhausted).
DeltaLiteSchemaMismatchError Batch schema is incompatible with the table.
DeltaLiteTableNotFoundError No Delta table at the URI.
DeltaLiteUnsupportedTableError Table uses a feature deltalite can't handle (e.g. deletion vectors, column mapping).
DeltaLiteSourceTooLargeError Batch exceeds max_source_bytes (see below).
DeltaLiteTimeoutError A wait for a process-wide budget passed its bound (see "Timeouts" below).

Operational knobs

Per-call — keyword arguments to upsert (defaults in parentheses):

Argument Default Purpose
max_parallel_partitions 2 Partitions merged concurrently.
max_parallel_files 4 Files read concurrently within a partition.
max_buffered_bytes 64 MiB Decoded rows in flight between the file readers and the writer.
max_fetch_bytes 128 MiB Compressed row-group bytes the file readers hold before decoding. A reader reserves its file's largest row group before fetching; a row group larger than the cap still runs, alone.
prune_strategy "probe" "probe" skips files that can't contain a source key; "none" scans all.
skip_unmatched_files True Convenience toggle: False ≡ prune_strategy="none".
probe_concurrency 8 Concurrent statistics/probe reads.
read_batch_size 8192 Row-group read batch size.
target_file_size table setting, else 100 MiB Output file size target.
isolate_source_rows False Write the batch's rows to their own files, apart from the unchanged rows copied out of the rewritten files. A later batch that touches the same rows then rewrites only those files. Costs up to one more file per touched partition.
max_row_group_bytes None Close an output row group at this many encoded bytes. A later upsert's reader fetches one whole row group at a time, so smaller row groups lower its memory. None closes row groups only at the encoder's row cap.
max_source_bytes 2 GiB Oversized-batch guard (0 disables).
multipart_threshold / multipart_part_size 16 MiB / 8 MiB Multipart upload thresholds (0 threshold disables). With multipart_concurrency=1 the defaults are 64 MiB / 16 MiB.
multipart_concurrency 4 Parts of one upload sent at once. The parts are slices of the finished file, so more parts in flight add no memory. 1 sends them one after another.
range_get_part_size / range_get_concurrency 8 MiB / 4 A ranged read of a data file (a row group) larger than the part size is split into requests of that size, this many at once. Each request writes into its place in one buffer, so the split adds no memory. 1 turns the split off.
read_ahead_row_groups False Read the next row group of a file while the current one decodes. A reader then holds up to two row groups, and reserves both from max_fetch_bytes; a file whose two largest neighbouring row groups do not fit is read without it.
commit_max_retries 15 Conditional-put commit retry budget.
commit_metadata None Extra key/values recorded in the Delta commit.
use_probe_cache True Use the process-wide probe cache (see below). False reads every candidate file from storage.

Process-global — environment variables, enforced on top of the per-call knobs so that many concurrent upsert threads in one process cannot multiply the budgets:

DELTALITE_PROCESS_MAX_PARALLEL_PARTITIONS (8), DELTALITE_PROCESS_MAX_PARALLEL_FILES (16), DELTALITE_PROCESS_MAX_BUFFERED_BYTES (256 MiB), DELTALITE_PROCESS_MAX_FETCH_BYTES (256 MiB), DELTALITE_MAX_SOURCE_BYTES, DELTALITE_MULTIPART_THRESHOLD_BYTES, DELTALITE_MULTIPART_PART_SIZE_BYTES, DELTALITE_MULTIPART_CONCURRENCY, DELTALITE_RANGE_GET_PART_SIZE_BYTES, DELTALITE_RANGE_GET_CONCURRENCY. The last five are the defaults of the per-call arguments of the same names.

Timeouts. All upserts and compactions of one process share the process-wide budgets above, and their waits are fair. So one call that holds permits and stops making progress can make every other call wait. Three bounds stop that:

Bound Default Override When it passes
S3 request timeout 120s, connect_timeout 5s, pool_idle_timeout 15s the storage option of the same name (any spelling object_store accepts, for example aws_timeout), or its environment variable (AWS_TIMEOUT) object_store retries the request, then the call fails.
One object-store call 10 minutes DELTALITE_IO_DEADLINE_SECS (0 removes it) An upload of a data file or a part, or a ranged read of a data file, fails with a DeltaLiteError that names the call. Conditional puts (commits) have no deadline.
One wait for a process-wide budget 30 minutes DELTALITE_PERMIT_WAIT_TIMEOUT_SECS (0 removes it) The call fails with DeltaLiteTimeoutError, which names the budget and gives its free permits and waiters.

Only S3 tables get the request defaults. object_store uses a 30s request timeout, which cuts a 128 MiB checkpoint read or a 64 MiB single PUT on a connection slower than about 4 MB/s.

deltalite.limits_snapshot() returns the free and total permits of each process-wide budget and the number of acquisitions that wait for it: {"partitions": {"available": 8, "total": 8, "waiters": 0}, "files": ..., "buffer_kb": ..., "fetch_kb": ...}. It does no I/O and takes no lock, so a caller can read it while another call of the process hangs. A waiter that needs more permits than are free takes the free ones and waits for the rest, so available can be 0 while a part of the budget belongs to a waiter.

Probe cache. The probe reads a footer and the PK column of every candidate file, so on object storage its cost grows with the number of files in the touched partitions. A Delta data file never changes, so deltalite keeps the 64-bit hashes of each file's PK tuples in one process-wide LRU cache, keyed by table URL and file path. A probe that reads a file and finds no match caches it, and an upsert caches the files it writes once its commit lands. A later probe decides a cached file with no read. Equal keys always give equal hashes, so a cached file that holds a key is never skipped. A hash collision only adds a file to the rewrite, which copies its rows unchanged. A file the commit removes leaves the cache. DELTALITE_PROBE_CACHE_BYTES (128 MiB, 0 turns the cache off) caps the entries, and one entry can use at most an eighth of the cap, so a file with more keys is probed every time. Hashes collected for files still being read or written use at most a quarter of the cap more, so the cache uses at most 1.25 times the cap. deltalite.set_probe_cache_max_bytes(n) changes the cap at run time, deltalite.clear_probe_cache() empties the cache, and deltalite.probe_cache_stats() returns its size and hit counters.

Checkpoint prefetch. Opening or reloading a table reads its latest checkpoint Parquet file whole in one GET and serves the Parquet reader's many small range reads from memory, instead of one round trip per footer, metadata block and column chunk. DELTALITE_CHECKPOINT_PREFETCH_MAX_BYTES (128 MiB) bounds the total checkpoint bytes cached by one table load; larger files or multipart checkpoints that exhaust the budget fall back to range reads, and 0 disables the prefetch. Cached bytes also reserve space from DELTALITE_PROCESS_MAX_BUFFERED_BYTES, so concurrent table opens share the process-wide budget. The bytes are released as soon as the load finishes.

Commit snapshot adoption. After a successful upsert the handle keeps the table state delta-rs derived for the commit it just wrote (the same state every delta-rs operation returns) instead of listing the log and reading that commit back. The next upsert still refreshes before it plans, so commits from other writers are observed exactly as before, and a checkpoint the upsert's own maintenance wrote is adopted on that refresh. DELTALITE_ADOPT_COMMIT_SNAPSHOT=0 restores the post-commit refresh.

Data-file reads. Every Parquet data file is opened with a 64 KiB footer size hint, so a footer that fits arrives in one GET instead of two, and a file the probe found a match in hands its parsed footer to the rewrite, so the file is not opened a second time.

Log requests. Four changes remove LIST requests of _delta_log/ and repeated reads. Each one has a kill switch that restores the earlier requests: set the variable to 0 (false, off and no also work).

Switch What it controls
DELTALITE_PROBE_REFRESH A refresh asks if the snapshot is current with one GET and one HEAD, sent together, before it lists the log. The GET is for the commit file after the loaded version: a 404 proves that no newer version exists, because versions have no gaps and a commit file is written one time. The HEAD compares the ETag and the modification time of a commit file that the last load read, so a table that was deleted and created again is loaded again. When a newer commit exists, the refresh lists the log as before.
DELTALITE_OPTIMISTIC_COMMIT_VERSION Before the commit put, delta-rs lists the log to find the latest version. The same GET and HEAD replace that LIST. The create-only put (If-None-Match: * on S3) stays the conflict check. If the put loses a race, delta-rs lists the log and checks for conflicts as before. If the table was replaced, the commit fails as a conflict, writes nothing, and the upsert runs again on the table that it loads again.
DELTALITE_COMMIT_JSON_CACHE During one load each commit file is read one time (the kernel reads it two times), and the commit that an upsert wrote is not read back. The memory is at most 256 files and 8 MiB (1 MiB for one file), counts against DELTALITE_CHECKPOINT_PREFETCH_MAX_BYTES and DELTALITE_PROCESS_MAX_BUFFERED_BYTES, and is released when the operation ends. A commit that does not fit is read as before.
DELTALITE_SMALL_FILE_SINGLE_GET A data file of 64 KiB or less is read with one GET when it is opened without a footer from the probe. The size comes from the Delta log. The reader takes its permit from the fetch budget (max_fetch_bytes, DELTALITE_PROCESS_MAX_FETCH_BYTES) for the whole file before the request, and the bytes are released with the reader.

The probe is used only while a 404 is proof:

  • The handle lists the log when the last LIST is older than 10 minutes, or older than half of delta.logRetentionDuration if that is shorter. Log cleanup removes only commit files older than the retention, so inside this time a missing commit file was never written.
  • The handle lists the log when the last load read no commit file (the loaded version is a checkpoint version), when the store gives no ETag, and after its own commit on a checkpoint boundary.
  • A log store that does not commit with a create-only put (for example the DynamoDB lock store) keeps the LIST before the commit put.

The probe needs a store that answers a GET or a HEAD with the current state of the object. S3 does this (reads are strongly consistent after a write or a delete), and so do SeaweedFS, the local file system and the in-memory store. Set DELTALITE_PROBE_REFRESH=0 and DELTALITE_OPTIMISTIC_COMMIT_VERSION=0 for a store, or a cache in front of a store, that can answer 404 for an object that exists.

Metrics

deltalite emits via the Rust metrics facade (static labels only): deltalite_upserts_total (outcome, prune_strategy, error_kind), deltalite_upsert_duration_seconds, deltalite_files_{added,removed,carried_over,probed,probe_cached}_total, deltalite_rows_{updated,inserted,copied}_total, deltalite_checkpoint_prefetch_total (outcome), deltalite_refresh_probe_total (outcome: current, new_commits, replaced, unknown, listed, no_anchor), and deltalite_commit_probe_total (outcome).

Compatibility & status

  • Built against deltalake (delta-rs) 0.32.x as the storage/protocol layer. Correctness is guaranteed by a differential parity suite that runs the same batch sequences through real delta-rs MERGE and through deltalite.upsert and asserts identical logical content — not by version equality.
  • Not supported: tables with deletion vectors or column mapping (detected and raised as DeltaLiteUnsupportedTableError). SCD2 history tables are written with history_upsert, not with upsert.
  • deltalite rejects duplicate source primary keys that MERGE silently double-inserts — check pre-existing data if you migrate an existing pipeline.

This package is developed in the PostHog monorepo under rust/deltalite/. Issues and source live there.

Metadata

Release files for deltalite 0.1.16

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

Source distribution (sdist)

Source distribution for deltalite 0.1.16
File Size Uploaded Provenance Actions
deltalite-0.1.16.tar.gz 372.0 kB With provenance Details for deltalite-0.1.16.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for deltalite 0.1.16
File Actions
deltalite-0.1.16-cp312-abi3-musllinux_1_2_x86_64.whl CPython 3.12 abi3 Linux musl 1.2+ x86-64 Details for deltalite-0.1.16-cp312-abi3-musllinux_1_2_x86_64.whl
deltalite-0.1.16-cp312-abi3-musllinux_1_2_aarch64.whl CPython 3.12 abi3 Linux musl 1.2+ ARM64 Details for deltalite-0.1.16-cp312-abi3-musllinux_1_2_aarch64.whl
deltalite-0.1.16-cp312-abi3-manylinux_2_28_x86_64.whl CPython 3.12 abi3 Linux glibc 2.28+ x86-64 Details for deltalite-0.1.16-cp312-abi3-manylinux_2_28_x86_64.whl
deltalite-0.1.16-cp312-abi3-manylinux_2_28_aarch64.whl CPython 3.12 abi3 Linux glibc 2.28+ ARM64 Details for deltalite-0.1.16-cp312-abi3-manylinux_2_28_aarch64.whl
deltalite-0.1.16-cp312-abi3-macosx_11_0_arm64.whl CPython 3.12 abi3 macOS 11.0+ ARM64 Details for deltalite-0.1.16-cp312-abi3-macosx_11_0_arm64.whl
deltalite-0.1.16-cp312-abi3-macosx_10_12_x86_64.whl CPython 3.12 abi3 macOS 10.12+ x86-64 Details for deltalite-0.1.16-cp312-abi3-macosx_10_12_x86_64.whl

Total release size: 308.7 MB

Release files / deltalite-0.1.16.tar.gz

Download URL deltalite-0.1.16.tar.gz
Size 372.0 kB
Tags Source
SHA-256 checksum
How to use checksums
586f2819330db8284f33e0586afab55f07f0c2acb758b7c7169d67081270ce41
BLAKE2b-256 checksum
How to use checksums
43415d2f943a3d3ad88acb09b997601570c4db39879dfe63d2d5cf5143a3f061
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 Nov 5, 2026.

Transparency log

Release files / deltalite-0.1.16-cp312-abi3-musllinux_1_2_x86_64.whl

Download URL deltalite-0.1.16-cp312-abi3-musllinux_1_2_x86_64.whl
Size 67.7 MB
Tags CPython 3.12 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
aa0f657ab02f9832b9760c3ce7641f53a56b5b018b7b70020ecae7ab71c4c8c5
BLAKE2b-256 checksum
How to use checksums
75e20297ae4c25d67a9fb1c05e8b1842afe3e72e102555fbe9fe687cc0284226
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 Nov 5, 2026.

Transparency log

Release files / deltalite-0.1.16-cp312-abi3-musllinux_1_2_aarch64.whl

Download URL deltalite-0.1.16-cp312-abi3-musllinux_1_2_aarch64.whl
Size 66.7 MB
Tags CPython 3.12 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
88d41fdc3347dd688adacbdc403c14f741427ad5b835e551758b6a6cb2234ebc
BLAKE2b-256 checksum
How to use checksums
3f3564577c6e1de7056342e8dd5fd0211d238658bfe083534f55696c3eb07d16
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 Nov 5, 2026.

Transparency log

Release files / deltalite-0.1.16-cp312-abi3-manylinux_2_28_x86_64.whl

Download URL deltalite-0.1.16-cp312-abi3-manylinux_2_28_x86_64.whl
Size 69.4 MB
Tags CPython 3.12 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
678ebb84db6cb19125a3b5334ec34c6f4d407b91c7809c5b7852142820ea7cad
BLAKE2b-256 checksum
How to use checksums
abce2ca86a71b00e8b46f65f8a8a68954dfa8fa38e9f7f0216506d89cf9967d0
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 Nov 5, 2026.

Transparency log

Release files / deltalite-0.1.16-cp312-abi3-manylinux_2_28_aarch64.whl

Download URL deltalite-0.1.16-cp312-abi3-manylinux_2_28_aarch64.whl
Size 66.5 MB
Tags CPython 3.12 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
3e0ba889e093f486a5f826ffbe582a98af19382887fb687eb9c04e19e08e5ba4
BLAKE2b-256 checksum
How to use checksums
4817644345e5082f0535b94675b3e4b9355f369228217465167b504982c707ac
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 Nov 5, 2026.

Transparency log

Release files / deltalite-0.1.16-cp312-abi3-macosx_11_0_arm64.whl

Download URL deltalite-0.1.16-cp312-abi3-macosx_11_0_arm64.whl
Size 18.7 MB
Tags CPython 3.12 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
681b22ce4b05234c6e7140b714c53912205f7f12f6936138f1cfef730ee16b66
BLAKE2b-256 checksum
How to use checksums
f169303c2a7b5f1556c7c77d90e3fce029b00ec30b44cb677adc4a97540820ee
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 Nov 5, 2026.

Transparency log

Release files / deltalite-0.1.16-cp312-abi3-macosx_10_12_x86_64.whl

Download URL deltalite-0.1.16-cp312-abi3-macosx_10_12_x86_64.whl
Size 19.3 MB
Tags CPython 3.12 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
228846717f56d12d0a643a6fec41e89bf49741125a12c488d98e55c3f36bdb40
BLAKE2b-256 checksum
How to use checksums
1abee9967e1f1f65f0b7b2ac1fa618415ac8b9745dfb6db70904d2e607d96663
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 Nov 5, 2026.

Transparency log

Security for deltalite 0.1.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 7 files in this release have been uploaded with provenance metadata.

Select from 7 files

Attestation for deltalite-0.1.16.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

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.

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