Skip to main content

JollyJack

JollyJack is a high-performance Parquet reader designed to load data directly into NumPy arrays and PyTorch tensors with minimal overhead.

Features

  • Load Parquet straight into NumPy arrays or PyTorch tensors (fp16, fp32, fp64, int32, int64)
  • Up to 6× faster and with lower memory use than vanilla PyArrow
  • Compatibility with PalletJack
  • Optional io_uring + O_DIRECT backend for I/O-bound workloads

Known limitations

  • Data must not contain null values
  • Destination NumPy arrays and PyTorch tensors must be column-major (Fortran-style)

Selecting a reader backend

By default, the reader uses the regular file API via parquet::ParquetFileReader. In most cases, this is the recommended choice.

An alternative reader backend based on io_uring is also available. It may provide better performance for some workloads, particularly when used together with O_DIRECT.

To enable the alternative backend, set the JJ_READER_BACKEND environment variable to one of the following values:

  • io_uring - Uses io_uring for async I/O with the page cache
  • io_uring_odirect - Uses io_uring with O_DIRECT (bypasses the page cache)

Performance tuning tips

JollyJack performance is primarily determined by I/O, threading, and memory allocation behavior. The optimal configuration depends on whether your workload is I/O-bound or memory-/CPU-bound.

Threading strategy

  • JollyJack can be safely called concurrently from multiple threads.
  • Parallel reads usually improve throughput, but oversubscribing threads can cause contention and degrade performance.

Reuse destination arrays

  • Reusing NumPy arrays or PyTorch tensors avoids repeated memory allocation.
  • While allocation itself is fast, it can trigger kernel contention and degrade performance.

Large datasets (exceeding filesystem cache)

For datasets larger than the available page cache, performance is typically I/O-bound. Enabling either pre_buffer=True or prefetch_page_cache=True brings throughput close to the raw I/O ceiling, but prefetch_page_cache avoids the increased LLC miss rate caused by pre_buffer (see Page cache prefetching below).

Recommended configuration:

  • use_threads = True, prefetch_page_cache = True, pre_buffer = False, with the default reader backend.

Small datasets (fitting in filesystem cache)

For datasets that comfortably fit in RAM, performance is typically CPU- or memory-bound. Using pre_buffer is not recommended because it leads to an increased LLC miss rate and suboptimal performance (see Page cache prefetching below).

Recommended configuration:

  • use_threads = True, prefetch_page_cache = True, pre_buffer = False, with the default reader backend.

Page cache prefetching with prefetch_page_cache

The prefetch_page_cache option calls posix_fadvise(POSIX_FADV_WILLNEED) to tell the kernel to start loading the relevant byte ranges into the page cache. Each worker thread then reads directly via pread into its own locally-allocated buffer, keeping data hot in its local CPU caches.

This avoids the LLC (Last Level Cache) miss problem with pre_buffer=True, where Arrow's IO thread pool fills temporary buffers on one core and worker threads on different cores later consume cold data.

This is only useful for local or network-mounted file systems that have a page cache. Remote file systems such as S3 will not benefit from this.

The Linux kernel's force_page_cache_ra caps the number of pages read per posix_fadvise call to the block device's readahead window. Any bytes beyond this cap are silently ignored. The readahead window is typically 128 KB or higher. Check the value for your device:

cat /sys/block/<device>/queue/read_ahead_kb

If range_size_limit exceeds this value, most of each coalesced range will not be prefetched. Set range_size_limit to match or stay below the device's read_ahead_kb:

cache_options = pa.CacheOptions(
    hole_size_limit=8192,
    range_size_limit=128*1024,  # must not exceed read_ahead_kb
    lazy=False,
)

There are two ways to enable page cache prefetching:

As a parameter on read_into_numpy:

jj.read_into_numpy(
    source=path,
    metadata=pr.metadata,
    np_array=np_array,
    row_group_indices=range(pr.metadata.num_row_groups),
    column_indices=range(pr.metadata.num_columns),
    prefetch_page_cache=True,
    cache_options=cache_options,
)

As a standalone call:

jj.prefetch_page_cache(
    source=path,
    metadata=pr.metadata,
    row_group_indices=range(pr.metadata.num_row_groups),
    column_indices=range(pr.metadata.num_columns),
    cache_options=cache_options,
)

