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 ~= 25.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 24.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.26.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.26.1
File Size Uploaded Provenance
jollyjack-0.26.1.tar.gz 214.3 kB With provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for jollyjack 0.26.1
File
jollyjack-0.26.1-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details
jollyjack-0.26.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
jollyjack-0.26.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
jollyjack-0.26.1-cp314-cp314t-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 Details
jollyjack-0.26.1-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
jollyjack-0.26.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
jollyjack-0.26.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.24+ ARM64, Linux glibc 2.28+ ARM64 Details
jollyjack-0.26.1-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
jollyjack-0.26.1-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
jollyjack-0.26.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
jollyjack-0.26.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
jollyjack-0.26.1-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
jollyjack-0.26.1-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
jollyjack-0.26.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
jollyjack-0.26.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.24+ ARM64, Linux glibc 2.28+ ARM64 Details
jollyjack-0.26.1-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
jollyjack-0.26.1-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
jollyjack-0.26.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.24+ x86-64, Linux glibc 2.28+ x86-64 Details
jollyjack-0.26.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
jollyjack-0.26.1-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
jollyjack-0.26.1-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
jollyjack-0.26.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details
jollyjack-0.26.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ ARM64, Linux glibc 2.24+ ARM64 Details
jollyjack-0.26.1-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details

Total release size: 26.9 MB

Release files / jollyjack-0.26.1.tar.gz

Download URL jollyjack-0.26.1.tar.gz
Size 214.3 kB
Tags Source
SHA-256 checksum
How to use checksums
b59c7f24c40ea233c57a9e2702cb2194e437ce609402ed285a5fea428db8583a
BLAKE2b-256 checksum
How to use checksums
360a6bd67649f310b80cb332807bdd664cd6a453e223492bf49e009f3b9f969c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp314-cp314t-win_amd64.whl
Size 298.5 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
864218473268c4d31e4f2fc2ace746195717bffb7e4d0c4fe6e56facb3a8bf13
BLAKE2b-256 checksum
How to use checksums
a251aff5d4a691061050c5b3e61cf6ffb72692c26c3131863b1fa86d05d91edd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.0 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
a5b7f079730039b5f0a4848b868d4d37c8b7fee59490a5d2d7fc94c7cab95351
BLAKE2b-256 checksum
How to use checksums
583f429f81417d063ace54868106b17b2e041db527f188aea8526a92010dd915
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.0 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
542e474a8d53e527f8cb2a3425b8fdaca5bf6832e35220bba39949e297eb89af
BLAKE2b-256 checksum
How to use checksums
34b0381b77c3e391301c7b6c41b461d249180fd1d94db8bc40a42a3efac6b65f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp314-cp314t-macosx_11_0_arm64.whl
Size 117.3 kB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
cb8160b6cdf6a1ebff48344f1fd25e6876c25fafe8de9e5581c3f7ca1a6fe729
BLAKE2b-256 checksum
How to use checksums
ece48a8cb062bb869973c411325ff56b4dbf43f3a4409834d0f2dfd28a696591
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp314-cp314-win_amd64.whl
Size 295.7 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
5fef3502f6eaeeb94ae34480ee19037278fc74438bad39698ff9b6d601daf002
BLAKE2b-256 checksum
How to use checksums
390ccc684f8e78dae866ea96d97a5f288e5457a48734d54709eaf434308f749a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.0 MB
Tags CPython 3.14 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
3cec1efe54bd6bbcb374613334884e60811c8b423bd80f92564425a72a4f53fe
BLAKE2b-256 checksum
How to use checksums
61d9acac9fd7b6b6180ecd77a8e9f80c75f5e3ef0f6f02e2bf33845687bf5cec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.0 MB
Tags CPython 3.14 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
5a80b4b3b68075f886b26c9b84db83bac4d954925ebaf0fdacf8161ba0a45516
BLAKE2b-256 checksum
How to use checksums
ea884db86d77cf027cc50288a4adeaf61e7e2d630670f897a8ca3b39c0e6d008
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp314-cp314-macosx_11_0_arm64.whl
Size 111.1 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
26d4fe48066b3fc105f4f2101f32c43635016d79c74b9aa14582f2b38c0f69b2
BLAKE2b-256 checksum
How to use checksums
2d72ca52619691aac7db5a3a55c9cc6edbd8e7c20f20a5eed25370b2260a2e2e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp313-cp313-win_amd64.whl
Size 286.7 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
6ea3f8fbbe26a20bf4898809a5872443b0513774de2d1a3e5d652e8addd7d9d8
BLAKE2b-256 checksum
How to use checksums
ee7a73a48f775d19dcaecdbf4916289ab7adda9bf840a2895eac0e9157954acb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.0 MB
Tags CPython 3.13 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
dd7e2a159ced8fad734892b01ce1bf9e0ab3935cf253511193e9f0d725bc72bb
BLAKE2b-256 checksum
How to use checksums
4d56274332f434fad6b28a82cc575d0e343928dc91725565cc517484c53f4e6d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.0 MB
Tags CPython 3.13 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
6f16ddc71ed65efe26906396242dde80440f42d40d03047c6f10fde1ec7eca1a
BLAKE2b-256 checksum
How to use checksums
c9cc09f7ef9513b7001c6749e689c4665c6282cea4bc2efba69877a46d257813
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp313-cp313-macosx_11_0_arm64.whl
Size 110.9 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
24e37ddf3e50a2538153c69df11c3e0adc8cfef3b5c6751eb1bf15da7acfda13
BLAKE2b-256 checksum
How to use checksums
ae323e0bededdfe38cb7a6400ad199f1a462be0a276ab392cb78a3ffba5a6f04
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp312-cp312-win_amd64.whl
Size 287.3 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
73d860d199796f04f1296753a554fcc137529b95363040f7cf0cb93da8954528
BLAKE2b-256 checksum
How to use checksums
130d67c297355afe392fcd0a0902a38dfa3a284121e46c89ed3ca4b08ed902a9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.1 MB
Tags CPython 3.12 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
972f037b7322a2cd0c5f6e0684ed581732817661f5fc22974fb420d1af3b9d20
BLAKE2b-256 checksum
How to use checksums
d223ecb8e809e56b71964ecbb74d62506612c24c949b05253a913f024df2cce3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.0 MB
Tags CPython 3.12 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
efae502b7211e8ea77ec7a2e1317088498ef7a88c67960143b3bedb413f37191
BLAKE2b-256 checksum
How to use checksums
ce9c1cd1055e6b48fe85f526d04ccba17064650f6adcbb5570aee082045d1842
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp312-cp312-macosx_11_0_arm64.whl
Size 111.3 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e3b34bd469526cdab68436bea04afaa5005194734cc3d3d83bddb5c5b6ab9a68
BLAKE2b-256 checksum
How to use checksums
a09f7605a30becd816a26407b39b3ebad8e5b88b42aca20ce6f14c8b5d0249c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp311-cp311-win_amd64.whl
Size 286.6 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
6dbf8948ca3a7338ebab87967eb7298e422678217c68ef70748986d6aabca071
BLAKE2b-256 checksum
How to use checksums
f0c82a28dde19a8b7e3d5005fed59d050620355069524e29e1dd1f3125db44d0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.1 MB
Tags CPython 3.11 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
6bc9c54990a01d106a7ec951a15366e1d87725d424e198ec5a532b329b69d968
BLAKE2b-256 checksum
How to use checksums
ef9cb15d867d5925a2c257af7497ea625d4e23a5a337b5abad10b019b84b6c3d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.0 MB
Tags CPython 3.11 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
99f807a3d7ec499c3c7b2c0556bbe534fc5311ce09313cb268db4413694a8be3
BLAKE2b-256 checksum
How to use checksums
9ec0d292e917b5d66ab20561e4d875470b1f5184f87be05caa27d1e749a88b38
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

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

