pylibjxl
Fast Python bindings for JPEG XL (libjxl) and JPEG (libjpeg-turbo)
pylibjxl provides efficient, high-performance Python bindings for libjxl and libjpeg-turbo. Built with nanobind, it features GIL-free encoding/decoding and native async support for maximum throughput.
✨ Key Features
- 🚀 High Performance — C++ core releases the GIL during heavy computation for true multi-core scaling.
- 🔍 Ultra-Fast Probing — Extract JXL metadata (width, height, channels, bits) in < 0.05ms (~20μs) without decoding pixel buffers.
- 🖼️ Seamless Pillow Plugin — Transparent
register_pillow()with true lazy loading (probe), full EXIF/ICC preservation, and fast saving. - 🐍 Broad Python Compatibility — First-class support for Python 3.11, 3.12, 3.13, and Python 3.14.
- 📦 Metadata Excellence — Full support for EXIF, XMP, and JUMBF metadata, plus ICC color profile management.
- ⚡ Async-First & Backpressure — Native
asynciointegration with double-layer semaphore backpressure for web services. - 🎯 Elastic RunnerPool & Memory Pooling — Dynamic pool scaling, idle runner reaping, watermark buffer pooling, and timeout protection (
CodecTimeoutError). - 🖼️ NumPy Native & Zero-Copy — In-place decode (
out=array) and Buffer Protocol support for zero memory allocation. - 🔄 Lossless JPEG Transcoding — Bit-perfect JPEG ↔ JXL roundtrips without pixel decoding.
🛠️ Installation
Install from PyPI
# Recommended: Using uv
uv pip install pylibjxl
# Or via standard pip
pip install pylibjxl
Install from Source
uv pip install git+https://github.com/twn39/pylibjxl.git --recursive
Quick Start
🖼️ Basic In-Memory Operations
import numpy as np
import pylibjxl
# Create a test image (Height, Width, Channels)
image = np.random.randint(0, 256, (512, 512, 3), dtype=np.uint8)
# Encode to JXL bytes
data = pylibjxl.encode(image, effort=7, distance=1.0)
# Decode back to NumPy array
decoded = pylibjxl.decode(data)
💾 File I/O & Metadata
pylibjxl handles EXIF and XMP metadata seamlessly.
# Write an image with EXIF metadata
exif_data = b"Raw EXIF bytes..."
pylibjxl.write("output.jxl", image, effort=9, exif=exif_data)
# Read image and its metadata
img, meta = pylibjxl.read("output.jxl", metadata=True)
print(f"Loaded image shape: {img.shape}")
print(f"EXIF size: {len(meta.get('exif', b''))} bytes")
🔄 Lossless JPEG Transcoding
Reduce JPEG file size by ~20% without losing a single bit of information. The resulting .jxl can be restored to the exact original .jpg.
# Convert JPEG to JXL losslessly
pylibjxl.convert_jpeg_to_jxl("input.jpg", "input.jxl")
# Restore the bit-identical original JPEG
pylibjxl.convert_jxl_to_jpeg("input.jxl", "restored.jpg")
🔍 Ultra-Fast Header Probing (probe)
Extract JXL dimensions, channels, bit depth, and suggested threads in < 0.05ms (~20μs) without decoding pixel buffers or competing for worker threads in the runner pool:
# Probe raw bytes or memoryview
info = pylibjxl.probe(jxl_bytes)
print(info["width"], info["height"], info["channels"])
# Probe file directly (with optional zero-copy mmap)
info = pylibjxl.probe_file("image.jxl", use_mmap=True)
# Async variant for event loops
info = await pylibjxl.probe_async(jxl_bytes)
🖼️ Seamless Pillow Integration (register_pillow)
Seamlessly register pylibjxl as Pillow's official JXL codec engine. Enables standard Image.open() and im.save() with true lazy loading (via probe), full EXIF/ICC metadata preservation, and multi-core acceleration:
import pylibjxl
from PIL import Image
# Register transparently (idempotent, overrides legacy plugins by default)
pylibjxl.register_pillow()
# Open JXL image (dimensions read in ~20μs via probe, full decode deferred)
im = Image.open("photo.jxl")
print(im.size, im.mode, im.info.get("exif"), im.info.get("icc_profile"))
# Save as JXL with custom effort / quality / lossless parameters
im.save("output.jxl", effort=7, quality=90, lossless=False)
⚡ Async Support
High-performance non-blocking I/O for web servers and data pipelines.
import asyncio
async def main():
# Async encoding
data = await pylibjxl.encode_async(image, distance=0.0)
# Async file reading
img = await pylibjxl.read_async("input.jxl")
asyncio.run(main())
🏗️ Batch Processing (Context Manager)
Using the JXL context manager maintains a persistent thread pool, providing a significant speedup for batch operations.
# High-performance batch conversion
with pylibjxl.JXL(effort=7) as jxl:
for i in range(100):
img = jxl.read(f"input_{i}.jxl")
# Process and save as high-quality JPEG
jxl.write_jpeg(f"output_{i}.jpg", img, quality=95)
🚀 High-Concurrency Web Servers (FastAPI Example)
pylibjxl is engineered for high-concurrency production web servers and microservices. By combining double-layer backpressure with an elastic RunnerPool, it protects servers from memory exhaustion and CPU thrashing under traffic spikes.
from contextlib import asynccontextmanager
from fastapi import FastAPI, HTTPException, UploadFile, status
import pylibjxl
# Allocate an isolated codec with a pool of up to 8 runners and a 3.0s timeout
codec = pylibjxl.AsyncJXL(pool_size=8, timeout=3.0)
@asynccontextmanager
async def lifespan(app: FastAPI):
async with codec:
yield
app = FastAPI(title="Image Service", lifespan=lifespan)
@app.post("/encode")
async def encode_image(file: UploadFile):
content = await file.read()
try:
# Step 1: Decode JPEG (GIL released)
image = await codec.decode_jpeg_async(content)
# Step 2: Encode to JXL with per-operation timeout (e.g., 2.0s)
# If all 8 runners are busy and cannot be acquired within 2.0s,
# it raises CodecTimeoutError rather than queueing infinitely.
jxl_bytes = await codec.encode_async(image, effort=5, timeout=2.0)
return jxl_bytes
except pylibjxl.CodecTimeoutError:
# Gracefully handle server saturation
raise HTTPException(
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
detail="Image encoder is at maximum capacity; please retry shortly.",
)
🧠 Concurrency & Resource Management (Deep Dive)
1. The Concurrency Challenge in libjxl
In the official Google libjxl architecture, JxlResizableParallelRunner is stateful and not thread-safe. A single runner instance cannot be shared across multiple threads or concurrent requests simultaneously.
2. The Throughput Formula: $M \times N \le \text{Cores}$
To maximize hardware utilization without causing CPU cache thrashing or context-switch storms, pylibjxl organizes concurrency according to the rule:
$$\text{Active Runners } (M) \times \text{Threads Per Runner } (N) \le \text{Available CPU Cores}$$
pylibjxl provides optimal presets for different workloads:
| Workload Mode | Configuration | Characteristics | Best For |
|---|---|---|---|
| High-Concurrency Web Server (Default) | pool_size = Cores, threads = 1 |
Maximizes global QPS; requests execute in parallel without CPU starvation. | FastAPI, Django, Celery, Tornado |
| Low-Latency Single Image | pool_size = 1, threads = Cores |
Uses all cores to encode/decode a single image as fast as possible. | CLI tools, batch scripts, offline pipelines |
| Auto-Balanced | pool_size = 0, threads = 0 |
Automatically balances $M$ and $N$ based on detected CPU cores. | General production applications |
3. Elastic RunnerPool Lifecycle
- Zero Cold-Start Latency: Pre-allocates 1 warm runner upon creation so the first request incurs zero setup overhead.
- On-Demand Dynamic Expansion: Spawns additional runners only when concurrent load demands it, up to
max_pool_size. - Idle Reaping: Tracks timestamp activity and automatically deallocates idle runners beyond the baseline after
idle_timeout(default 30s), reclaiming system memory during traffic lulls.
4. Double-Layer Backpressure
In Python web frameworks, asynchronous task queues (e.g. asyncio.to_thread) are unbounded by default. Under a traffic surge, thousands of coroutines can flood the thread pool queue, causing out-of-memory crashes.
AsyncJXL solves this with Double-Layer Backpressure:
- Event Loop Layer (
asyncio.Semaphore): Restricts the maximum number of concurrent tasks entering the thread pool. Excess tasks wait on the event loop with boundedasyncio.wait_fortimeouts. - C++ Native Layer (
std::condition_variable): Boundedacquire(timeout)ensures OS threads never block indefinitely.
# Check real-time pool metrics
print(f"Total runners: {codec.total_runners}")
print(f"Available runners: {codec.available_runners}")
print(f"In-use runners: {codec.in_use_runners}")
5. Timeout Protection & CodecTimeoutError
Both sync and async operations accept a timeout argument in seconds. When the runner pool cannot satisfy an acquisition request within the specified time, it raises pylibjxl.CodecTimeoutError.
CodecTimeoutError inherits from Python's standard TimeoutError, allowing catch-all handling:
try:
data = await codec.encode_async(image, timeout=1.0)
except pylibjxl.CodecTimeoutError:
# Specific codec timeout
pass
except TimeoutError:
# Standard Python timeout handler catches it too
pass
📈 Performance & Stability
pylibjxl is engineered for high-throughput production environments.
🚀 pylibjxl vs. pillow-jxl Comparison
Tested on Apple Silicon (8-core), 1440x960 RGB image:
| Test Scenario | pillow-jxl (num_threads=-1) |
pylibjxl (Default threads=1) |
pylibjxl (Multi-thread threads=8) |
Comparison Result |
|---|---|---|---|---|
| JXL Decode Latency | 19.68 ms | 43.26 ms | 17.79 ms | pylibjxl is ~11% faster |
| JXL Encode (effort=7) | 139.00 ms | 321.00 ms | 117.00 ms | pylibjxl is ~19% faster |
| 8-Task Concurrent Throughput | Heavy context thrashing | 129.0 OPS | - | pylibjxl scales linearly |
📊 Multi-Core Concurrency Throughput Scaling
Evaluated with pytest-benchmark on Apple Silicon (1440x960 RGB image):
| Concurrent Tasks | Total Latency (Mean) | Total Throughput | Multi-Core Scaling |
|---|---|---|---|
| 1 Task | 25.75 ms | 38.8 tasks/sec | 1.00x |
| 2 Tasks | 29.04 ms | 68.9 tasks/sec | 1.77x |
| 4 Tasks | 33.51 ms | 119.4 tasks/sec | 3.07x |
| 8 Tasks | 62.02 ms | 129.0 tasks/sec | 3.32x |
🛠️ Key Architectural Advantages
- GIL-Free Execution: The C++ core releases Python's Global Interpreter Lock (GIL) during all heavy encoding and decoding tasks.
- Zero Memory Leaks: Verified over 500+ consecutive rounds with stable memory footprint.
- Zero-Copy Buffer Protocol:
decode(data, out=ndarray)writes directly into pre-allocated NumPy memory with zero intermediate allocations. - Event-Loop Purity: Array contiguity conversions (
np.ascontiguousarray) execute inside worker threads to ensure 0ms blocking on the main asyncio event loop.
📂 API Reference
🖼️ JXL In-Memory Operations
encode(input, effort=7, distance=1.0, lossless=False, decoding_speed=0, *, exif=None, xmp=None, jumbf=None) -> bytes
async encode_async(...) -> bytes
Encodes a NumPy array into JPEG XL format.
| Parameter | Type | Default | Description |
|---|---|---|---|
input |
ndarray |
required | uint8 array of shape (H, W, 3) or (H, W, 4) |
effort |
int |
7 |
Speed/size tradeoff [1-11]. 1=fastest, 11=best compression. |
distance |
float |
1.0 |
Perceptual quality [0.0-25.0]. 0.0=lossless, 1.0=visually lossless. |
lossless |
bool |
False |
If True, enables mathematical lossless mode. |
decoding_speed |
int |
0 |
Decoding speed tier [0-4]. 0=default, 4=fastest decoding. |
exif |
bytes |
None |
Optional raw EXIF metadata. |
xmp |
bytes |
None |
Optional raw XMP (XML) metadata. |
jumbf |
bytes |
None |
Optional raw JUMBF metadata. |
# Synchronous encoding
data = pylibjxl.encode(image, effort=9, lossless=True)
# Asynchronous encoding
data = await pylibjxl.encode_async(image, distance=0.5)
decode(data, *, metadata=False) -> ndarray | tuple[ndarray, dict]
async decode_async(...) -> ndarray | tuple[ndarray, dict]
Decodes JPEG XL bytes back into a NumPy array.
| Parameter | Type | Default | Description |
|---|---|---|---|
data |
bytes |
required | JPEG XL encoded bytes. |
metadata |
bool |
False |
If True, returns a tuple including a metadata dictionary. |
# Basic decode
img = pylibjxl.decode(jxl_bytes)
# Decode with metadata
img, meta = await pylibjxl.decode_async(jxl_bytes, metadata=True)
print(f"EXIF size: {len(meta.get('exif', b''))} bytes")
💾 JXL File I/O
read(path, *, metadata=False) / async read_async(...)
Reads a .jxl file from disk and decodes it.
| Parameter | Type | Default | Description |
|---|---|---|---|
path |
`str | Path` | required |
metadata |
bool |
False |
Whether to return metadata alongside the image. |
img = pylibjxl.read("input.jxl")
img, meta = await pylibjxl.read_async("input.jxl", metadata=True)
write(path, image, ...) / async write_async(...)
Encodes a NumPy array and writes it directly to a .jxl file.
| Parameter | Type | Default | Description |
|---|---|---|---|
path |
`str | Path` | required |
image |
ndarray |
required | The image data to encode. |
... |
Supports all parameters from encode(). |
pylibjxl.write("output.jxl", image, effort=7, distance=1.0)
await pylibjxl.write_async("output.jxl", image, lossless=True)
🔍 Ultra-Fast Image Probing
probe(data) -> dict / async probe_async(...) -> dict
Extracts image dimensions, channels, bit depth, and suggested threads in < 0.05ms (~20μs) without decoding pixel buffers or allocating runner threads.
| Parameter | Type | Default | Description |
|---|---|---|---|
data |
`bytes | Buffer` | required |
Returns a dictionary:
{
"width": 1920,
"height": 1080,
"channels": 3,
"has_alpha": False,
"bits_per_sample": 8,
"suggested_threads": 2,
}
probe_file(path, *, use_mmap=True) -> dict
Probes image metadata directly from a file path.
| Parameter | Type | Default | Description |
|---|---|---|---|
path |
`str | Path` | required |
use_mmap |
bool |
True |
Use zero-copy memory mapping for probe header reads. |
info = pylibjxl.probe_file("photo.jxl", use_mmap=True)
print(f"{info['width']}x{info['height']}, {info['channels']} channels")
📷 JPEG Support (libjpeg-turbo)
encode_jpeg(input, quality=95) -> bytes / async encode_jpeg_async(...)
Encodes a NumPy array to JPEG bytes using high-speed libjpeg-turbo.
| Parameter | Type | Default | Description |
|---|---|---|---|
input |
ndarray |
required | uint8 array of shape (H, W, 3). |
quality |
int |
95 |
JPEG quality factor [1-100]. |
jpeg_bytes = pylibjxl.encode_jpeg(image, quality=90)
decode_jpeg(data) -> ndarray / async decode_jpeg_async(...)
Decodes JPEG bytes to a NumPy RGB array.
| Parameter | Type | Default | Description |
|---|---|---|---|
data |
bytes |
required | JPEG encoded bytes. |
image = pylibjxl.decode_jpeg(jpeg_bytes)
read_jpeg(path) / write_jpeg(path, image, quality=95)
Stand-alone JPEG file I/O operations using libjpeg-turbo.
img = pylibjxl.read_jpeg("photo.jpg")
pylibjxl.write_jpeg("output.jpg", img, quality=85)
🔄 Lossless Transcoding (JPEG ↔ JXL)
jpeg_to_jxl(data, effort=7) -> bytes / async jpeg_to_jxl_async(...)
Transcodes raw JPEG bytes into a JPEG XL container losslessly.
| Parameter | Type | Default | Description |
|---|---|---|---|
data |
bytes |
required | Original JPEG bytes. |
effort |
int |
7 |
Transcoding effort [1-11]. |
jxl_data = pylibjxl.jpeg_to_jxl(jpeg_bytes)
jxl_to_jpeg(data) -> bytes / async jxl_to_jpeg_async(...)
Restores the original JPEG bytes from a transcoded JXL file.
| Parameter | Type | Default | Description |
|---|---|---|---|
data |
bytes |
required | Transcoded JPEG XL bytes. |
original_jpeg = pylibjxl.jxl_to_jpeg(jxl_data)
convert_jpeg_to_jxl(in_path, out_path) / convert_jxl_to_jpeg(...)
File-to-file versions of the above transcoding operations.
pylibjxl.convert_jpeg_to_jxl("input.jpg", "output.jxl")
pylibjxl.convert_jxl_to_jpeg("output.jxl", "restored.jpg")
🏗️ Context Managers
JXL(effort=7, distance=1.0, lossless=False, decoding_speed=0, threads=0, pool_size=0, timeout=None, idle_timeout=30.0)
AsyncJXL(...)
Synchronous and Asynchronous context managers maintaining a private, elastic RunnerPool with double-layer backpressure and idle reaping.
| Parameter | Type | Default | Description |
|---|---|---|---|
effort |
int |
7 |
Default encoding effort [1-11]. |
distance |
float |
1.0 |
Default perceptual distance [0.0-25.0]. |
lossless |
bool |
False |
Default lossless mode. |
decoding_speed |
int |
0 |
Default decoding speed tier [0-4]. |
threads |
int |
0 |
Threads per runner (0 = auto-detect). |
pool_size |
int |
0 |
Maximum concurrent runners in the pool (0 = auto-balanced so $M \times N \le \text{Cores}$). |
timeout |
`float | None` | None |
idle_timeout |
float |
30.0 |
Inactivity duration in seconds before idle runners beyond baseline are reaped. |
Read-Only Telemetry Properties
Both JXL and AsyncJXL expose real-time metrics for health checks and observability:
codec.pool_size(int): Maximum allowed runner instances.codec.total_runners(int): Total allocated runner instances currently in memory.codec.available_runners(int): Idle runners ready for immediate acquisition.codec.in_use_runners(int): Runners currently executing encoding/decoding tasks.codec.threads_per_runner(int): Number of internal worker threads per runner.
with pylibjxl.JXL(effort=7, pool_size=4, timeout=5.0) as jxl:
img = jxl.read("input.jxl")
jxl.write("output.jxl", img, distance=0.5)
print(f"Active runners: {jxl.in_use_runners}/{jxl.total_runners}")
🖼️ Pillow Plugin Integration
register_pillow(*, override=True)
Registers pylibjxl as the JPEG XL (.jxl) image format plugin for Pillow.
- True Lazy Loading:
Image.open()leveragesprobeto read dimensions instantly (< 0.05ms) without decoding pixel buffers until accessed. - Comprehensive Modes: Supports
RGB,RGBA,L(Grayscale),LA, and Palette (P) modes with automatic conversions. - Metadata Roundtrip: Preserves and restores EXIF (
im.info["exif"]) and ICC profiles (im.info["icc_profile"]). - Idempotent: Safe to call repeatedly;
override=Truereplaces any previously registered JXL handlers.
import pylibjxl
from PIL import Image
# Register plugin
pylibjxl.register_pillow()
# Standard Pillow operations
with Image.open("input.jxl") as im:
print(im.size, im.mode) # Lazy loaded, <0.05ms
im_thumb = im.resize((128, 128))
im_thumb.save("thumb.jxl", effort=7, quality=90)
ℹ️ System Information
| Function | Return Type | Description |
|---|---|---|
version() |
dict |
Returns library version (major, minor, patch). |
decoder_version() |
int |
Returns libjxl decoder version integer. |
encoder_version() |
int |
Returns libjxl encoder version integer. |
print(f"pylibjxl version: {pylibjxl.version()}")
📜 License
Metadata
Release files for pylibjxl 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pylibjxl-0.5.0.tar.gz | 59.3 MB | Details |
Built distributions (wheels)
Total release size: 104.2 MB
Release files / pylibjxl-0.5.0.tar.gz
| Download URL | pylibjxl-0.5.0.tar.gz |
|---|---|
| Size | 59.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3fea4e1a4b8fee307c4ce8c8be9f8ef14062d78baa85ee9137c234a9a2f89b79
|
|
BLAKE2b-256 checksum How to use checksums |
a2579720459f7b02f8aa02b6fccbe1ff50ad4f81cda7c9b1d6145d3508a35066
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp314-cp314-win_amd64.whl
| Download URL | pylibjxl-0.5.0-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 3.7 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
ad03376494466b61e2f4671b391188a6f0a39f076ebfccb298f400202003a686
|
|
BLAKE2b-256 checksum How to use checksums |
6e1e860e01b5a5002c694c25524fc7a789bb6015ddd7befb542ed5c5e740b4ef
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pylibjxl-0.5.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.9 MB |
| Tags | CPython 3.14 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
b66cdd04727bbd18128d91bf569b54c6216d4a4af84928f7562c384dfa4e2d57
|
|
BLAKE2b-256 checksum How to use checksums |
bf632e55d548d3ad270267677592ee06ca95dbace206e78c25706143b7b1377d
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp314-cp314-macosx_14_0_x86_64.whl
| Download URL | pylibjxl-0.5.0-cp314-cp314-macosx_14_0_x86_64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.14 macOS 14.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
6cd0e4664ccaa187b8c38dfb673fecb61d96d07463f451bcdf5a81511860a096
|
|
BLAKE2b-256 checksum How to use checksums |
f54e116577db82b9777c0f647706f676749756444bea218cddd894f05ec98c3e
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp314-cp314-macosx_14_0_arm64.whl
| Download URL | pylibjxl-0.5.0-cp314-cp314-macosx_14_0_arm64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.14 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
73475dd5e025858effcb0eaabf35e5f8486b0f0a93a32a1bced2d71523a260b6
|
|
BLAKE2b-256 checksum How to use checksums |
f03668cf5c5ab309a5edb27f4c699844954dc507c01ecca956d3dae1b78a505a
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp313-cp313-win_amd64.whl
| Download URL | pylibjxl-0.5.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
a7d3e91ecfe2fa3a788eb98e3094ee925bbe457073a78b296658d7c2bdbbd4f7
|
|
BLAKE2b-256 checksum How to use checksums |
25c744ec8ef6d7c7f66583aa33645c51c81ba5233df412950768ffbdfd092616
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pylibjxl-0.5.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.9 MB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
8aceb7d7581a3737d6c3401693a3ea192dd9dff9024345e9ed3462116ad1557d
|
|
BLAKE2b-256 checksum How to use checksums |
5fff682931075828a0fc66177f0c7f312e01fe6b6b81ef6d9867a460089feb11
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp313-cp313-macosx_14_0_x86_64.whl
| Download URL | pylibjxl-0.5.0-cp313-cp313-macosx_14_0_x86_64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.13 macOS 14.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
bb29f6f06cbb6831ad373251c7a87e651f7a11af367511a2d4db8b499bdd3799
|
|
BLAKE2b-256 checksum How to use checksums |
7bf222ce1d99f0be55ad17383a1bb2a1936a00d8af68b388c564bf9904372f32
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp313-cp313-macosx_14_0_arm64.whl
| Download URL | pylibjxl-0.5.0-cp313-cp313-macosx_14_0_arm64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.13 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
2f470ccb5ef9f2d4edfe78f530d4f574f4c6d9310bd915758f6ae1f7a2078ad8
|
|
BLAKE2b-256 checksum How to use checksums |
8d7f2a121d6e501fcbe840ea639b4b7656cd8217bf03f554d1bed9b52105d569
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp312-cp312-win_amd64.whl
| Download URL | pylibjxl-0.5.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
4eabee63360e62e9b074c516c34d60f911258c6acf7e8eeb90f8b1f18d298c52
|
|
BLAKE2b-256 checksum How to use checksums |
973878dfa4fe74f9058167bcbfccdce5e4cd721c5be553bc8d07e15e1769d33d
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pylibjxl-0.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.9 MB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
acc96bbcae6c8c254aa86d08b12405f3c60d4e38c7782c8c827e5e16181db036
|
|
BLAKE2b-256 checksum How to use checksums |
f05bf95c81a1103e679a9b8329676112983c6f7119a6443f61d3e1d1be2e3074
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp312-cp312-macosx_14_0_x86_64.whl
| Download URL | pylibjxl-0.5.0-cp312-cp312-macosx_14_0_x86_64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.12 macOS 14.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
03bc60e9af8fcc677f0661e658227fa34687592635752a760a62107cd0427c97
|
|
BLAKE2b-256 checksum How to use checksums |
defe6ed3c721034ca4f59b4cdefb38a38661cdd67b1ea80fc66c1e24d48b2616
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp312-cp312-macosx_14_0_arm64.whl
| Download URL | pylibjxl-0.5.0-cp312-cp312-macosx_14_0_arm64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.12 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
3256562f9aa2f0d405c18cf8646e2fcbec8bf52f148f0b93e6e14c5362325f0b
|
|
BLAKE2b-256 checksum How to use checksums |
49179d85e0580d3b2ec00d53937b89ed3f8208985db02000407be6bd16442905
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp311-cp311-win_amd64.whl
| Download URL | pylibjxl-0.5.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
c6ac9705ca6e39004675a5db746dc59eadc0da879aeffc3b93f50726226607b4
|
|
BLAKE2b-256 checksum How to use checksums |
bbc23f1e4cecb96c809f16cb22325aa16858adc7696a490ddd9cb85617c7801c
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pylibjxl-0.5.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.9 MB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
6411ad364e1d2028f69ff64c81119287b0f597ec95ef1cf3d177f4e278467d65
|
|
BLAKE2b-256 checksum How to use checksums |
b3ce88ddb6255167f283a74e58a43de7abe5a87d2518ff3d6a22cbcd17d4a094
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp311-cp311-macosx_14_0_x86_64.whl
| Download URL | pylibjxl-0.5.0-cp311-cp311-macosx_14_0_x86_64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.11 macOS 14.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
da543d0ea53c1570bb3a9e72a36120b9121eee703a512d33b883cebf52d103e1
|
|
BLAKE2b-256 checksum How to use checksums |
0618730a84270ce9745aad2223d2d8e101bfeb7fa4baad1c4257e3c999411d6a
|
| 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 Sep 8, 2026.
Transparency logRelease files / pylibjxl-0.5.0-cp311-cp311-macosx_14_0_arm64.whl
| Download URL | pylibjxl-0.5.0-cp311-cp311-macosx_14_0_arm64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.11 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
8300ce586651f72d872ea1583a6f34de6f3b854cb03caf1f8b3cd6043a6074d6
|
|
BLAKE2b-256 checksum How to use checksums |
cfc71ab400955012771fe707454f21626ce093bbc80cfd177d7048b786d9b02e
|
| 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 Sep 8, 2026.
Transparency log