The standalone call is useful for sliding-window prefetching, where you prefetch the next files while processing the current one:

# Prime the pump
for path in file_paths[:PREFETCH_DEPTH]:
    jj.prefetch_page_cache(source=path, ...)

# Main loop
for i, path in enumerate(file_paths):
    # Slide the window
    ahead_index = i + PREFETCH_DEPTH
    if ahead_index < len(file_paths):
        jj.prefetch_page_cache(source=file_paths[ahead_index], ...)

    # Page cache should already be warm
    jj.read_into_numpy(source=path, np_array=np_array, ...)

    process(np_array)

Column ordering and use_threads:

When using prefetch_page_cache, the order in which columns are read matters. Sorting column_indices by source column index produces a sequential I/O pattern, which can significantly improve throughput. The effect depends on the storage device and kernel readahead settings. Use a dict to preserve the original target mapping:

# column_indices_to_read is an unsorted list, e.g. [5, 2, 8]
# Sort by source column index, preserving the original target mapping.
col_indices = {
    src: dst
    for src, dst in sorted(
        zip(column_indices_to_read, range(len(column_indices_to_read)))
    )
}
# Result: {2: 1, 5: 0, 8: 2} — reads columns in file order,
# writes each to the same target column as the unsorted list.

For similar reasons, avoid setting use_threads=True with prefetch_page_cache. Arrow's internal thread pool dispatches column reads across cores in an unpredictable order, breaking the sequential I/O pattern that makes prefetching effective. Use multiple worker threads at the application level instead, each reading its own file or row group with use_threads=False.

Pre-buffering and cache_options

If you use pre_buffer=True instead of prefetch_page_cache, the following tuning applies.

When pre_buffer=True, Arrow merges nearby column ranges and reads them into temporary buffers. The default maximum merged range is 32 MB (range_size_limit).

Arrow supports several memory allocators (mimalloc, jemalloc, system). With mimalloc (the default on most platforms), allocations above ~16 MB go straight to the OS (mmap/munmap) instead of the internal arena. This means the memory cannot be reused between calls, and each call pays the cost of mapping and zeroing fresh pages. Other allocators may behave similarly.

To avoid this, lower range_size_limit so that merged ranges fit inside the allocator's arena:

cache_options = pa.CacheOptions(
    hole_size_limit=8192,           # default
    range_size_limit=16*1024*1024,  # 16 MB, fits in mimalloc arena
    lazy=False,
)
jj.read_into_numpy(
    source=path,
    metadata=None,
    np_array=np_array,
    row_group_indices=[0],
    column_indices=range(n_columns),
    pre_buffer=True,
    cache_options=cache_options,
)

To debug allocator issues with mimalloc, run with MIMALLOC_SHOW_STATS=1 and MIMALLOC_VERBOSE=1. This prints allocation statistics at process exit.

Pre-buffering and ARROW_IO_THREADS

When pre_buffer=True, Arrow dispatches reads to its IO thread pool, configured via the ARROW_IO_THREADS environment variable (default: 8). Tuning this value may improve performance.

Requirements

  • pyarrow ~= 26.0.0

JollyJack builds on top of PyArrow. While the source package may work with newer versions, the prebuilt binary wheels are built and tested against pyarrow 26.x.

Installation

pip install jollyjack

How to use

Generating a sample Parquet file

import jollyjack as jj
import pyarrow.parquet as pq
import pyarrow as pa
import numpy as np

from pyarrow import fs

chunk_size = 3
n_row_groups = 2
n_columns = 5
n_rows = n_row_groups * chunk_size
path = "my.parquet"

data = np.random.rand(n_rows, n_columns).astype(np.float32)
pa_arrays = [pa.array(data[:, i]) for i in range(n_columns)]
schema = pa.schema([(f"column_{i}", pa.float32()) for i in range(n_columns)])
table = pa.Table.from_arrays(pa_arrays, schema=schema)
pq.write_table(
    table,
    path,
    row_group_size=chunk_size,
    use_dictionary=False,
    write_statistics=True,
    store_schema=False,
    write_page_index=True,
)

Generating a NumPy array to read into

# Create an array of zeros
np_array = np.zeros((n_rows, n_columns), dtype="f", order="F")

