Skip to main content

cat-surf — Python bindings for CAT-Surface

PyPI Python License: GPL-2.0

cat-surf provides Python access to CAT-Surface, a mature C/C++ toolkit for surface-based neuroimaging analysis, focusing on the processing and analysis of cortical surface meshes.

CAT-Surface has been used internally for more than 10 years as part of CAT12, the SPM toolbox for computational anatomy. With this package, it is now distributed as an independent Python package for direct integration into external workflows to make CAT-Surface easier to use:

  • in T1Prep workflows (currently relying on CAT-Surface binaries)
  • in Python-based pipelines without subprocess-heavy wrappers
  • in reproducible environments via published wheels

Installation

pip install cat-surf

Pre-built wheels are available for:

  • macOS — arm64 (Apple Silicon), x86_64 (Intel)
  • Linux — x86_64, aarch64 (manylinux)
  • Python 3.9 – 3.13

Building from source

The extension modules are generated from the .pyx sources at build time; the intermediate .c files are build artifacts and are not tracked in the repository. Cython is declared in build-system.requires, so any PEP 517 build installs it for you:

# build libCAT first (see the CAT-Surface README), then:
pip install ./cat_surface_cython

For an in-place development build, Cython has to be in the ambient environment and libCAT has to be findable:

pip install cython
CAT_BUILD_DIR=/path/to/CAT-Surface python setup.py build_ext --inplace

Note that this regenerates every .c file, so a Cython version that differs from the one used elsewhere changes all of them — harmless now that they are untracked, but it is why they are not kept in git.


Basic usage

import cat_surf

# Check version
print(cat_surf.__version__)

# Load a surface file (GIFTI, FreeSurfer, BIC/MNI formats)
vertices, faces = cat_surf.read_surface("lh.central.gii")

# Per-vertex area
area, total_area = cat_surf.get_area(vertices, faces)

# Euler characteristic
chi = cat_surf.euler_characteristic(vertices, faces)

# Everything at once (mirrors CAT_SurfInfo); skip the expensive
# self-intersection test with check_intersections=False
info = cat_surf.surf_info(vertices, faces)
print(info["euler"], info["genus"], info["surface_area"],
      info["n_self_intersections"])

# Smooth per-vertex data (heat kernel, FWHM in mm)
smoothed = cat_surf.smooth_heatkernel(vertices, faces, area, fwhm=20.0)

Surface operations

Function Description Mirrors
read_surface / write_surface Multi-format surface I/O (GIFTI, FreeSurfer, BIC) —
read_values / write_values Per-vertex scalar I/O —
get_area Per-vertex and total surface area CAT_SurfArea
get_area_normalized Area normalized by a reference sphere CAT_SurfArea -sphere
euler_characteristic Topological integrity check —
surf_info Full geometry/topology summary as a dict: V/F/E, Euler, genus, components, area, volume, bounding box, self-intersections CAT_SurfInfo
read_gifti_darrays List the DataArrays a .gii embeds next to the mesh, with value range and NaN count —
smooth_heatkernel Heat-kernel smoothing of per-vertex data —
smooth_mesh Laplacian/Taubin mesh vertex smoothing —
smoothed_curvatures Mean curvature estimation —
sulcus_depth Sulcal depth via depth potential —
reduce_mesh Quadric (QEM) mesh decimation (aggressiveness, preserve_sharp) CAT_SurfReduce
fix_self_intersect Self-intersection repair (topology preserving) CAT_SurfFixSelfIntersect
count_intersections Count intersecting triangle pairs CAT_SurfSelfIntersect
surf_average Vertex-wise averaging across surfaces (return_rms for std dev) CAT_SurfAverage
surf_to_sphere Inflate surface to sphere CAT_Surf2Sphere
sphere_radius Mean radius of a spherical surface —
correct_thickness_folding Folding-based thickness correction (slope, max_dist clipping) CAT_SurfCorrectThicknessFolding
point_distance Linked vertex distance between two meshes CAT_SurfDistance -link
point_distance_mean Mean (Tfs) vertex distance CAT_SurfDistance -mean
hausdorff_distance Hausdorff distance between two surfaces —
resample_to_sphere Resample surface/values onto a target sphere CAT_SurfResample
surf_deform Deform a surface toward a volume isovalue CAT_SurfDeform
surf_to_pial_white Estimate pial + white surfaces from a central surface; the pial surface is placed by profile search (pial_profile), remove_intersect repairs both CAT_Surf2PialWhite
central_to_pial Generate a pial surface from central + thickness —
spherical_demon Spherical Demons spherical registration CAT_SurfSphericalDemon

