Progressive Convex Hull Simplification
Implementation of the algorithm from the paper
https://arxiv.org/abs/2604.14468
What it does
Given a 3D mesh, produces a sequence of progressively simpler convex hulls that are guaranteed to strictly contain the input at every step (conservative / exterior simplification).
The key idea is to work in the dual of the convex hull. Removing a vertex from the dual corresponds to removing a halfspace from the primal hull's H-representation — i.e., eliminating one face constraint and slightly enlarging the hull. Dual vertices are removed greedily in order of a per-vertex cost (primal volume added, surface area change, or mean width change), analogous to quadric-error simplification for triangle meshes.
Build
Requires CMake ≥ 3.24 (libigl's dependency recipes need it) and a C++17 compiler. Dependencies are fetched automatically via FetchContent. Builds on Linux and macOS. (On CMake 4.x the project sets a policy floor internally so the commands below work as-is; no extra flags needed.)
# Full build (includes interactive viewer; polyscope + embree fetched automatically)
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target pchs
# Headless build (no polyscope or embree dependency)
cmake -B build-headless -DCMAKE_BUILD_TYPE=Release -DPCHS_INTERACTIVE=OFF
cmake --build build-headless --target pchs
# Python bindings (nanobind fetched automatically; pass your Python executable)
cmake -B build-py -DCMAKE_BUILD_TYPE=Release -DPCHS_INTERACTIVE=OFF -DPCHS_PYTHON_BINDINGS=ON \
-DPython_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)")
cmake --build build-py --target pchs_python_module
Mesh backend (CGAL or native)
The geometry/mesh backend is swappable at configure time via -DPCHS_BACKEND:
-
CGAL(default) —CGAL::Polyhedron_3+ CGAL predicates +CGAL::convex_hull_3. -
NATIVE— a dependency-light backend using only the C++ standard library, a small half-edge mesh, qhull for the convex hull, and Shewchuk's robust predicates fororient3d. The native build fetches no CGAL and links no gmp/mpfr:cmake -B build-native -DCMAKE_BUILD_TYPE=Release -DPCHS_INTERACTIVE=OFF \ -DPCHS_TESTS=OFF -DPCHS_BACKEND=NATIVE cmake --build build-native --target pchs
Both backends produce the same hulls; they differ only in floating-point tie-breaks
that can change the greedy removal order late in a run. See
docs/backend-abstraction-plan.md for the design and tests/native_regression.sh
(also wired as an opt-in CTest via -DPCHS_NATIVE_REGRESSION=ON) for the A/B check.
Tests
The test suite (on by default; disable with -DPCHS_TESTS=OFF) is wired into CTest:
cmake -B build-headless -DCMAKE_BUILD_TYPE=Release -DPCHS_INTERACTIVE=OFF
cmake --build build-headless --target pchs pchs_tests
ctest --test-dir build-headless --output-on-failure
It covers global invariants (closed / genus-0 dual, conservative containment),
byte-exact golden regression on the icosahedron, and per-component units
(Chebyshev center, dual round-trip, cost vs finite-difference, mean width, the
half-edge Euler ops, and the native geometry/mesh/hull vs CGAL). Add
-DPCHS_NATIVE_REGRESSION=ON to also A/B-build the native backend and compare it
against CGAL.
Usage
./build/pchs [options] [mesh.ply]
Defaults to an icosahedron if no mesh is given.
| Option | Description |
|---|---|
--target N |
Simplify to N dual vertices / halfspaces (default: 18); if N < 0, subtracted from the initial count (e.g. -1 removes one face) |
--cost-function F |
Cost metric: volume, area, or mean-width (default: volume) |
--primal-output file.ply |
Write simplified hull as a polygon PLY (default: <stem>-primal.ply) |
--dual-output file |
Write simplified dual as a triangle mesh in any format igl supports (default: <stem>-dual.ply) |
--primal-initial file.ply |
Write the initial (unsimplified) primal hull |
--dual-initial file |
Write the initial (unsimplified) dual hull |
--costs [file.dmat] |
Write per-vertex removal costs; NaN for surviving vertices (default: <stem>-costs.dmat) |
--popped-ids [file.dmat] |
Write vertex removal order (default: <stem>-popped-ids.dmat) |
--stats |
Print per-phase timing after simplification |
--interactive |
Open a viewer (see below; requires PCHS_INTERACTIVE=ON build) |
--help, -h |
Print usage |
Default output filenames are derived from the input stem, e.g. Actaeon.ply → Actaeon-primal.ply, Actaeon-dual.ply, Actaeon-costs.dmat, etc.
Interactive viewer
./build/pchs --interactive --target 18 Actaeon.ply
Opens a polyscope window showing the input mesh (ambient occlusion computed in the background) and the current simplified hull (transparent, colored by face normals or graph coloring). Controls are in the left panel under Hull Simplification:
- Target / Animate to target / Step / Go to target — drive simplification one step at a time or animate to the target count.
- Cost function — switch between
Volume,Area, andMean Widthcost metrics; switching resets to the full hull and re-simplifies to the current vertex count. - Hull alpha — adjust hull transparency.
- Coloring — graph coloring or normal pseudocolor.
- Reset — rebuild from the full hull.
Algorithm sketch
- Compute the convex hull of the input primal mesh (CGAL).
- Find the Chebyshev center of the primal halfspaces via a small linear program (SDLP).
- Map each non-(nearly-)degenerate primal face to a dual vertex via the polarity transform about the Chebyshev center.
- Compute the convex hull of the dual points (CGAL).
- For each dual vertex, measure the cost of removing it and re-triangulating the hole convexly: the primal volume added, the change in primal surface area, or the change in mean width.
- Maintain a lazy-deletion min-heap. Repeatedly pop the cheapest vertex, erase it from the dual (retriangulating the resulting hole convexly), and update neighbors' costs.
- Convert the simplified dual back to a primal polygon mesh.
Library API
The core logic is in ConvexHullSimplification (convex_hull_simplification.h):
ConvexHullSimplification chs(V, F); // build primal hull, dual, init queue
chs.simplify_to(18); // greedily simplify to 18 dual vertices
auto [pV, pPI, pPC] = chs.get_primal_mesh(); // get current hull as polygon mesh
auto [dV, dF] = chs.get_dual_mesh(); // get current dual as triangle mesh
For step-by-step control:
while(chs.step()) { ... } // one greedy removal per call
chs.num_dual_vertices(); // current vertex count
chs.popped_dual_vertex_costs(); // VectorXd, NaN for surviving vertices
chs.popped_dual_vertex_ids(); // removal order
chs.stats(); // timing breakdown (t_primal_hull, t_dual_hull,
// t_queue_init, t_last_simplify)
The cost function defaults to CostFunction::PRIMAL_VOLUME; alternatives are CostFunction::PRIMAL_AREA and CostFunction::PRIMAL_MEAN_WIDTH:
ConvexHullSimplification chs(V, F, /*max_degree_for_flips=*/100, CostFunction::PRIMAL_AREA);
MAX_DEGREE_FOR_FLIPS (env var, default 100) controls the vertex-degree threshold above which the convex-hull-based one-ring triangulation is used instead of the flip-based method.
Python API
Install
pip install git+https://github.com/alecjacobson/progressive-convex-hull-simplification.git
This builds the pchs extension module via CMake/nanobind under the hood (using
scikit-build-core); the default build
links CGAL, so the compile can take a few minutes and the resulting module is
GPL-encumbered (see License). To build the dependency-light native
backend instead (no CGAL/GPL), pass it through CMAKE_ARGS:
CMAKE_ARGS="-DPCHS_BACKEND=NATIVE" \
pip install git+https://github.com/alecjacobson/progressive-convex-hull-simplification.git
Alternatively, building manually (see Build above) with
-DPCHS_PYTHON_BINDINGS=ON, adding the build directory to PYTHONPATH also
works:
import pchs
import igl
V, F = igl.read_triangle_mesh("mesh.obj")
chs = pchs.ConvexHullSimplification(V, F,
max_degree_for_flips=100,
cost_function=pchs.CostFunction.volume) # or pchs.CostFunction.area
chs.simplify_to(18)
pV, pPI, pPC = chs.get_primal_mesh() # polygon mesh
dV, dF = chs.get_dual_mesh() # triangle mesh
costs = chs.popped_dual_vertex_costs() # VectorXd, NaN for surviving vertices
ids = chs.popped_dual_vertex_ids() # removal order
s = chs.stats()
print(s.t_primal_hull, s.t_dual_hull, s.t_queue_init, s.t_last_simplify)
# Or use the one-shot wrapper:
pV, pPI, pPC = pchs.simplify_convex_hull(V, F, 18)
Construct a convex polytope directly from a set of halfspaces (skipping the mesh → primal-hull → dual pipeline entirely, and with no simplification):
# Halfspaces as rows [nx, ny, nz, b], interior: n·x + b <= 0.
halfspaces = ... # N x 4
x0 = pchs.chebyshev_center(halfspaces) # optional; computed automatically if omitted
pV, pPI, pPC = pchs.primal_mesh_from_halfspaces(halfspaces, x0)
chebyshev_center raises if the underlying LP fails outright, but — like the
igl::chebyshev_center it wraps — doesn't always detect a genuinely empty
intersection (e.g. two disjoint opposing planes); sanity-check the result if
the input isn't already known to bound a nonempty region.
License
The code in this repository is released under the MIT License (see
LICENSE). Which license governs a compiled program, however,
depends on the backend you build, because the dependencies differ.
Native backend (-DPCHS_BACKEND=NATIVE) — no copyleft
Links only permissive / weak-copyleft dependencies:
| dependency | license |
|---|---|
| qhull | Qhull license (permissive, BSD-style: keep the notice, ship the license text, flag modifications) |
| Shewchuk robust predicates | public domain |
| SDLP | permissive ("modify and re-distribute … in any manner as long as this notice is preserved") |
| libigl (core) and Eigen | MPL-2.0 (weak, file-level copyleft — obligations apply only to changes to those libraries' own files, not to your code) |
None of these is GPL/LGPL, so a native build carries no viral copyleft: you may ship it under your own (e.g. MIT) terms while preserving the upstream notices. It fetches no CGAL and links no gmp/mpfr/boost.
CGAL backend (default) — GPL
The default build additionally links CGAL. The
packages it uses, Convex_hull_3 and Polyhedron_3, are GPL-3.0-or-later
(the kernel and HalfedgeDS are LGPL-3.0-or-later, and CGAL pulls in Boost).
Because those two packages are GPL, a distributed CGAL-backend binary is
effectively GPL-3.0-or-later — unless you obtain a commercial CGAL license.
MIT is GPL-compatible, so combining is fine; it just means the program as a whole
is copyleft.
In short: the library code is MIT. Build the native backend and the only obligations are the permissive / weak-copyleft notices above; build with CGAL and the distributed binary is GPL.
LLM use
I wrote the original prototype of this algorithm in matlab without much input
from llms or coding agents (probably copilot tab-complete helped a little bit).
Then I wrote most of first draft of the paper. My thought was that Claude Code
etc. would have no trouble taking the paper source and the matlab prototype and
spitting out a C++ implementation. A few failed attempts and a lot of spent
tokens later, I gave up doing it completely automatically. The llms were
simultaneously immensely helpful parsing through CGAL's otherwise forboding
documentation and templating and also terribly confused by how to build anything
more complicated than simple loops over elements using CGAL's half-edge
datastructure. Using webchat llms effectively as a search engine on the CGAL
documentation, I wrote the initial core of the vertex_erasure,
primal_change, and convex_hull_simplification functions more or less
manually (with tab-complete copilot stuff). When a very minimal version of this
was working, I let Claude Code at it with CMake build junk, adding visualization, flags, python
bindings, and most of this readme file. I did not use coding agents of llms to
write any of the paper text (beyond looking for typos or double-checking
derivations).
I added the mean-width cost metric after the first round of reviews. Again, I thought that because the area and volume metrics were already in place this would be an easy fully automatic task for Claude Code. It burnt an entire session quota and output nothing. So, I ended up writing that manually (with copilot tab-complete), and then Claude code cleaned up the flags and visualization code to expose the new cost metric.
Update: Since then, I've had Claude implement a non-CGAL (i.e., non-GPL) backend. I did this in --dangerously-skip-permissions mode which was fairly successful at not nagging me for instruction. I told it to use Qhull and to build its own half-edge data-structure using STL. It appears to have done that effectively.
Metadata
Release files for pchs 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pchs-0.1.0.tar.gz | 5.8 MB | With provenance | Details |
Built distributions (wheels)
Total release size: 15.9 MB
Release files / pchs-0.1.0.tar.gz
| Download URL | pchs-0.1.0.tar.gz |
|---|---|
| Size | 5.8 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
90b1027b8e770a1e9cca056d1169e06f82295325037bf2df0652144f06f44240
|
|
BLAKE2b-256 checksum How to use checksums |
30a959f5b596e9dbffc9e2663c3760cd7fa9f60bed50ebf52baae8c35637204a
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp312-abi3-win_amd64.whl
| Download URL | pchs-0.1.0-cp312-abi3-win_amd64.whl |
|---|---|
| Size | 359.0 kB |
| Tags | CPython 3.12 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
637f5bf4ae1639980959965a2424f1ec99ca9a139121725057cf18c8acfd607a
|
|
BLAKE2b-256 checksum How to use checksums |
ea741cbabb9d9582d9be32ea2e63fa463b5c00af57bd271f7d71fee358d67f20
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pchs-0.1.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 443.8 kB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
a5c472a26d78e8f84d20cbb924d3f4bb7648ee2dde7276845ed73b0ddb9e4eca
|
|
BLAKE2b-256 checksum How to use checksums |
834bcaa02c571d33bae0e4e4d7990ffe27681ce2b454c9819281a7cd65a2791a
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | pchs-0.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 417.3 kB |
| Tags | CPython 3.12 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
df3f9770ad156eac9c8741ca7b9c6192c92d9cd87eea897c9b75761515b2109e
|
|
BLAKE2b-256 checksum How to use checksums |
b567812b3243925301fbb3116943e249c7aed89b777460389730cd4c67e7e64c
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp312-abi3-macosx_11_0_arm64.whl
| Download URL | pchs-0.1.0-cp312-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 371.4 kB |
| Tags | CPython 3.12 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
cb6a2808aebd77a0f42f6887f46251f7f29bb6587ba72fb65bc3952c161af245
|
|
BLAKE2b-256 checksum How to use checksums |
66295983bd6e018d6275ee244ddc0038f20b1d14e5a4e36f058489b594ba53fd
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp312-abi3-macosx_10_13_x86_64.whl
| Download URL | pchs-0.1.0-cp312-abi3-macosx_10_13_x86_64.whl |
|---|---|
| Size | 400.8 kB |
| Tags | CPython 3.12 abi3 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
af12b19948fe596a52e5bb8b3ce078b69331ebb847060bad4a6264b23535a531
|
|
BLAKE2b-256 checksum How to use checksums |
18fdcb4d3e8cee25ee19c6e99b83daf71ba0beadc39ec422b8e33be780b0ae7b
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp311-cp311-win_amd64.whl
| Download URL | pchs-0.1.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 360.4 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
83e2da1fdf1b0c253ec95091ff905fb949f37941426516e2e41e700a32655a71
|
|
BLAKE2b-256 checksum How to use checksums |
118730db39a099ab7f0ea04ded14143244b2aee71dab3ba8f97f500fa401dbd1
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pchs-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 448.4 kB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
9907e6705ec71d08e9f53aff490052506d19e7e908e8a5ebd7136764df241acd
|
|
BLAKE2b-256 checksum How to use checksums |
571aa87bca67933840d937613e5ffa621f66d0dc2cfc96c93b40d9199d7795af
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | pchs-0.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 422.3 kB |
| Tags | CPython 3.11 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
58f8f145713540e9b327144375d19a96a7b0c27960af3e2ada42a6142dce1039
|
|
BLAKE2b-256 checksum How to use checksums |
b5a2351657be335ef1bae2cde4e569ca6e1f1f672315ffe1fbd219bbea4b2319
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | pchs-0.1.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 375.7 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c8c7fd4d767d6d27d019ea19ccd6a5b398137cf2726a0a3caff0d2dc998d9b2c
|
|
BLAKE2b-256 checksum How to use checksums |
5d4d245525f222c056a183cafa1d6fec63379addaf8bd850bc6cf92a39e2d89b
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp311-cp311-macosx_10_13_x86_64.whl
| Download URL | pchs-0.1.0-cp311-cp311-macosx_10_13_x86_64.whl |
|---|---|
| Size | 404.4 kB |
| Tags | CPython 3.11 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
ef026a0e1de519146bc4884084a164bf4c6f892ae555e86e89bc386e04789d61
|
|
BLAKE2b-256 checksum How to use checksums |
2f65b3e7d6cccb65b0c47cf4f73f9bde3045e4bb8961b38ed39d887887c0d8ab
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp310-cp310-win_amd64.whl
| Download URL | pchs-0.1.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 360.1 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
d033c1fd8b480d2090e2dc9a3d37649fb96eaaef15bccf42dd80ce6adcef4848
|
|
BLAKE2b-256 checksum How to use checksums |
d45753acb04ccc95b017b52cb18416d2da71c3294534ad7999e11bc25f9a8b06
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pchs-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 447.9 kB |
| Tags | CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
16edc6a86403189438e05dcb13eac81f3f6580a8ebaaccc0e51b965b441c61e8
|
|
BLAKE2b-256 checksum How to use checksums |
aafdcde8c2aadc3792be2d9248f496015c87e3d941a80b6682d866e40c8f9c81
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | pchs-0.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 421.8 kB |
| Tags | CPython 3.10 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
0110c4adac830b61fc5494d16eb67a1c32f069c1bda8a65dc302ce7a4e48e935
|
|
BLAKE2b-256 checksum How to use checksums |
9f95e8e8610e56fccc5ca3f02e54327d20c89e463c5a0c9468c22e540744b608
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | pchs-0.1.0-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 375.3 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
321feb4169acfe36c4509ba504787730494e5531b3d60019b37f59e416e72d97
|
|
BLAKE2b-256 checksum How to use checksums |
44afb99d33f599b4e07f8659780e22295b62567ad23dc8f85e2aa033bbc6d4af
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp310-cp310-macosx_10_13_x86_64.whl
| Download URL | pchs-0.1.0-cp310-cp310-macosx_10_13_x86_64.whl |
|---|---|
| Size | 404.0 kB |
| Tags | CPython 3.10 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
9517e673fff56a9a13b03cc9e5f124cc8e5ae35fc341946f387983cd086ba7a5
|
|
BLAKE2b-256 checksum How to use checksums |
8fedaba1e0ef091511d5ef80182891105284f10631d2a3ce90e7b546ad475512
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp39-cp39-win_amd64.whl
| Download URL | pchs-0.1.0-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 360.6 kB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
8b2904d40da4d25bb7d414eb07c809c9219d7d18b6e7e51734cd167f0ce4ea32
|
|
BLAKE2b-256 checksum How to use checksums |
01449bd8b921fd64eb7ee7e49cc21308d79a6ce3a86ad0024735d566075bd974
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pchs-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 448.2 kB |
| Tags | CPython 3.9 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
f1fc2f15b33386954ea8c277ee817082089a68b5d1f37f9db37cc68ba005ce82
|
|
BLAKE2b-256 checksum How to use checksums |
e2222f5a9bf7ecc511fe609cd12d09ba730b7490f74e959d137e39be6ee67ea9
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | pchs-0.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 422.2 kB |
| Tags | CPython 3.9 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
f4613d095390504b42653b03757bf9da1b76a2ae552cf5ab74d8738be0c475f5
|
|
BLAKE2b-256 checksum How to use checksums |
2433488818260471747e7bf716859717a1397daec752357955b67617965a5237
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp39-cp39-macosx_11_0_arm64.whl
| Download URL | pchs-0.1.0-cp39-cp39-macosx_11_0_arm64.whl |
|---|---|
| Size | 375.5 kB |
| Tags | CPython 3.9 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a201618b38bc2d89113ac922ad7027ae05f8ac34e72753e18a273886f807e99d
|
|
BLAKE2b-256 checksum How to use checksums |
d058bae8d9f0ec8e618ccd2727fcb4001dc748667e991d01fec926a513177b4f
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp39-cp39-macosx_10_13_x86_64.whl
| Download URL | pchs-0.1.0-cp39-cp39-macosx_10_13_x86_64.whl |
|---|---|
| Size | 404.3 kB |
| Tags | CPython 3.9 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
4a79a03aaf46aab76472de6f6647234f25ae8323d8d2e2600fe1571049f0c521
|
|
BLAKE2b-256 checksum How to use checksums |
cb26d6e78f870c079c7d561da19adcbc9fa5c22fe0bdf0cacb14b9303f8ac77e
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp38-cp38-win_amd64.whl
| Download URL | pchs-0.1.0-cp38-cp38-win_amd64.whl |
|---|---|
| Size | 360.0 kB |
| Tags | CPython 3.8 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
7af21281c7fda858b6aefae9cfbe1ee17db5f8a89d8e8ceedb422d0172458cc2
|
|
BLAKE2b-256 checksum How to use checksums |
0e51e4082ab580a3a956a2fbe7435d3832ea59a591cc345abd24a77aefe9afd1
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pchs-0.1.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 447.4 kB |
| Tags | CPython 3.8 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
aef95c5e031f36dffbb155a68f379c53f1471ce4a277d096e3de29325551261c
|
|
BLAKE2b-256 checksum How to use checksums |
840512e224430572ffb665b4b5cf70a6929ad7e28928116b9eb37bf908b221d9
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | pchs-0.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 419.8 kB |
| Tags | CPython 3.8 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
ca71afa6b4fa7192fc54a1eb6f46c5bfcac6040dafa61533c286eede0d6a2f82
|
|
BLAKE2b-256 checksum How to use checksums |
da9b575b3a1d4e65d3de2bd149261f68e85b5e095735443cd40cf736c2d62d7e
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp38-cp38-macosx_11_0_arm64.whl
| Download URL | pchs-0.1.0-cp38-cp38-macosx_11_0_arm64.whl |
|---|---|
| Size | 374.6 kB |
| Tags | CPython 3.8 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
fbf745cef1051786f7d562f82e843d799af244b6f6e7931134162e63d94631b1
|
|
BLAKE2b-256 checksum How to use checksums |
d022e8b330e59f2161ffc7ecf22df86935f76cf148b7edff6c6e7c1c62912d9b
|
| 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 5, 2026.
Transparency logRelease files / pchs-0.1.0-cp38-cp38-macosx_10_13_x86_64.whl
| Download URL | pchs-0.1.0-cp38-cp38-macosx_10_13_x86_64.whl |
|---|---|
| Size | 403.0 kB |
| Tags | CPython 3.8 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
f8c9f5f1fa99d6de8af4c20042398dd0ded623b9c6dda89736be647190c0d5ac
|
|
BLAKE2b-256 checksum How to use checksums |
8496ca4e5275692b8464d68327414943eb84539c393fab1a5567b7643b66e445
|
| 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 5, 2026.
Transparency logSecurity for pchs 0.1.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 26 files in this release have been uploaded with provenance metadata.
Attestation for pchs-0.1.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 5, 2026.
Transparency logA 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.