Reading an entire file into a NumPy array

pr = pq.ParquetReader()
pr.open(path)

row_begin = 0
row_end = 0

for rg in range(pr.metadata.num_row_groups):
    row_begin = row_end
    row_end = row_begin + pr.metadata.row_group(rg).num_rows

    # To define which subset of the NumPy array we want read into,
    # we need to create a view which shares underlying memory with the target NumPy array
    subset_view = np_array[row_begin:row_end, :]
    jj.read_into_numpy(
        source=path,
        metadata=pr.metadata,
        np_array=subset_view,
        row_group_indices=[rg],
        column_indices=range(pr.metadata.num_columns),
    )

# Alternatively
with fs.LocalFileSystem().open_input_file(path) as f:
    jj.read_into_numpy(
        source=f,
        metadata=None,
        np_array=np_array,
        row_group_indices=range(pr.metadata.num_row_groups),
        column_indices=range(pr.metadata.num_columns),
    )

Reading columns in reverse order

with fs.LocalFileSystem().open_input_file(path) as f:
    jj.read_into_numpy(
        source=f,
        metadata=None,
        np_array=np_array,
        row_group_indices=range(pr.metadata.num_row_groups),
        column_indices={
            i: pr.metadata.num_columns - i - 1 for i in range(pr.metadata.num_columns)
        },
    )

Reading column 3 into multiple destination columns

with fs.LocalFileSystem().open_input_file(path) as f:
    jj.read_into_numpy(
        source=f,
        metadata=None,
        np_array=np_array,
        row_group_indices=range(pr.metadata.num_row_groups),
        column_indices=((3, 0), (3, 1)),
    )

Sparse reading

np_array = np.zeros((n_rows, n_columns), dtype="f", order="F")
with fs.LocalFileSystem().open_input_file(path) as f:
    jj.read_into_numpy(
        source=f,
        metadata=None,
        np_array=np_array,
        row_group_indices=[0],
        row_ranges=[slice(0, 1), slice(4, 6)],
        column_indices=range(pr.metadata.num_columns),
    )
print(np_array)

Using cache options

np_array = np.zeros((n_rows, n_columns), dtype="f", order="F")
cache_options = pa.CacheOptions(
    hole_size_limit=8192,           # default
    range_size_limit=16*1024*1024,  # 16 MB, fits in mimalloc arena
    lazy=False,
)
with fs.LocalFileSystem().open_input_file(path) as f:
    jj.read_into_numpy(
        source=f,
        metadata=None,
        np_array=np_array,
        row_group_indices=[0],
        row_ranges=[slice(0, 1), slice(4, 6)],
        column_indices=range(pr.metadata.num_columns),
        cache_options=cache_options,
        pre_buffer=True,
    )
print(np_array)

Using page cache prefetching

np_array = np.zeros((n_rows, n_columns), dtype="f", order="F")
pr = pq.ParquetReader()
pr.open(path)

# cache_options controls which byte ranges are prefetched into the page cache.
# range_size_limit should not exceed the device's read_ahead_kb,
# because the kernel silently ignores readahead beyond that cap.
cache_options = pa.CacheOptions(
    hole_size_limit=8192,
    range_size_limit=128*1024,  # must not exceed read_ahead_kb
    lazy=False,
)

# Prefetch and read in one call
jj.read_into_numpy(
    source=path,
    metadata=pr.metadata,
    np_array=np_array,
    row_group_indices=range(pr.metadata.num_row_groups),
    column_indices=range(pr.metadata.num_columns),
    cache_options=cache_options,
    prefetch_page_cache=True,
)

# Or prefetch separately, then read
jj.prefetch_page_cache(
    source=path,
    metadata=pr.metadata,
    row_group_indices=range(pr.metadata.num_row_groups),
    column_indices=range(pr.metadata.num_columns),
    cache_options=cache_options,
)
jj.read_into_numpy(
    source=path,
    metadata=pr.metadata,
    np_array=np_array,
    row_group_indices=range(pr.metadata.num_row_groups),
    column_indices=range(pr.metadata.num_columns),
    pre_buffer=False,
)

Generating a PyTorch tensor to read into

import torch