Download URL jollyjack-0.26.1-cp311-cp311-macosx_11_0_arm64.whl
Size 111.0 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a8c1d169ddd1daf1fdbf94487a0b99342bf4891f17c4da17ac59b8a62f2a4b49
BLAKE2b-256 checksum
How to use checksums
fda0f61a37b876ebdc389b59c0a49db206816e7dac5f79eff86c28bab5271272
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / jollyjack-0.26.1-cp310-cp310-win_amd64.whl

Download URL jollyjack-0.26.1-cp310-cp310-win_amd64.whl
Size 286.7 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
65864b7c6724fd6be5f08f6400607fd5d7c02596fd5f0bc65cd4c4b2d549f38b
BLAKE2b-256 checksum
How to use checksums
37e088b8117f7a44364b708d43f9cb5e348cc6a7fcb11ab64e0e95896f2f55f0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / jollyjack-0.26.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL jollyjack-0.26.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 2.0 MB
Tags CPython 3.10 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
bba2a5111654e5fb135f6aadba55e1d04c4d7019e95fc3b41fb8b1148288aba8
BLAKE2b-256 checksum
How to use checksums
ceef0142ccd485405ad18ecfd51467a3d0aafc2621cc350082cc1127e41138a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / jollyjack-0.26.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

Download URL jollyjack-0.26.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 2.0 MB
Tags CPython 3.10 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
b182cfa46574fcaf24ade7282ceb21bde3d78ec164b8b28dda151b48908eaafc
BLAKE2b-256 checksum
How to use checksums
1a0e36eaee189efc8a538a042bb220af803fe998b481df01d2519dc078963562
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / jollyjack-0.26.1-cp310-cp310-macosx_11_0_arm64.whl

Download URL jollyjack-0.26.1-cp310-cp310-macosx_11_0_arm64.whl
Size 111.7 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1a8205c666633551fce4bd94038eabed0b5779dd9a7dd3f76c5aa5ea4a57169f
BLAKE2b-256 checksum
How to use checksums
f5d5edeffe65fe5e80bbbf6f767d01ac2b24a6802fa765e8fb10fc8aa0d01803
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

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

PyPI Publish Attestation

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

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Security for jollyjack 0.26.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 25 files in this release have been uploaded with provenance metadata.

Select from 25 files

Attestation for jollyjack-0.26.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 Oct 22, 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.

Release history Release notifications | RSS feed

This release

0.26.1 This release

25 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