Skip to main content

sailpy - Python bindings for SAIL

The missing small and fast image decoding library for humans (not for machines).

Features

  • Fast - Written in C/C++ for maximum performance
  • 20+ image formats - JPEG, PNG, WebP, AVIF, TIFF, GIF, BMP, and more
  • Format conversion - Easy pixel format conversion
  • Metadata support - Access EXIF, ICC profiles, and more
  • NumPy integration - Zero-copy access to pixel data
  • Clean API - Simple and intuitive interface

Installation

Pre-built wheels with all dependencies included:

pip install sailpy

Quick Start

import sailpy
import numpy as np

# Load an image
image = sailpy.Image.from_file("photo.jpg")
print(f"Size: {image.width}x{image.height}")

# Convert to NumPy array (zero-copy!)
pixels = image.to_numpy()

# Process with NumPy
inverted = 255 - pixels

# Save result
new_image = sailpy.Image.from_numpy(inverted, image.pixel_format)
new_image.save("output.png")

Supported Formats

Format Load Save Features
AVIF ✅ ✅ Modern efficient format
BMP ✅ ✅ Windows Bitmap
GIF ✅ ✅ Animations
JPEG ✅ ✅ Lossy compression
JPEG 2000 ✅ ✅ Advanced JPEG
JPEG XL ✅ ✅ Next-gen format
PNG ✅ ✅ Lossless with alpha
PSD ✅ ❌ Photoshop files
QOI ✅ ✅ Quite OK Image
SVG ✅ ❌ Vector graphics
TGA ✅ ✅ Targa
TIFF ✅ ✅ Multi-page support
WebP ✅ ✅ Google's format

...and more! See full list.

Examples

The package includes comprehensive examples demonstrating various features:

# View all available examples
import sailpy.examples
print(sailpy.examples.__doc__)

Run examples from command line:

python -m sailpy.examples.01_quickstart
python -m sailpy.examples.12_image_viewer  # Qt-based image viewer

Available examples:

  • 01_quickstart.py - Basic image loading and saving
  • 02_memory_io.py - Working with memory buffers
  • 03_features_and_options.py - Codec features and save options
  • 04_numpy_integration.py - NumPy array integration
  • 05_multiframe.py - Multi-frame image handling
  • 06_probe.py - Image probing without full loading
  • 07_codec_info.py - Querying codec information
  • 08_logging.py - Logging configuration
  • 09_image_transformations.py - Image transformations
  • 10_enum_usage.py - Working with enums
  • 11_advanced_saving.py - Advanced saving options
  • 12_image_viewer.py - Simple Qt-based image viewer

Basic Loading and Saving

import sailpy

# Load
image = sailpy.Image.from_file("input.jpg")
print(f"Format: {image.pixel_format}")
print(f"Size: {image.width}x{image.height}")

# Save in different format
image.save("output.png")

Format Conversion

import sailpy

image = sailpy.Image.from_file("input.jpg")

# Convert to RGBA
image.convert(sailpy.PixelFormat.BPP32_RGBA)

image.save("output.png")

NumPy Integration

import sailpy
import numpy as np

# Load image
image = sailpy.Image.from_file("photo.jpg")

# Get NumPy array (zero-copy when possible!)
pixels = image.to_numpy()
print(f"Array shape: {pixels.shape}")

# Apply filters
brightened = np.clip(pixels * 1.2, 0, 255).astype(np.uint8)

# Create new image from array
result = sailpy.Image.from_numpy(brightened, image.pixel_format)
result.save("brightened.png")

Batch Conversion

import sailpy
from pathlib import Path

input_dir = Path("images")
output_dir = Path("converted")
output_dir.mkdir(exist_ok=True)

for img_path in input_dir.glob("*.jpg"):
    image = sailpy.Image.from_file(str(img_path))
    image.convert(sailpy.PixelFormat.BPP24_RGB)
    image.save(str(output_dir / f"{img_path.stem}.png"))

Image Information

import sailpy

image = sailpy.Image.from_file("photo.jpg")

print(f"Dimensions: {image.width}x{image.height}")
print(f"Pixel format: {image.pixel_format}")
print(f"Bits per pixel: {image.bits_per_pixel}")
print(f"Is RGB: {image.is_rgb_family}")
print(f"Is grayscale: {image.is_grayscale}")