# Create a tensor and transpose it to get Fortran-style order
tensor = torch.zeros(n_columns, n_rows, dtype=torch.float32).transpose(0, 1)

Reading an entire file into a PyTorch tensor

pr = pq.ParquetReader()
pr.open(path)

jj.read_into_torch(
    source=path,
    metadata=pr.metadata,
    tensor=tensor,
    row_group_indices=range(pr.metadata.num_row_groups),
    column_indices=range(pr.metadata.num_columns),
    pre_buffer=True,
    use_threads=True,
)

print(tensor)

Metadata

Release files for jollyjack 0.28.1

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

Source distribution (sdist)

Source distribution for jollyjack 0.28.1
File Size Uploaded Provenance Actions
jollyjack-0.28.1.tar.gz 347.5 kB With provenance Details for jollyjack-0.28.1.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for jollyjack 0.28.1
File Actions
jollyjack-0.28.1-cp315-cp315t-win_amd64.whl CPython 3.15 CPython 3.15 free-threading Windows x86-64 Details for jollyjack-0.28.1-cp315-cp315t-win_amd64.whl
jollyjack-0.28.1-cp315-cp315t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.15 CPython 3.15 free-threading Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details for jollyjack-0.28.1-cp315-cp315t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
jollyjack-0.28.1-cp315-cp315t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl CPython 3.15 CPython 3.15 free-threading Linux glibc 2.24+ ARM64, Linux glibc 2.28+ ARM64 Details for jollyjack-0.28.1-cp315-cp315t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
jollyjack-0.28.1-cp315-cp315t-macosx_11_0_arm64.whl CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64 Details for jollyjack-0.28.1-cp315-cp315t-macosx_11_0_arm64.whl
jollyjack-0.28.1-cp315-cp315-win_amd64.whl CPython 3.15 CPython 3.15 Windows x86-64 Details for jollyjack-0.28.1-cp315-cp315-win_amd64.whl
jollyjack-0.28.1-cp315-cp315-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.15 CPython 3.15 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details for jollyjack-0.28.1-cp315-cp315-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
jollyjack-0.28.1-cp315-cp315-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl CPython 3.15 CPython 3.15 Linux glibc 2.24+ ARM64, Linux glibc 2.28+ ARM64 Details for jollyjack-0.28.1-cp315-cp315-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
jollyjack-0.28.1-cp315-cp315-macosx_11_0_arm64.whl CPython 3.15 CPython 3.15 macOS 11.0+ ARM64 Details for jollyjack-0.28.1-cp315-cp315-macosx_11_0_arm64.whl
jollyjack-0.28.1-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details for jollyjack-0.28.1-cp314-cp314t-win_amd64.whl
jollyjack-0.28.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details for jollyjack-0.28.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
jollyjack-0.28.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.24+ ARM64, Linux glibc 2.28+ ARM64 Details for jollyjack-0.28.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
jollyjack-0.28.1-cp314-cp314t-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 Details for jollyjack-0.28.1-cp314-cp314t-macosx_11_0_arm64.whl
jollyjack-0.28.1-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details for jollyjack-0.28.1-cp314-cp314-win_amd64.whl
jollyjack-0.28.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details for jollyjack-0.28.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
jollyjack-0.28.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ ARM64, Linux glibc 2.24+ ARM64 Details for jollyjack-0.28.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
jollyjack-0.28.1-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details for jollyjack-0.28.1-cp314-cp314-macosx_11_0_arm64.whl
jollyjack-0.28.1-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details for jollyjack-0.28.1-cp313-cp313-win_amd64.whl
jollyjack-0.28.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details for jollyjack-0.28.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
jollyjack-0.28.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.24+ ARM64, Linux glibc 2.28+ ARM64 Details for jollyjack-0.28.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
jollyjack-0.28.1-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details for jollyjack-0.28.1-cp313-cp313-macosx_11_0_arm64.whl
jollyjack-0.28.1-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details for jollyjack-0.28.1-cp312-cp312-win_amd64.whl
jollyjack-0.28.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details for jollyjack-0.28.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
jollyjack-0.28.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ ARM64, Linux glibc 2.24+ ARM64 Details for jollyjack-0.28.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
jollyjack-0.28.1-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details for jollyjack-0.28.1-cp312-cp312-macosx_11_0_arm64.whl
jollyjack-0.28.1-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details for jollyjack-0.28.1-cp311-cp311-win_amd64.whl
jollyjack-0.28.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details for jollyjack-0.28.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
jollyjack-0.28.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.24+ ARM64, Linux glibc 2.28+ ARM64 Details for jollyjack-0.28.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
jollyjack-0.28.1-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details for jollyjack-0.28.1-cp311-cp311-macosx_11_0_arm64.whl

