Skip to main content

Fast, robust isosurface extraction from arbitrary implicit functions using adaptive octree and Manifold Dual Contouring

Project description

isomesh

Fast, robust isosurface extraction from arbitrary implicit functions using adaptive octree and Dual Contouring.

isomesh benchmark overview

Features

  • Sharp feature preservation via QEF (Quadric Error Function) vertex placement -- corners and edges are captured exactly, not rounded like Marching Cubes
  • Manifold, watertight output guaranteed for closed surfaces
  • Adaptive refinement -- concentrates cells at feature boundaries, smooth regions stay coarse
  • Rust core with Python bindings (PyO3 + maturin) -- zero-copy numpy array exchange
  • Batch evaluation -- the user's implicit function is called with (N, 3) arrays, not point-by-point
  • Newton surface projection -- all vertices lie exactly on the isosurface (machine precision)

Quick Start

import isomesh
import numpy as np

def sdf_sphere(pos: np.ndarray):
    norms = np.linalg.norm(pos, axis=1)
    values = norms - 1.0
    gradients = pos / np.linalg.norm(pos, axis=1, keepdims=True)
    return values, gradients

vertices, faces = isomesh.extract(
    func=sdf_sphere,
    bbox_min=(-2, -2, -2),
    bbox_max=(2, 2, 2),
    min_depth=4,
    max_depth=7,
    angle_threshold=30.0,   # degrees -- sharp feature detection
    iso_value=0.0,
)

# vertices: (V, 3) float64 -- all on the isosurface
# faces: (F, 3) int64 -- consistently oriented triangles

Installation

Requires Python >= 3.11 and a Rust toolchain.

pip install maturin
git clone <repo-url> && cd isomesh
maturin develop --release

How It Works

isomesh uses Dual Contouring on an adaptive octree:

  1. Adaptive octree construction -- uniform grid at min_depth, then feature-sensitive refinement to max_depth based on normal angle spread and gradient variation
  2. QEF vertex placement -- one vertex per cell via Jacobi SVD eigendecomposition with mass-point bias for rank-deficient cases
  3. Newton surface projection -- one Newton step projects each vertex exactly onto the zero-isosurface
  4. Quad generation -- canonical-edge iteration with flatness-based triangulation
  5. All surface leaves forced to max_depth -- eliminates T-junction holes, guarantees watertight output

Function Interface

The implicit function must be vectorized:

def f(positions: np.ndarray) -> tuple[np.ndarray, np.ndarray | None]:
    """
    Args:
        positions: (N, 3) float64 array of query points
    Returns:
        values: (N,) float64 -- implicit function values
        gradients: (N, 3) float64 or None -- if None, estimated via finite differences
    """

Dual Contouring vs Marching Cubes

Comprehensive comparison across 10 benchmark shapes using isomesh (Dual Contouring) and PyMCubes (Marching Cubes) at equivalent resolution (depth 6 = 64 cells/axis).

Summary

Metric MC (res=65) DC Uniform (d=6) DC Adaptive (4->6) DC Adaptive (4->7)
Manifold 10/10 10/10 10/10 10/10
Watertight 10/10 10/10 10/10 10/10
Total vertices 81,112 80,693 72,629 270,770
Total time 0.75s 7.69s 6.86s 15.25s
Avg SDF error 3.10e-04 5.74e-05 5.75e-05 2.17e-05
Avg min angle 34.7 39.8 39.6 40.0

Surface Accuracy

Newton projection places DC vertices nearly exactly on the isosurface:

| Shape | MC mean |SDF| | DC mean |SDF| | Improvement | |-------|:-------:|:-------:|:----------:| | sphere | 9.63e-05 | 1.21e-18 | ~10^13x | | thin_shell_hemi | 6.86e-05 | 1.17e-11 | ~10^6x | | chamfered_sphere | 2.58e-04 | 5.12e-07 | ~500x | | mechanical_part | 3.25e-04 | 4.05e-05 | ~8x | | bunny | 4.38e-04 | 4.38e-04 | ~1x | | simjeb_148 | 1.35e-03 | 8.95e-05 | ~15x |

Triangle Quality

DC consistently produces better-shaped triangles (higher minimum angle = less degenerate):

