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.

Contributing

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

Metadata

Release files for sailpy 1.3.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.3.0
File Size Uploaded Provenance Actions
sailpy-1.3.0.tar.gz 685.2 kB With provenance Details for sailpy-1.3.0.tar.gz

Built distributions (wheels)

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

Total release size: 558.2 MB

Release files / sailpy-1.3.0.tar.gz

Download URL sailpy-1.3.0.tar.gz
Size 685.2 kB
Tags Source
SHA-256 checksum
How to use checksums
573372957c53e06c83602ddd1e9d83b91020dc7056693f9d4e8b3fbafa6f1df4
BLAKE2b-256 checksum
How to use checksums
10d82758f5681dada3032ead42f6681ad240ada7fe7e94bfab97450fbe62bdc0
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.0-cp314-cp314-win_amd64.whl
Size 19.8 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
9b495ba3e0745f2c8983fc297b606016f620ae6b453983be4980de0e0b25c7dc
BLAKE2b-256 checksum
How to use checksums
bcac3459c50cbff9d5cfbc3987683c98d185501cdb2381a593b53205cec51555
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.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
d131523dcfa5ee2acf1fd8d87b86d8d3fffd46d6bc9203355d7628db338c5429
BLAKE2b-256 checksum
How to use checksums
c166b7290ce881e6e9d542793f0d5efed1fb02e330d6a26743b00fbcc7032c4e
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.0-cp314-cp314-macosx_15_0_arm64.whl
Size 22.6 MB
Tags CPython 3.14 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
0f5531b7aa4f44bcfd5202c6b0b514676f7d28e0bc62c106b5804129243ff852
BLAKE2b-256 checksum
How to use checksums
4a8c1445f5fdb8bb919078bb2dbbe3857e0ea18c70cdb065a54918491d860514
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.0-cp313-cp313-win_amd64.whl
Size 19.2 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
bd7a15b21868a2ecca77fed439f1ea6b61a6ea8762e6fbe6f432403695f198a0
BLAKE2b-256 checksum
How to use checksums
2fdda5e190cb34cc5972db68c428583a84e41b714558203cc4e163bb787ee3e3
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.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
ebfa33b701f5ffdb21161041c19466576dec4b35bd45884bc64c2f2d26047033
BLAKE2b-256 checksum
How to use checksums
debbe7e5c5a62a0e4ef38da348b2ebf78b18bd118cab7e3ceeb90574d1af9c2a
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.0-cp313-cp313-macosx_15_0_arm64.whl
Size 22.6 MB
Tags CPython 3.13 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
cbd1eb1399cc41f4d8f175b977975e329eb993b31867e508942ddce7d726ab60
BLAKE2b-256 checksum
How to use checksums
b586cf13a7774e0abe52526446aaf737904e8e36f580259799c9ea3907e3fe7a
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.0-cp312-cp312-win_amd64.whl
Size 19.2 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
5ef82a27f7a33e3167ef369c3dd3600250726a2e08138a2bcb09d29fd0aedf03
BLAKE2b-256 checksum
How to use checksums
7cce615bde448c93d5c0ddeef3f4c75f36a0b3084d9a85379455954b7f2b40cd
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.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
c441bcd97d149c3ddfd46ac3fcc87729c3b0c936d060a6dbd629e23c10902295
BLAKE2b-256 checksum
How to use checksums
fa96b5cb973c894dcb2f3b5e6e6753da80ba62f32faa14697afa2ac2c15b9ce3
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.0-cp312-cp312-macosx_15_0_arm64.whl
Size 22.6 MB
Tags CPython 3.12 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
444428e07af935495112e11ef26ece3590eda22549c055b13341283dc8befa8f
BLAKE2b-256 checksum
How to use checksums
06d4c335a5708d0accdda33e7932daa6f4d4b31162961c47a42dc5cbd2d58e38
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.0-cp311-cp311-win_amd64.whl
Size 19.2 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
fa32c508abfc37ea2c582726eb6234d55193c8db8b01e2bd8d690d1339656512
BLAKE2b-256 checksum
How to use checksums
8e3366ebd1f1b7c0d22e626142f72fdabf7c4ec58fbcd53be956c4d1e1d43833
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.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
1deae0a607fa518ae91ca99e3386190835f58140668d76c088df12a10118e468
BLAKE2b-256 checksum
How to use checksums
35b4ccfd1c3bfbffefba475b0edbc01e5d6cb22e6ad556426e82ef68de56a1ce
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.0-cp311-cp311-macosx_15_0_arm64.whl
Size 22.6 MB
Tags CPython 3.11 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
57b151dc29e1b50db79c6637479ba9254776b18478b786c5cf15ad418dc1c4b2
BLAKE2b-256 checksum
How to use checksums
b08011d6ad72b3737239c9b7edaea003190fc2efaf474895c0b8ace6ba1bc385
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.0-cp310-cp310-win_amd64.whl
Size 19.2 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
2a0730cb61ab4bf959aba219c95e867cad75fffca94d8f3d7e41e747226aa7f3
BLAKE2b-256 checksum
How to use checksums
8b078bdd3f966894c48c93ff98f692744b18c55c90a7aa7c38e240d85f83149f
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.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
11641bf7bd96d4a0a5f9cf4250bcdcc1a7f202fa5e067e10196edd503054dfdc
BLAKE2b-256 checksum
How to use checksums
c875214a8ee346c9ab1a431af07575dabd761da7565156513ded9d7202cf1bec
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 17, 2026.

Transparency log

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

Download URL sailpy-1.3.0-cp310-cp310-macosx_15_0_arm64.whl
Size 22.6 MB
Tags CPython 3.10 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
b4eb0afc6cda20441930649dcc87671adde0239306719466587ed1a13a5b40d5
BLAKE2b-256 checksum
How to use checksums
897fd4789949cebe260f561c3040a6e4949e363069feea99ca000f362017ef75
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 17, 2026.

Transparency log

Security for sailpy 1.3.0

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

Select from 16 files

Attestation for sailpy-1.3.0.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 17, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page