Total release size: 41.2 MB

Release files / jollyjack-0.28.1.tar.gz

Download URL jollyjack-0.28.1.tar.gz
Size 347.5 kB
Tags Source
SHA-256 checksum
How to use checksums
b26d5d09cd1e221cc57cd90b4e2b3e6e9c0d9163c215418e1028728d1edf294d
BLAKE2b-256 checksum
How to use checksums
856d3a8da041c868c3aa048afd425501515c0e78e1c1b2fcb2321feed93bb86c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp315-cp315t-win_amd64.whl

Download URL jollyjack-0.28.1-cp315-cp315t-win_amd64.whl
Size 373.3 kB
Tags CPython 3.15 CPython 3.15 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
20bb3c3748f7450ab8975e21e1ed6ef0da11b09f486f16594845b755cdf94cb2
BLAKE2b-256 checksum
How to use checksums
31538f6a067cfd2914c6d6c6aec3ac5bf57d16367fc9210bacd0760718e0325c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp315-cp315t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL jollyjack-0.28.1-cp315-cp315t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.7 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
8dcbf84f3387646ea3cb3ed3a5c2d8f23c78da07c91ad0097a00af9196872976
BLAKE2b-256 checksum
How to use checksums
848f0bc0aafc5659a3cd5d8c515f2c7a8fd55a591b999bcdc1d87de3e077225f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp315-cp315t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

Download URL jollyjack-0.28.1-cp315-cp315t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.6 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
35b3faba1c95ef97e24193a894e20157d0e24f2ecb2f4854e88ffed06e3d4ac1
BLAKE2b-256 checksum
How to use checksums
f6a69177d6af9026cf2c6e7366024da399d693e60d25ea5eaf6477e02c4466cd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp315-cp315t-macosx_11_0_arm64.whl

Download URL jollyjack-0.28.1-cp315-cp315t-macosx_11_0_arm64.whl
Size 199.2 kB
Tags CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
7a8dcd8c71697800ae5b0de97871fb53b2cbc96cfcbfb8e332665c35a4b5a345
BLAKE2b-256 checksum
How to use checksums
5ab5f44d4f77e4eeddd3740b767f4db0e520f387fdbc0a646b71c1f9ea471360
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp315-cp315-win_amd64.whl

Download URL jollyjack-0.28.1-cp315-cp315-win_amd64.whl
Size 367.2 kB
Tags CPython 3.15 Windows x86-64
SHA-256 checksum
How to use checksums
cfa9866667762f8c504ee60ad8e20e833b1489cdf6f4c1a836454627df4b2c03
BLAKE2b-256 checksum
How to use checksums
24660db5fbefd0eaa8c59214ed013c8076ed25b670db1df154a77eff1ae68e08
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp315-cp315-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL jollyjack-0.28.1-cp315-cp315-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.7 MB
Tags CPython 3.15 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
d17397cf32c969a23f4b42806e4290db103e2f688ac801afdda694e875fcf073
BLAKE2b-256 checksum
How to use checksums
486c249a5ca4cf97540e2eaa0cb733a4475c13e51eccb32fd1f84f42ee44df08
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp315-cp315-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

Download URL jollyjack-0.28.1-cp315-cp315-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.6 MB
Tags CPython 3.15 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
b5f7be0c2a0037e60e4a42a00a0c8dd1b6cb4f676372faea56d6822b37c16ce2
BLAKE2b-256 checksum
How to use checksums
5d42013772fd0220fadb30b522d5684ab843eb679ad4fe896e47c98e4a8f73e9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp315-cp315-macosx_11_0_arm64.whl