Volume operations

Function Description Mirrors
vol_sanlm Structure-adaptive non-local means denoising CAT_VolSanlm
vol_blood_vessel_correction Blood vessel intensity correction (no CLI; the correction CAT_VolThicknessPbt applies unless -no-bvc)
vol_thickness_pbt Cortical thickness via projection-based method; unlike the binary it does not apply the blood-vessel correction first (see vol_blood_vessel_correction) CAT_VolThicknessPbt
vol_amap Adaptive maximum a posteriori tissue segmentation CAT_VolAmap (core only)
vol_marching_cubes Isosurface extraction with genus-0 topology correction CAT_VolMarchingCubes
vol_smooth Isotropic Gaussian volume smoothing CAT_VolSmooth
vol_calc Voxel-wise image calculator (spm_imcalc-style formula) CAT_VolCalc
vol_sheetness Multi-scale Hessian sheetness (plate) filter CAT_VolSheetness
vol_oriented_median Median over a sheetness-oriented neighbourhood CAT_VolLocalStat -oriented
vol_open_ppm_sulci Push buried sulcal valleys in a PPM below the isovalue CAT_VolMarchingCubes -strength-sulci
vol2surf Map a volume to a surface along inward normals CAT_Vol2Surf

Thin structures and the shrinking bias

Every isotropic regularizer — a local median, a Potts MRF, total variation — penalizes boundary area, and a thin structure has an extreme area-to-volume ratio, so deleting it is always the cheaper labelling. That is why one and the same median filter opens glued sulci in one place and closes cerebellar fissures in another, and why tuning its strength only trades one failure for the other.

vol_sheetness replaces the smoothness prior with a shape prior read off the Hessian eigenvalues, so it keeps thin sheets, ignores blobs, and shrinks nothing. Everything below is built on it, and all of it is a no-op where the sheetness is zero — the oriented operators are numerically identical to the isotropic ones they replace away from thin structures, so they are safe to switch on:

import cat_surf, nibabel as nib

t1  = nib.load("t1_corr.nii").get_fdata().astype("float32")
lab = nib.load("label.nii").get_fdata().astype("float32")
vx  = nib.load("label.nii").header.get_zooms()[:3]

# Inspect the evidence first: dark sheets are sulcal CSF, bright ones WM blades
sheet, normal = cat_surf.vol_sheetness(t1, voxelsize=vx, polarity=-1,
                                       return_normal=True)

# A median that cannot close a sulcus (orientation taken from the intensity)
clean = cat_surf.vol_oriented_median(lab, guide=t1, voxelsize=vx)

# the medians inside PBT are sheetness-oriented by default
gmt, ppm, _, _ = cat_surf.vol_thickness_pbt(lab, voxelsize=vx)

# The T1 is gone by the surface stage, but the PPM carries the geometry:
# a sulcus is a valley in it and a gyral blade a ridge, so the same filter
# finds buried sulci without any intensity image
ppm = cat_surf.vol_open_ppm_sulci(ppm, voxelsize=vx, isovalue=0.5)

Volume input convention

Every volume-consuming function accepts three input forms interchangeably:

import cat_surf, nibabel as nib
import numpy as np

# 1. file path
v, f = cat_surf.vol_marching_cubes("brain.nii.gz", threshold=0.5)

# 2. (ndarray, affine) tuple — supply a 4×4 RAS+ affine
v, f = cat_surf.vol_marching_cubes((array, affine), threshold=0.5)

# 3. any nibabel-image-like object (.affine + .get_fdata())
v, f = cat_surf.vol_marching_cubes(nib.load("brain.nii.gz"), threshold=0.5)