Creating Images from Scratch

import sailpy
import numpy as np

# Create a new image
image = sailpy.Image(sailpy.PixelFormat.BPP24_RGB, 640, 480)

# Fill with color using NumPy
pixels = image.to_numpy()
pixels[:] = [0, 128, 255]  # Blue color

# Or create gradient
pixels[:, :, 0] = np.linspace(0, 255, 640)  # Red gradient

image.save("created.png")

Error Handling

import sailpy

# Error handling with specific exceptions
try:
    image = sailpy.Image.from_file("image.xyz")
except FileNotFoundError:
    print("File not found")
except ValueError as e:
    print(f"Unsupported format or invalid parameters: {e}")
except Exception as e:
    print(f"Error loading image: {e}")

# Check if format is supported before loading
try:
    codec = sailpy.CodecInfo.from_path("image.xyz")
    if not codec.can_load:
        print(f"Format {codec.name} cannot load images")
    else:
        image = sailpy.Image.from_file("image.xyz")
except ValueError:
    print("Format not supported")
except FileNotFoundError:
    print("File not found")

Multi-Frame Images (Animations)

import sailpy

# Load animated GIF or multi-page TIFF
input = sailpy.ImageInput("animation.gif")
frames = input.load_all()

print(f"Total frames: {len(frames)}")

# Process each frame
for i, frame in enumerate(frames):
    print(f"Frame {i}: {frame.width}x{frame.height}, delay={frame.delay}ms")
    # Extract individual frames
    frame.save(f"frame_{i:03d}.png")

# Or iterate frame by frame (memory efficient)
input = sailpy.ImageInput("animation.gif")
for i, frame in enumerate(input):
    print(f"Processing frame {i}")
    # Process frame...

# Load with custom options
options = sailpy.LoadOptions()
input = sailpy.ImageInput("image.tiff").with_options(options)
frames = input.load_all()

Working with Memory (Bytes)

import sailpy
import requests

# Load from HTTP
response = requests.get("https://example.com/image.jpg")
image = sailpy.Image.from_bytes(response.content)

# Save to memory
image_bytes = image.to_bytes("png")
print(f"PNG size in memory: {len(image_bytes)} bytes")

# Send over network, save to database, etc.

Image Transformations

import sailpy

image = sailpy.Image.from_file("photo.jpg")

# Rotate (creates new image)
rotated = image.rotate_to(sailpy.Orientation.ROTATED_90)
rotated.save("rotated_90.jpg")

# Mirror (in-place)
image.mirror(sailpy.Orientation.MIRRORED_HORIZONTALLY)
image.save("mirrored.jpg")

# Rotate in-place
image.rotate(sailpy.Orientation.ROTATED_180)
image.save("rotated_180.jpg")

# Apply EXIF orientation
if image.source_image and image.source_image.orientation:
    corrected = image.rotate_to(image.source_image.orientation)
    corrected.save("corrected.jpg")

Advanced: Frame-by-Frame Writing

import sailpy

# Save multi-page TIFF (memory efficient for large datasets)
output = sailpy.ImageOutput("document.tiff")

# Optional: Set save options
options = sailpy.SaveOptions()
options.compression = sailpy.Compression.DEFLATE
options.compression_level = 6
output = output.with_options(options)

# Save pages one by one
for page_num in range(10):
    # Create or load page
    page = sailpy.Image(sailpy.PixelFormat.BPP24_RGB, 1024, 768)
    # ... fill page data ...

    output.save(page)

output.finish()
print("Multi-page document created")

API Reference

Core Classes

Image

Main class representing an image with pixel data.

Constructors:

Image()  # Create invalid image
Image(path: str)  # Load from file
Image(pixel_format: PixelFormat, width: int, height: int)  # Create empty

Properties:

  • width: int - Image width in pixels
  • height: int - Image height in pixels
  • pixel_format: PixelFormat - Pixel format
  • bits_per_pixel: int - Bits per pixel
  • bytes_per_line: int - Bytes per scan line
  • pixels_size: int - Total pixel data size
  • gamma: float - Gamma value
  • delay: int - Animation frame delay (milliseconds)
  • resolution: Resolution - Image resolution
  • source_image: SourceImage - Source image information
  • meta_data: MetaData - Image metadata (EXIF, etc.)
  • iccp: Iccp - ICC profile
  • palette: Palette - Color palette (for indexed images)