Download URL jollyjack-0.28.1-cp315-cp315-macosx_11_0_arm64.whl
Size 191.3 kB
Tags CPython 3.15 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
2de1b5ecb183da4a53218e59b7bff0391fbe63ebbf0f02d9846a6f1781a08f66
BLAKE2b-256 checksum
How to use checksums
e7cc9a77a5c3e3d34e3cb98c8b31a4357ba0c9b3df0ccbde1ecb560b22da0001
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp314-cp314t-win_amd64.whl

Download URL jollyjack-0.28.1-cp314-cp314t-win_amd64.whl
Size 374.2 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
b928699aa66c872a87c10cc4b70ba0f11e1363b158fb2af322a5977af65d48d5
BLAKE2b-256 checksum
How to use checksums
5e351b74b1aa03c2f86fcab77c958505096ef3d54b31e63b7faa6ad470327bd0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL jollyjack-0.28.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.7 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
927279bbab1be97aa6f3039ec978c1499a4c21c35b866b90797857059fb160d3
BLAKE2b-256 checksum
How to use checksums
69d3066a86d8c7bb54882324e9cda23fe4d4610ca60e4de4bf6e6f09420a5dc1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

Download URL jollyjack-0.28.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.6 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
04b4f504a9ed10bc9c6b15dc43ec5c025433b4cc1023f6ae8d36519f9cb3c01d
BLAKE2b-256 checksum
How to use checksums
f5bf07b7e395663108da664f6a0501e6abcccdeea7dbdc8b8773264a8008b480
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp314-cp314t-macosx_11_0_arm64.whl

Download URL jollyjack-0.28.1-cp314-cp314t-macosx_11_0_arm64.whl
Size 200.1 kB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
4d61178b352c2c26688dd40934e77c09f1b0871e963ab444657431f4ca64b878
BLAKE2b-256 checksum
How to use checksums
c754c4ef2a5699012ea1d9413eda8c597b7dd13fe80d987e83c5900676fd0c6c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp314-cp314-win_amd64.whl

Download URL jollyjack-0.28.1-cp314-cp314-win_amd64.whl
Size 367.5 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
ed1e2b36a5fcc891cf956268f17ae8bc88c8fd35e522d997a420f3666c61efef
BLAKE2b-256 checksum
How to use checksums
e7e57fd3c29378fe82034d95fc5810f5d18f526ab2a18f70ac3c1815b507b6df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL jollyjack-0.28.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.7 MB
Tags CPython 3.14 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
9f2912cefe4c196b3d6d6d1b01c068d493758233216e81412d07e8996adc3e82
BLAKE2b-256 checksum
How to use checksums
03a00c4d30edec0cd806107be3145d28e5748b5641b77d63e8f38bd0111374b0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

Download URL jollyjack-0.28.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.6 MB
Tags CPython 3.14 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
3fb3ad1c28e4c3702175d1cca1ac2e499de279947e5ed8f987cadf4fbb1af6c6
BLAKE2b-256 checksum
How to use checksums
7426e57cc42225d3a85d8d3ce6a28d471f48083524ed23880466f766751d9629
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp314-cp314-macosx_11_0_arm64.whl

Download URL jollyjack-0.28.1-cp314-cp314-macosx_11_0_arm64.whl
Size 191.7 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
53d351b281e0b6bb1135830783703b96c5a1172ce7156f4ea24216916dd34670
BLAKE2b-256 checksum
How to use checksums
f45dcfcb7e2b939b3c18cd290f758388174bee46a4c88db3ea94f19fbfac6eca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp313-cp313-win_amd64.whl

Download URL jollyjack-0.28.1-cp313-cp313-win_amd64.whl
Size 356.0 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
4fb6fe3969bd3a410dd61004f3421a9188002f69980b024f7c84abd2be281cb0
BLAKE2b-256 checksum
How to use checksums
8ddad99fd38cb3d2db1e3feba9426652c7753c460b83903c96c153dc735175ed
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL jollyjack-0.28.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.7 MB
Tags CPython 3.13 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
62cb97d77b5974c54db9516f833e0928b3878f6ad39db64505175fc93063a48d
BLAKE2b-256 checksum
How to use checksums
2ab78c21a24224bf21c7da189b9c2bc1e55b6fc4ab7d08a1110e52f373877a71
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