The data is auto-converted to float32 (matching the C library's expectation), and 4-D series default to the middle frame. No copy is made if the array is already float32/Fortran-order. Internally a minimal nifti_image is built from the affine — only the fields libCAT actually reads (dims, voxel sizes, sto_xyz).

Registration

Function Description
bbreg Full BBR pipeline: optional NMI init → boundary-based surface registration
bbreg_detect_contrast Auto-detect T1/FLAIR vs T2/BOLD from WM/GM intensity ratio
volume_register_nmi Cross-modal rigid registration via Normalised Mutual Information (≈ mri_coreg)
volume_register_robust Same-modality rigid registration via Tukey biweight M-estimation (≈ mri_robust_register)

Basic BBR usage

import cat_surf
import nibabel as nib

# Load surfaces (GIFTI or any format supported by cat_surf.read_surface)
lh_verts, lh_faces = cat_surf.read_surface("lh.white.surf.gii")
rh_verts, rh_faces = cat_surf.read_surface("rh.white.surf.gii")

# Full pipeline: NMI init from T1w reference, then BBR
matrix, cost = cat_surf.bbreg(
    "bold_mean.nii.gz",
    lh_surface=(lh_verts, lh_faces),
    rh_surface=(rh_verts, rh_faces),
    ref_file="T1w.nii.gz",     # NMI initialisation
    verbose=True,
)
print(f"BBR cost: {cost:.4f}")
print("EPI → T1 matrix:\n", matrix)

# Save the 4×4 transform for use with FSL / ANTs
import numpy as np
np.savetxt("epi_to_t1.txt", matrix)

Standalone volume registration

# Cross-modal (EPI ↔ T1w) — NMI
matrix, nmi = cat_surf.volume_register_nmi("T1w.nii.gz", "bold_mean.nii.gz")

# Same-modality (T1w ↔ T1w) — robust IRLS
matrix, res = cat_surf.volume_register_robust("t1_ref.nii.gz", "t1_moving.nii.gz")

Contrast auto-detection

# 0 = T1/FLAIR, 1 = T2/BOLD, -1 = undetermined
contrast = cat_surf.bbreg_detect_contrast(
    "bold_mean.nii.gz",
    lh_surface=(lh_verts, lh_faces),
    rh_surface=(rh_verts, rh_faces),
)

Conversion utilities

Function Description
arrays_to_polygons Convert NumPy vertex/face arrays to internal polygon mesh
polygons_to_arrays Convert internal polygon mesh back to NumPy arrays

cat_surf.cli — drop-in replacement for the CAT binaries

The cat_surf.cli subpackage mirrors the CAT_* command-line binaries one-to-one: same names (snake_case, CAT_ prefix dropped), same positional argument order, same option semantics and defaults. Each function reads its inputs from disk, calls the in-memory numpy wrapper, and writes the outputs — ideal for porting shell scripts to Python.

from cat_surf import cli

# CAT_VolMarchingCubes brain.nii.gz brain.gii -thresh 0.5
cli.vol_marching_cubes("brain.nii.gz", "brain.gii", threshold=0.5)

# CAT_Surf2PialWhite -remove_intersect central.gii thickness.txt labels.nii \
#     pial.gii white.gii
cli.surf2pial_white("central.gii", "thickness.txt", "labels.nii",
                    "pial.gii", "white.gii", remove_intersect=True)

# CAT_SurfDistance -mean surf1.gii surf2.gii out.txt
cli.surf_distance("surf1.gii", "surf2.gii", "out.txt", mode="mean")

# CAT_VolSanlm in.nii out.nii -strength 1.0
cli.vol_sanlm("in.nii", "out.nii", strength=1.0)

The full mapping:

CAT binary cat_surf.cli.<name>
CAT_Surf2PialWhite surf2pial_white
CAT_Surf2Sphere surf2sphere
CAT_SurfArea surf_area
CAT_SurfAverage surf_average
CAT_SurfCorrectThicknessFolding surf_correct_thickness_folding
CAT_SurfDeform surf_deform
CAT_SurfDistance surf_distance
CAT_SurfInfo surf_info
CAT_SurfReduce surf_reduce
CAT_SurfFixSelfIntersect surf_fix_self_intersect
CAT_SurfResample surf_resample
CAT_SurfSphericalDemon surf_spherical_demon
CAT_Vol2Surf vol2surf
CAT_VolAmap vol_amap
CAT_VolCalc vol_calc
CAT_VolLocalStat vol_local_stat (-oriented only)
CAT_VolMarchingCubes vol_marching_cubes
CAT_VolSanlm vol_sanlm
CAT_VolSheetness vol_sheetness
CAT_VolSmooth vol_smooth
CAT_VolThicknessPbt vol_thickness_pbt (applies the blood-vessel correction like the binary; blood_vessel_correction=False is -no-bvc)

For composable in-memory pipelines, prefer the lower-level cat_surf API directly — the CLI shims are just thin convenience wrappers.


Typical use cases

  • Cortical mesh processing (resampling, smoothing, metrics)
  • Thickness and folding related computations
  • Volume-to-surface projection
  • Denoising and volume preprocessing for structural MRI

Citation / provenance

If you use this package in research, please cite Dahnke et al., 2013 and mention the cat-surf package version for reproducibility.


Source

Metadata

Release files for cat-surf 1.0.32

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

Built distributions (wheels)

Table of built distributions (wheels) for cat-surf 1.0.32
File
cat_surf-1.0.32-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64 Details
cat_surf-1.0.32-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ ARM64 Details
cat_surf-1.0.32-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
cat_surf-1.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64 Details
cat_surf-1.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ ARM64 Details
cat_surf-1.0.32-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
cat_surf-1.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64 Details
cat_surf-1.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ ARM64 Details
cat_surf-1.0.32-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
cat_surf-1.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-64 Details
cat_surf-1.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ ARM64 Details
cat_surf-1.0.32-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details
cat_surf-1.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.17+ x86-64 Details
cat_surf-1.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.9 CPython 3.9 Linux glibc 2.17+ ARM64 Details
cat_surf-1.0.32-cp39-cp39-macosx_11_0_arm64.whl CPython 3.9 CPython 3.9 macOS 11.0+ ARM64 Details

Total release size: 107.4 MB

Release files / cat_surf-1.0.32-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL cat_surf-1.0.32-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 8.4 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
031cc7807e06abb1c0cd8e851f0226f30dfad9f163084332375a755b2e073cd3
BLAKE2b-256 checksum
How to use checksums
b98f088688d4b2fdd6efa9a954fe91ebe33c17823ea6a8561b902f81805c2c78
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 / cat_surf-1.0.32-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL cat_surf-1.0.32-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 8.2 MB
Tags CPython 3.13 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
e2e1d8728bd2d4da3d13212b0d92dcaa9fc05e8a698a38187ed79c145917c0d9
BLAKE2b-256 checksum
How to use checksums
7da3508ceb7e71dea3b8818aa837b5b2c944ac93047c2760b80de6fb5d14dd52
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 / cat_surf-1.0.32-cp313-cp313-macosx_11_0_arm64.whl

Download URL cat_surf-1.0.32-cp313-cp313-macosx_11_0_arm64.whl
Size 4.9 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
3db03cc6a947bdd7af1bc99565aad176d2de818b490249fe9b502542a81811e0
BLAKE2b-256 checksum
How to use checksums
b28ec99f0a18bfd8d47149295e82b2ca38e667d85e712d3766e61a7d2ec92d41
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 / cat_surf-1.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL cat_surf-1.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 8.5 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
cfe294618b05adbdd03d3ebaa912e750948fd08a0b5ef34b4340c9086e32f000
BLAKE2b-256 checksum
How to use checksums
050469971ed1ada82eb8c1640a5cc3ee1e90927f40bae7ac1b35cd2386ff251d
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 / cat_surf-1.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL cat_surf-1.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 8.3 MB
Tags CPython 3.12 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
10155dc037362abbe02f136e35b182f10e680f059eb628739a02800b504701a6
BLAKE2b-256 checksum
How to use checksums
a65321b0dcda9e1213d474211749c638a2a2f9d16da4d434bf4e83cf7a30431d
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 / cat_surf-1.0.32-cp312-cp312-macosx_11_0_arm64.whl

Download URL cat_surf-1.0.32-cp312-cp312-macosx_11_0_arm64.whl
Size 4.9 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
47112fc3dd34b898db32287171dae69ab1df386494db30672393db65c40d34d5
BLAKE2b-256 checksum
How to use checksums
c91438a7d1fcb3375e1b0494a30cdb7eda2e98a302837e272f6badcd2b6dbc61
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 / cat_surf-1.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL cat_surf-1.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 8.4 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
5ab67a0ae6ef034949eb9278657f0d99511399c96c912c79479511db2f826ecf
BLAKE2b-256 checksum
How to use checksums
8de67c156d2b587a69bbb5a0d2d49b22ecb27e4b0da0a34384070714357da448
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 / cat_surf-1.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL cat_surf-1.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 8.3 MB
Tags CPython 3.11 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
7b6ef77ff5cea63d1aa4f1cab66ba3e55c37ef344411e7dd20fe6af8f4fb9336
BLAKE2b-256 checksum
How to use checksums
36db4a0543a42777d0d6a8e57464e6475d5e62010abcdf8d6a7d9e9941597131
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 / cat_surf-1.0.32-cp311-cp311-macosx_11_0_arm64.whl

Download URL cat_surf-1.0.32-cp311-cp311-macosx_11_0_arm64.whl
Size 4.9 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1b996fe7b48515f3da306e34c2459c4423a4faded457c06eab9b7f5ad28a4c4e
BLAKE2b-256 checksum
How to use checksums
510126b1b0ccf4d2b7c171bc4d86e790ec566944cf4093399019d29aea8b4582
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 / cat_surf-1.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL cat_surf-1.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 8.3 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
90e236e88775f1121019ae7dea4d95d2da65349606295ef615cda6b67f8c4f33
BLAKE2b-256 checksum
How to use checksums
8e0cdfebe721acca2c024620b3259e6bd5841a1382a458df0dd75c008a1a35a6
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 / cat_surf-1.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL cat_surf-1.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 8.1 MB
Tags CPython 3.10 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
c03088e62ac02de638fca75bc177504941aadea82a19c1b9d5d802fa5bea0f89
BLAKE2b-256 checksum
How to use checksums
8ad82290299cee229214c8ed1de803308c35400a59a58b1e8ba57fc88dc2efae
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 / cat_surf-1.0.32-cp310-cp310-macosx_11_0_arm64.whl

Download URL cat_surf-1.0.32-cp310-cp310-macosx_11_0_arm64.whl
Size 4.9 MB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c395b81bd69a3168943e9da6ee69c2043973193ac443f9caf8811730da18d7e5
BLAKE2b-256 checksum
How to use checksums
86f7e2fb208aeb7d5b5d4260a104bb48dc1e0d65a629623e837a6cb82620abe1
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 / cat_surf-1.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL cat_surf-1.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 8.3 MB
Tags CPython 3.9 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
7091ed53a7e4f8c9755595f38927517e3fc818b5457c0717929aacdb502e12a4
BLAKE2b-256 checksum
How to use checksums
a0e68e774a9f1ef6a38a325fa39e8492e00ab21181fa4cb950a1a7dda3b092bc
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 / cat_surf-1.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL cat_surf-1.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 8.1 MB
Tags CPython 3.9 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
6e1d7bb787e019b7a07131b4a18f59dc740739069a7ab4c51ac26afa05a8060c
BLAKE2b-256 checksum
How to use checksums
a534f271096652a19a22dedab1c3df0ef825fc8c57e8590dcc419ad03043140e
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 / cat_surf-1.0.32-cp39-cp39-macosx_11_0_arm64.whl

Download URL cat_surf-1.0.32-cp39-cp39-macosx_11_0_arm64.whl
Size 4.9 MB
Tags CPython 3.9 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
fa1f6a77343da59b794719081660c670d9294c6c1fbd78490b7990374b2a1b78
BLAKE2b-256 checksum
How to use checksums
e29f3ccd476a91ac5b87e3057185d80e240377bc872a0e6ef2fed8f5a53f6014
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 cat-surf 1.0.32

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

Select from 15 files

Attestation for cat_surf-1.0.32-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

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.

Release history Release notifications | RSS feed

This release

1.0.32 This release

15 release files Full provenance

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