Properties:

  • is_valid: bool - Check if image is valid
  • is_rgb_family: bool - Check if RGB-like format
  • is_grayscale: bool - Check if grayscale
  • is_indexed: bool - Check if indexed (palette-based)

Methods:

  • from_file(path: str) -> Image - Load from file (static)
  • load(path: str) - Load from file (instance method)
  • save(path: str, options: SaveOptions = None) - Save to file
  • convert(pixel_format: PixelFormat) - Convert pixel format (in-place)
  • convert_to(pixel_format: PixelFormat, options: ConversionOptions = None) -> Image - Convert to new image
  • rotate(orientation: Orientation) - Rotate image (in-place)
  • rotate_to(orientation: Orientation) -> Image - Rotate to new image
  • mirror(orientation: Orientation) - Mirror image (in-place)
  • to_numpy() -> np.ndarray - Get NumPy array view (zero-copy when possible)
  • from_numpy(array: np.ndarray, pixel_format: PixelFormat) -> Image - Create from NumPy array (static)

ImageInput

Low-level interface for loading images with more control.

# Basic usage
input = ImageInput(path: str)
frames = input.load_all()  # Load all frames
frame = input.next_frame()  # Load next frame
input.stop()  # Stop loading

# With custom options (builder pattern)
options = LoadOptions()
input = ImageInput("image.tiff").with_options(options)
frames = input.load_all()

# Force specific codec (for files with wrong/missing extension)
codec = CodecInfo.from_name("png")
input = ImageInput("image.dat").with_codec(codec)

ImageOutput

Low-level interface for saving images with more control.

# Basic usage
output = ImageOutput(path: str)
output.save(image: Image)
output.finish()

# With save options (builder pattern)
options = SaveOptions()
options.compression = Compression.JPEG
output = ImageOutput("output.tiff").with_options(options)
output.save(image)
output.finish()

# Force specific codec (for files with custom extension)
codec = CodecInfo.from_name("tiff")
output = ImageOutput("output.dat").with_codec(codec)

CodecInfo

Information about image format codecs.

Methods:

  • from_extension(ext: str) -> CodecInfo - Get codec by extension
  • from_path(path: str) -> CodecInfo - Get codec from file path
  • from_mime_type(mime: str) -> CodecInfo - Get codec by MIME type
  • list() -> List[CodecInfo] - Get all available codecs

Properties:

  • name: str - Codec name
  • description: str - Codec description
  • version: str - Codec version
  • extensions: List[str] - Supported file extensions
  • mime_types: List[str] - Supported MIME types
  • magic_numbers: List[bytes] - Magic number patterns
  • can_load: bool - Can load images
  • can_save: bool - Can save images
  • is_valid: bool - Check if codec info is valid
  • load_features: LoadFeatures - Supported load features
  • save_features: SaveFeatures - Supported save features

Enums

PixelFormat

Pixel format enumeration.

RGB formats:

  • BPP24_RGB, BPP24_BGR - 24-bit RGB/BGR
  • BPP32_RGBA, BPP32_BGRA - 32-bit RGB/BGR with alpha
  • BPP48_RGB, BPP48_BGR - 48-bit RGB/BGR
  • BPP64_RGBA, BPP64_BGRA - 64-bit RGB/BGR with alpha

Grayscale:

  • BPP8_GRAYSCALE, BPP16_GRAYSCALE - 8/16-bit grayscale
  • BPP8_GRAYSCALE_ALPHA, BPP16_GRAYSCALE_ALPHA - With alpha

Indexed:

  • BPP1_INDEXED, BPP2_INDEXED, BPP4_INDEXED, BPP8_INDEXED

Compression

Compression types for saving images.

Values: NONE, RLE, JPEG, DEFLATE, LZW, ZIP, ZSTD, etc.

LogLevel

Logging levels.

Values: SILENCE, ERROR, WARNING, INFO, DEBUG, TRACE