Download URL jollyjack-0.28.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.6 MB
Tags CPython 3.13 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
fddf51f4d1c39ef804461fe7efb18e3b1ea8ee16ce432fcdcb7983e6e003c6b2
BLAKE2b-256 checksum
How to use checksums
098fe8782fdcf5df0b74f758624d5aeb33bf1f82c7a733d4ee59000680dfe791
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp313-cp313-macosx_11_0_arm64.whl

Download URL jollyjack-0.28.1-cp313-cp313-macosx_11_0_arm64.whl
Size 190.4 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
86c6118229565eea5dacb26999c530ea34dd9768fd31fca6c60571ecdcab8e6c
BLAKE2b-256 checksum
How to use checksums
057b0abe2609ba99e5e7dd555641923bb3afab5203340b484c43cd3f3e712d7e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp312-cp312-win_amd64.whl

Download URL jollyjack-0.28.1-cp312-cp312-win_amd64.whl
Size 356.4 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
e6b8292425191531d0e803c6dea9ce65346c1cf701f117acd8b7463cea791fee
BLAKE2b-256 checksum
How to use checksums
7388bedb5e2a73c9925201272bf714868c5ca6e6a8d9899a49deaba0b8c87bbf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL jollyjack-0.28.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.7 MB
Tags CPython 3.12 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
f9fc82b5dc44da0d9f65cce8d4eafc677dfe02df274127e35897e7f5a174c875
BLAKE2b-256 checksum
How to use checksums
5ad37e3ce3a97d46532d9eb78d0d37b9a3aa6b19aa5181f52a0e572f13198703
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

Download URL jollyjack-0.28.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.6 MB
Tags CPython 3.12 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
5b5646fca4ab6ec9c85fa2edb0a154c12265dbf65c22e51e348050b318cccd61
BLAKE2b-256 checksum
How to use checksums
c9bd750dc5713e06d76e2b8b835d1f8f61432646cb067ba4a472bbfd588b83c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp312-cp312-macosx_11_0_arm64.whl

Download URL jollyjack-0.28.1-cp312-cp312-macosx_11_0_arm64.whl
Size 190.8 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
df3ca2f4338a8e657b09c45bac617c75913327238b1a953ae62da6a8e450dde6
BLAKE2b-256 checksum
How to use checksums
d0a848d7094e3bf3d9be3f8ad2d44dd7d32e12da31e83e8993be3ec16652a4de
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp311-cp311-win_amd64.whl

Download URL jollyjack-0.28.1-cp311-cp311-win_amd64.whl
Size 355.2 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
a9a1f5174481e8fcb9b01060d8e96e1cdc0fe012b03cd92afec192071820d712
BLAKE2b-256 checksum
How to use checksums
be63d6e837bc9f3163b70dfa86563a88e31c4702a94467672a00e72b06585502
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL jollyjack-0.28.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.7 MB
Tags CPython 3.11 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
a7e46862b1a5ac8181c0b6cacc3fd2f8a2abee2a4e28c35278896769f0f50f73
BLAKE2b-256 checksum
How to use checksums
6f3a507d0f5023fbaab0607e8d12db13e779821336410b0afcebedb1d1991795
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

Download URL jollyjack-0.28.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.6 MB
Tags CPython 3.11 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
db7f769f429550f760c8a42f52f7f7a151e9344ebc62e6f85966b3e6505cf64d
BLAKE2b-256 checksum
How to use checksums
db99392aef413dc490d60db26a3a20d4de4b030236dc1fbaf033fbdce7065133
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Release files / jollyjack-0.28.1-cp311-cp311-macosx_11_0_arm64.whl

Download URL jollyjack-0.28.1-cp311-cp311-macosx_11_0_arm64.whl
Size 190.0 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ad93a0e0c1e90345b240323d78091152c45e96fe264b7950b3b69e767ba56f78
BLAKE2b-256 checksum
How to use checksums
2aeae18a19c837149f272d55b8d0dbd416a15eb57b90cfa7d180bd2b7867390b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.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.

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 8, 2026.

Transparency log

Security for jollyjack 0.28.1

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 29 files in this release have been uploaded with provenance metadata.

Select from 29 files

Attestation for jollyjack-0.28.1.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 8, 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.

Release history Release notifications | RSS feed

This release

0.28.1 This release

29 release files Full 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