Shape MC min angle (avg) DC min angle (avg)
sphere 31.6 43.7
thin_shell_hemi 31.4 43.1
chamfered_sphere 35.5 43.4
box 44.1 44.5
mechanical_part 40.3 41.0
bunny 32.3 30.9
simjeb_148 34.6 33.2

Sharp Feature Comparison

DC (Dual Contouring) preserves sharp edges and corners via QEF vertex placement. MC (Marching Cubes) rounds them by linear interpolation.

Box comparison Rotated box comparison Chamfered sphere comparison Mechanical part comparison

Thin Feature & Complex Geometry

Thin shell comparison Bunny comparison SimJEB 148 comparison

Adaptive Refinement

Adaptive mode concentrates resolution where needed:

Shape Adaptive (4->6) V Uniform (d=6) V Ratio
sphere 536 8,600 16x fewer
chamfered_sphere 7,064 7,064 1x
cylinder 4,328 4,328 1x

For smooth shapes like sphere, adaptive refinement skips unnecessary subdivision, reducing vertex count by 16x with comparable accuracy.

Usage with Neural SDF Models

isomesh is designed for extracting meshes from SDF-based 3D generative models (e.g., DeepSDF, SDF-Diffusion) trained on mechanical parts like SimJEB.

Recommended Configuration

import isomesh
import numpy as np
import torch

def make_sdf_func(model, device='cuda'):
    """Wrap a neural SDF model for isomesh.

    Always provide autodiff gradients -- finite difference gradients
    are unreliable on neural SDFs.
    """
    @torch.no_grad()
    def func(points: np.ndarray):
        pts = torch.from_numpy(points).float().to(device)
        pts.requires_grad_(True)

        with torch.enable_grad():
            values = model(pts)            # (N,)
            grads = torch.autograd.grad(
                values.sum(), pts, create_graph=False
            )[0]                           # (N, 3)

        return values.cpu().numpy(), grads.cpu().numpy()
    return func

vertices, faces = isomesh.extract(
    make_sdf_func(model),
    bbox_min=(-1.0, -1.0, -1.0),
    bbox_max=(1.0, 1.0, 1.0),
    min_depth=4,            # 16³ base grid
    max_depth=7,            # 128³ effective resolution
    adaptive=True,          # essential for mechanical parts
    angle_threshold=30.0,   # detects 90° edges reliably
    iso_value=0.0,
)

Why These Settings

Parameter Value Rationale
adaptive True Mechanical parts have large flat surfaces + sharp edges/holes. Adaptive refinement concentrates resolution at feature boundaries, keeping flat regions coarse.
min_depth 4 16³ = 4,096 initial corners -- a good first GPU batch. Lower risks missing thin features at the base grid; higher diminishes the benefit of adaptive refinement.
max_depth 7 128³ effective resolution captures fillets, hole edges, and fine details.
angle_threshold 30.0 Mechanical edges are typically 90°, well above this threshold. Lowering it risks false-positive refinement from noisy neural gradients on flat surfaces.

Quality Presets

# Batch generation (speed-oriented, hundreds of shapes)
min_depth=4, max_depth=7, adaptive=True

# Single shape, final output (quality-oriented)
min_depth=5, max_depth=8, adaptive=True

Tips

  • Always provide autodiff gradients. Neural SDF + finite differences = poor accuracy. The wrapper above uses torch.autograd.grad to get exact gradients while keeping the outer scope in no_grad mode.
  • Don't lower angle_threshold below 25°. Neural gradients are noisier than analytic ones. A lower threshold causes over-refinement on surfaces that are actually flat.
  • Thin features are handled automatically. The Lipschitz guard detects thin walls even in cells without sign changes.
  • Output is manifold and watertight. Manifold Dual Contouring guarantees this -- no post-processing needed for downstream simulation or 3D printing.
  • QEF preserves sharp edges exactly. Unlike Marching Cubes, which places vertices on grid edges (chamfering corners), QEF vertex placement captures true edge and corner geometry.

API Reference

isomesh.extract(
    func,                    # vectorized SDF: (N,3) -> ((N,), (N,3)|None)
    *,
    bbox_min=(-1, -1, -1),   # bounding box (expanded to cube if non-cubic)
    bbox_max=(1, 1, 1),
    min_depth=3,             # uniform base resolution (2^min_depth cells/axis)
    max_depth=7,             # max adaptive refinement depth
    angle_threshold=30.0,    # degrees -- feature detection sensitivity
    iso_value=0.0,           # isosurface level
    fd_step=1e-5,            # finite difference step (if gradients not provided)
    adaptive=False,          # enable adaptive refinement
) -> (vertices, faces)