Support Classes

SaveOptions

Options for saving images.

options = SaveOptions()
options.compression = Compression.DEFLATE
options.compression_level = 6

# Codec-specific tuning (dict[str, Variant])
# IMPORTANT: Set the whole dict, not individual keys
options.tuning = {"png-filter": Variant("paeth")}  # PNG: none, sub, up, avg, paeth

# Use with ImageOutput
output = ImageOutput("output.png").with_options(options)
output.save(image)
output.finish()

LoadOptions

Options for loading images.

options = LoadOptions()
# Most codecs don't require load options
# LoadOptions.tuning is available for codec-specific settings if needed

# Use with ImageInput
input = ImageInput("image.tiff").with_options(options)
frames = input.load_all()

Resolution

Image resolution information.

# Create and set resolution for an image
resolution = Resolution()
resolution.x = 300
resolution.y = 300
resolution.unit = ResolutionUnit.INCH

# Assign via property
image.resolution = resolution

# Access existing resolution
print(f"DPI: {image.resolution.x}x{image.resolution.y} {image.resolution.unit}")

MetaData

Image metadata container.

# Load metadata from loaded image
image = Image.from_file("photo.jpg")
meta = image.meta_data
if meta:
    print(f"Key: {meta.key()}")
    value = meta.value  # Property, not method
    if value.has_string():
        print(f"Value: {value.to_string()}")

# Create and set metadata
new_meta = MetaData()
new_meta.set_key(MetaDataType.ARTIST)

variant = Variant()
variant.set_string("John Doe")
new_meta.set_value(variant)

# Add to image
image.set_meta_data([new_meta])

Functions

set_log_barrier(level: LogLevel)

Set minimum logging level.

sailpy.set_log_barrier(sailpy.LogLevel.DEBUG)

set_logger(callback: Callable)

Set custom logging callback.

def my_logger(level, message):
    print(f"[SAIL {level}] {message}")

sailpy.set_logger(my_logger)

Version Information

import sailpy

# Get version string
print(sailpy.__version__)  # e.g., "0.9.10"

Example Modules

The sailpy.examples package contains working examples:

# Find examples location
import sailpy.examples
print(sailpy.examples.__path__)

# Run programmatically
from sailpy.examples import example_01_quickstart
# example_01_quickstart.main()  # If example has main()

Performance

SAIL is designed for performance:

  • Zero-copy NumPy integration when possible
  • Efficient C/C++ implementation
  • Optimized codecs
  • Minimal memory allocations

See benchmarks comparing SAIL to other libraries.

Requirements

  • Python 3.9+
  • NumPy 1.20+

Building from Source

git clone https://github.com/HappySeaFox/sail.git
cd sail/src/bindings/python
pip install -e .

License

MIT License - see LICENSE for details.

Links

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Release files for sailpy 1.2.0

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

Source distribution (sdist)

Source distribution for sailpy 1.2.0
File Size Uploaded
sailpy-1.2.0.tar.gz 682.8 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for sailpy 1.2.0
File
sailpy-1.2.0-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
sailpy-1.2.0-cp314-cp314-manylinux_2_39_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.39+ x86-64 Details
sailpy-1.2.0-cp314-cp314-macosx_15_0_arm64.whl CPython 3.14 CPython 3.14 macOS 15.0+ ARM64 Details
sailpy-1.2.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
sailpy-1.2.0-cp313-cp313-manylinux_2_39_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.39+ x86-64 Details
sailpy-1.2.0-cp313-cp313-macosx_15_0_arm64.whl CPython 3.13 CPython 3.13 macOS 15.0+ ARM64 Details
sailpy-1.2.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
sailpy-1.2.0-cp312-cp312-manylinux_2_39_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.39+ x86-64 Details
sailpy-1.2.0-cp312-cp312-macosx_15_0_arm64.whl CPython 3.12 CPython 3.12 macOS 15.0+ ARM64 Details
sailpy-1.2.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
sailpy-1.2.0-cp311-cp311-manylinux_2_39_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.39+ x86-64 Details
sailpy-1.2.0-cp311-cp311-macosx_15_0_arm64.whl CPython 3.11 CPython 3.11 macOS 15.0+ ARM64 Details
sailpy-1.2.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
sailpy-1.2.0-cp310-cp310-manylinux_2_39_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.39+ x86-64 Details
sailpy-1.2.0-cp310-cp310-macosx_15_0_arm64.whl CPython 3.10 CPython 3.10 macOS 15.0+ ARM64 Details

Total release size: 556.4 MB

Release files / sailpy-1.2.0.tar.gz

Download URL sailpy-1.2.0.tar.gz
Size 682.8 kB
Tags Source
SHA-256 checksum
How to use checksums
9e2a51bf4a558020ae32afe64988dacb53f6cafc39604305cc9fe25886f76cc2
BLAKE2b-256 checksum
How to use checksums
bcee79fd2850eaef9a0a270e9e51204444b21e5f6fdf9126a6ea2c4d6d4ac886
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp314-cp314-win_amd64.whl

Download URL sailpy-1.2.0-cp314-cp314-win_amd64.whl
Size 19.7 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
f4a8d9774a15410edd5ddf86cd8097c25eb9e0407d81de2be81a69d38f87f7c5
BLAKE2b-256 checksum
How to use checksums
eb8c3703068ebff7756f0d7c3ca5cbcf6d2d40ce24008b7722f20b00991587dd
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp314-cp314-manylinux_2_39_x86_64.whl

Download URL sailpy-1.2.0-cp314-cp314-manylinux_2_39_x86_64.whl
Size 69.6 MB
Tags CPython 3.14 Linux glibc 2.39+ x86-64
SHA-256 checksum
How to use checksums
44d3764f2109aa00967257126eee259a03994e7338e6e42aab8dbce9a5f2c9e6
BLAKE2b-256 checksum
How to use checksums
aa9aa80030fdc4caa3a21f0f1f5518f7fc3c0014e495825b0db0996d4d4e793a
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp314-cp314-macosx_15_0_arm64.whl

Download URL sailpy-1.2.0-cp314-cp314-macosx_15_0_arm64.whl
Size 22.4 MB
Tags CPython 3.14 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
3c5b6c45bef9ea77e5c8db937ad2a0474aa56d544ade9441a869d124a92e07b8
BLAKE2b-256 checksum
How to use checksums
c85b6675a4fc1cd769a9004c2e51795b828d6ce73321407c66312cba2a78c6f5
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp313-cp313-win_amd64.whl

Download URL sailpy-1.2.0-cp313-cp313-win_amd64.whl
Size 19.1 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
6f117e5ee4d298321e6deec08bf9bee1d7bbf030fc630f2852a788f7f9cf2463
BLAKE2b-256 checksum
How to use checksums
7cd55b81552f0e59a07d9d971286b1e8a6a2ae0899ced7a35ba86c7287160216
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp313-cp313-manylinux_2_39_x86_64.whl

Download URL sailpy-1.2.0-cp313-cp313-manylinux_2_39_x86_64.whl
Size 69.6 MB
Tags CPython 3.13 Linux glibc 2.39+ x86-64
SHA-256 checksum
How to use checksums
fcfb2c7cf60ed3146f4877f41357f992b0a3949ab2db985def565c0b88fd35bc
BLAKE2b-256 checksum
How to use checksums
19ff6c98b821b599edc16d8e1aa7de46e9b4f9159f9ae29d000b86b122ed2d11
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp313-cp313-macosx_15_0_arm64.whl

Download URL sailpy-1.2.0-cp313-cp313-macosx_15_0_arm64.whl
Size 22.4 MB
Tags CPython 3.13 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
354180c9bbc348c027dc3a25883dd8c10b022dad8af148d08572e7070b15d1af
BLAKE2b-256 checksum
How to use checksums
ef737e06d502f5dfd4769dc6d93dec42ef7b45503902af18a4111f3e42aca8d4
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp312-cp312-win_amd64.whl

Download URL sailpy-1.2.0-cp312-cp312-win_amd64.whl
Size 19.1 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
915c99c296b14eb5f26ed39253ab6a859279f762afea626ed06ddc6157366511
BLAKE2b-256 checksum
How to use checksums
a53d9b8555c68f22d95ff3db86c73a38ac06bb825e8029d64bf13c69424f3726
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp312-cp312-manylinux_2_39_x86_64.whl