Architecture

src/                        # Rust core
  lib.rs                    # PyO3 module entry
  bbox.rs                   # Bounding box, expand-to-cubic
  octree/                   # Adaptive octree
    build.rs                # Construction + feature-sensitive refinement
    cell.rs, types.rs       # Data structures
    morton.rs               # Morton code spatial indexing
  eval/                     # Function evaluation bridge
    bridge.rs               # Batch Python<->Rust with GIL management
    cache.rs                # Corner value/gradient cache
  dc/extract.rs             # Dual Contouring mesh extraction
  qef/quadric.rs            # QEF solver (Jacobi SVD, mass-point bias)
  util/math.rs              # 3x3 eigendecomposition

python/isomesh/             # Python API
  _core.py                  # extract() wrapper + validation
  _validation.py            # Input checking with clear error messages

Testing

maturin develop --release
pytest tests/ -v

Benchmarks

The benchmark suite compares isomesh against PyMCubes across 10 shapes in 4 categories:

Category Shapes What it tests
Basic Sphere, Torus Smooth surfaces, analytic ground truth
Sharp features Box, Rotated box, Chamfered sphere, Cylinder, Mechanical part Sharp edges, corners, non-axis-aligned edges, CSG operations
Thin features Hemisphere shell (wall=0.08) Thin walls, open boundaries
Complex geometry Bunny, SimJEB 148 (mesh-based SDF) Real CAD parts, complex topology
# Full benchmark (all shapes, all methods, with rendering)
uv run python benchmarks/run_benchmark.py

# Selective
uv run python benchmarks/run_benchmark.py --shapes sphere box chamfered_sphere
uv run python benchmarks/run_benchmark.py --methods uniform adaptive
uv run python benchmarks/run_benchmark.py --no-render --no-stl

References

  • Ju, Losasso, Schaefer, Warren. "Dual Contouring of Hermite Data." SIGGRAPH 2002.
  • Schaefer, Ju, Warren. "Manifold Dual Contouring." IEEE TVCG 13(3), 2007.
  • Garland, Heckbert. "Surface Simplification Using Quadric Error Metrics." SIGGRAPH 1997.
  • Lindstrom. "Out-of-Core Simplification of Large Polygonal Models." SIGGRAPH 2000.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

isomesh-0.1.0.dev2.tar.gz (4.2 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

isomesh-0.1.0.dev2-cp313-cp313-win_amd64.whl (262.6 kB view details)

Uploaded CPython 3.13Windows x86-64

isomesh-0.1.0.dev2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (349.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

isomesh-0.1.0.dev2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (330.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

isomesh-0.1.0.dev2-cp313-cp313-macosx_11_0_arm64.whl (309.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

isomesh-0.1.0.dev2-cp312-cp312-win_amd64.whl (263.0 kB view details)

Uploaded CPython 3.12Windows x86-64

isomesh-0.1.0.dev2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (350.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

isomesh-0.1.0.dev2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (331.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

isomesh-0.1.0.dev2-cp312-cp312-macosx_11_0_arm64.whl (309.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

isomesh-0.1.0.dev2-cp311-cp311-win_amd64.whl (262.6 kB view details)

Uploaded CPython 3.11Windows x86-64

isomesh-0.1.0.dev2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (351.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

isomesh-0.1.0.dev2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (332.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

isomesh-0.1.0.dev2-cp311-cp311-macosx_11_0_arm64.whl (310.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file isomesh-0.1.0.dev2.tar.gz.

File metadata

  • Download URL: isomesh-0.1.0.dev2.tar.gz
  • Upload date:
  • Size: 4.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for isomesh-0.1.0.dev2.tar.gz
Algorithm Hash digest
SHA256 532903b9e86feddff169181a4a8c4e5af1f991dd04572d76277b32f64aa3641f
MD5 466ed625703933322a47b985db70635d
BLAKE2b-256 021680773976bc48d7546e8912ad9fd007dfea5acd0d4c4e2d5ac2565be68cfd

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2.tar.gz:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file isomesh-0.1.0.dev2-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e91071a65d5abab4be4921b5ddfb8081d1d3d71f04caeb4d08e9f4b289df9114
MD5 2fc9e0748ef6d6abc97f1232101ca1ff
BLAKE2b-256 93a0242b33cd413a6bb7421f44d441ec20550f357e021ca3be304026d325ca62

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file isomesh-0.1.0.dev2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2f2e225b0af29fe8ed15b630dc552e907435b48804dd321576c3e1a8d909444f
MD5 6525eebcd67aa0db1e683f68b24c046c
BLAKE2b-256 d12870cc4f642e902fa6dee1844551ba32ce828271b00e9283fcae16ce26e0fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file isomesh-0.1.0.dev2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f947022fde9dcf64f82e436088fc4cae105afa0b89333fcc1fbec1450f73e43d
MD5 f734b1ad33b744b04d5d070cb9bad819
BLAKE2b-256 54837fe7ffb76ecdf9b52d12e12ab98551ac6285acd8e224fff42eff2057f696

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file isomesh-0.1.0.dev2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 938653b245710c9cbabda3ac37c3445acd6219d2adb033e351b72623d64658c4
MD5 bb6ec201fa979162fc30e0fa976a7b5e
BLAKE2b-256 9fc70c81aeeddc1eb267215af34827de1d26ca32591d73749aad04828b24c8b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file isomesh-0.1.0.dev2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a3d34a2c1eb5030dda87ce9049b19a3c61b6d2c8a8dec2179352cf35acbc7ab5
MD5 9a01cea0cec24c71efce643e9e989b4c
BLAKE2b-256 7c9c032bd92ff4ecd97f74fc8520d3c7b1c37ef34c30fe99badd8fa8c0828d51

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file isomesh-0.1.0.dev2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dc9508a6a248d5e6bfebcfe9c0ec46964b8233698a036c0adcc7cc32dd5b44b7
MD5 eaa020f5ae4ebf0114b67e90888c9e8c
BLAKE2b-256 bfe231f00ac1b502e366bf083556341261ba06f0ab7d041e20143b2f2495e5c4

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file isomesh-0.1.0.dev2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 17cca65fdd60d071f8e78bceb2baa2dc7d3c5df56b76ebfe9f29cf200fe56ec9
MD5 0b086d79c8b3d343950baae03ec18662
BLAKE2b-256 f021c889cebb16aa2bfb6122874dd39ef38c840977ec469af72fbe481624e66f

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file isomesh-0.1.0.dev2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 368f6c4c073bf1970c2e6f0e4b6c3f9183a445b01c4f17ced8b3c3dc4b9cecdb
MD5 8bae0e2af23eebb809a25c0111064d77
BLAKE2b-256 3e7f5ccb8f3acc5bb7e36819be6660c12f8b43b152c38cb58bbf2b77fd2c604c

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file isomesh-0.1.0.dev2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 8989b178f637ae8169aceecb2b91a78fd26e91a28449b12808cc8695407f6949
MD5 90e7375b6e41ce82c273d4965ff72375
BLAKE2b-256 a67a7d775e7d248e333949cd48cf60f6a86bd0142de39031036e20aa75e572f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file isomesh-0.1.0.dev2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f15f5baac068d6a8ad61bd23b0a2e5ff18bcc31a1868e2a418eb6cd1b1c08163
MD5 3d8e3ad86674269d0e8b4c65014afd52
BLAKE2b-256 71da2cd6a41e15976cd21bf4bad992376738cd91036c44be943c58a167a95662

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file isomesh-0.1.0.dev2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 38b75b00b1ae0c026830a70298bfb5d477b8fb2917de6c1c52ad3a021d0b6a33
MD5 c2a4385d12b7ef41849728ff3e8c22af
BLAKE2b-256 52f13ca9010b206fb5e45510a5e57a12a5b603ebf26f3eddafc1239faa4acf1f

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file isomesh-0.1.0.dev2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 da764d4019af23c8e7e0acd6e93737a6626430c270b417849b698484d744c755
MD5 2e5596e76fcdee7b890fd430e23b7ed7
BLAKE2b-256 bdbc8fa853e65c7e062a085ff510a97aefb00c6b5d2bf2bc09f94da0cc7b5be5

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev2-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on narnia-ai-mason/isomesh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page