Download URL sailpy-1.2.0-cp312-cp312-manylinux_2_39_x86_64.whl
Size 69.6 MB
Tags CPython 3.12 Linux glibc 2.39+ x86-64
SHA-256 checksum
How to use checksums
dcf16b2bf143d504bbcadcc2a009cc908c056be87a4471fdda8fa2bd7aaa455b
BLAKE2b-256 checksum
How to use checksums
9e1b9a0a9c0b44ffbd9db647d3662f78e2f7123c82344153f5c981b55ac1a9b4
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp312-cp312-macosx_15_0_arm64.whl

Download URL sailpy-1.2.0-cp312-cp312-macosx_15_0_arm64.whl
Size 22.4 MB
Tags CPython 3.12 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
c060cd0bc39b606ee412c5a0dc7faf4ab6dc780395b68d00074c073b255164f8
BLAKE2b-256 checksum
How to use checksums
5c47dd597553c6787fde0057c4cca874efc00556b4ce7b12d4c717f8c6fe7e07
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp311-cp311-win_amd64.whl

Download URL sailpy-1.2.0-cp311-cp311-win_amd64.whl
Size 19.1 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
96cc61be2fc58958a104df86d477c6d47c7270bd45d4caccddf67eaded59d26e
BLAKE2b-256 checksum
How to use checksums
371c2bc0b474102bd2332b7ec89c776508454d5e87abd7a32e245cc006af2aa7
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp311-cp311-manylinux_2_39_x86_64.whl

Download URL sailpy-1.2.0-cp311-cp311-manylinux_2_39_x86_64.whl
Size 69.6 MB
Tags CPython 3.11 Linux glibc 2.39+ x86-64
SHA-256 checksum
How to use checksums
5b6f9b33a53a339d58e6abb26714a3092101b9894347bf36edf8b1d179a93ceb
BLAKE2b-256 checksum
How to use checksums
23d22e995b01f0401fda94fa08fcc138ef2bf60b5c8e7c23dc5a87d3ca4641fd
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp311-cp311-macosx_15_0_arm64.whl

Download URL sailpy-1.2.0-cp311-cp311-macosx_15_0_arm64.whl
Size 22.4 MB
Tags CPython 3.11 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
07e6380a9149c5c97ca9d29129a8f071121a2549240862d85d011d936fb86484
BLAKE2b-256 checksum
How to use checksums
a3281caa7f1ad4940831c85b03de0315c65af946ed13393d5767f3b58c58f7b2
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp310-cp310-win_amd64.whl

Download URL sailpy-1.2.0-cp310-cp310-win_amd64.whl
Size 19.1 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
a1ac4c2e748600094dfe390c56c0cfff0b0cb27ca28db23121a39ef711617241
BLAKE2b-256 checksum
How to use checksums
f2d218ba323bf961dc14287fa8926a752c2e1935c2c71f4153bb142a9afeed6c
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp310-cp310-manylinux_2_39_x86_64.whl

Download URL sailpy-1.2.0-cp310-cp310-manylinux_2_39_x86_64.whl
Size 69.6 MB
Tags CPython 3.10 Linux glibc 2.39+ x86-64
SHA-256 checksum
How to use checksums
7bfa87be1c231421f9873b58f79470e6028694098749a77190f2275f0fba98c6
BLAKE2b-256 checksum
How to use checksums
778cef9f11ac84003b64a925ff7ca52d46471107415de53980246b5664262ef1
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 Aug 28, 2026.

Transparency log

Release files / sailpy-1.2.0-cp310-cp310-macosx_15_0_arm64.whl

Download URL sailpy-1.2.0-cp310-cp310-macosx_15_0_arm64.whl
Size 22.4 MB
Tags CPython 3.10 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
7b3b93d331cf1a88169ff667ca297e885a25f12fce5c88cf26017031092fbcc4
BLAKE2b-256 checksum
How to use checksums
5f360ee9d7d214cf236bbf5e30a3d55a83ae0eeae86630579637f4d4759c2c3d
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 Aug 28, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.2.0 This release

16 release files

1.0.3

16 release files

1.0.2

16 release files

1.0.1

16 release files

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