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

Pre-built wheels are available for Linux (x86_64, aarch64), macOS (Apple Silicon), and Windows:

pip install isomesh

From source

Requires a Rust toolchain (for building the native extension):

git clone https://github.com/narnia-ai-mason/isomesh.git && cd isomesh
pip install maturin
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.dev4.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.dev4-cp313-cp313-win_amd64.whl (262.7 kB view details)

Uploaded CPython 3.13Windows x86-64

isomesh-0.1.0.dev4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (349.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

isomesh-0.1.0.dev4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (330.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

isomesh-0.1.0.dev4-cp313-cp313-macosx_11_0_arm64.whl (309.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

isomesh-0.1.0.dev4-cp312-cp312-win_amd64.whl (263.1 kB view details)

Uploaded CPython 3.12Windows x86-64

isomesh-0.1.0.dev4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (350.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

isomesh-0.1.0.dev4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (331.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

isomesh-0.1.0.dev4-cp312-cp312-macosx_11_0_arm64.whl (309.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

isomesh-0.1.0.dev4-cp311-cp311-win_amd64.whl (262.7 kB view details)

Uploaded CPython 3.11Windows x86-64

isomesh-0.1.0.dev4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (351.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

isomesh-0.1.0.dev4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (332.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

isomesh-0.1.0.dev4-cp311-cp311-macosx_11_0_arm64.whl (310.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: isomesh-0.1.0.dev4.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.dev4.tar.gz
Algorithm Hash digest
SHA256 ffa64925057931d76ff21a5b36369a720051da7c904fb567e3193ac660800b46
MD5 354b3e9bef1e86e79baf5aa3a4f977f9
BLAKE2b-256 41abbb10e47256f5bbdb77aa20cd540f7c8fdeed613e6f2edbc6c7dd69a28778

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4.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.dev4-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f5661e2a0efccacf2fb23eb387579f829b95005180b18de7150c10c4f1fedbd0
MD5 25139c864259323326ee966d59b44280
BLAKE2b-256 a1383b6393da21b00c0dbd90553e008ecdb9bf67ca62f0bae48a6494b6a87038

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4-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.dev4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b24b3480976a043dba20601fd0d8d164e9960794787e81fdcd5aa03f79a2fa3e
MD5 0cafc944378913d1a166f31b3422d62c
BLAKE2b-256 11d85590a44004298d6d8b4a9d5b2ebbfc7fc39333f71bb5a27c28c05f941e6c

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4-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.dev4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b95be47d41174d2ca064d5ca2075bf21b326cb177f6727fe7c709c7f29584cd5
MD5 b0ddf6104a0bce187956bbaa91980de5
BLAKE2b-256 f226e42bb603df70fa6e5857cc05da3c86301f743fe117183b0b7e0cfee21d3f

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4-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.dev4-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev4-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 83eb6b7c290bd0e00d6da2c02f60548cd68834e56eefe51fa38a412d6b0054a1
MD5 14dfce7e5e293a7eee88f7a08c783f9b
BLAKE2b-256 8d2c9501a8c4d1a37bda867c56d35021d9e468af2a04a6dba83ad8db77ea1bd3

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4-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.dev4-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0f4a2dc70d18e82302ba241f19629aabaadef8bdbf605725bf9ab6d9b2d65c6f
MD5 4df3df6b17434a579a9efae42f746b15
BLAKE2b-256 8d5956ce2261a71a5ee01c43166b9333069a5990418c01d6e89a02d4eaf7f556

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4-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.dev4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f658e315eb6d4c4f02c204f7ebe83ee64c4fb09b183878e9bd41abfe59518e82
MD5 c6590780bd72e0366dfbe0ef0c21ec8c
BLAKE2b-256 ee49abe30b1678376c0dec893c71ad1d89a8551110771d11bc5787b28de88b1b

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4-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.dev4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2be11cad63f42d17a3e97308ed0c64c35442c7801b6da2194348bed07851745e
MD5 a114a17860d68772346ec95ffc3e1744
BLAKE2b-256 1cde5c969bcb7f05ecadde780554bcbf672b7d26f6ef98f8f1658356d7512882

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4-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.dev4-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a23061764c2cb8d32c9aeae98c0d654a1d5844f81f26d4ac9507cf172e8b664e
MD5 88efe886433533f310c18161c6f70bb6
BLAKE2b-256 0e90792e449894c5a0fc805b0e6cab1318fcd64ef3cf45fd68dd7b7a17b18d9e

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4-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.dev4-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a5f43fd81a3de6df743ad75ac324e493a0f5006c7c5e21f90168868bf5272106
MD5 8835e6a38ecd9b02a318f85e622eb609
BLAKE2b-256 c3ed39200bc69859c6a8108397e05e12528ffe681ffcf545aa814276dda230ac

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4-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.dev4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6124bc775abe260a51308298da605f798d69287327dd23119942653fcb47bafd
MD5 d6ad56a7ccfab0f5b4868c641b9b931c
BLAKE2b-256 6ca4c86715cedafe563fcd68fd4b8ae390a373f350d49215864eadf668e3af49

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4-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.dev4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 641c8e4706a618172de2d8c39d125c870d364683fac1e59819410c3b45a28882
MD5 0cc9835f9208a0daad8f8c8f0f94a710
BLAKE2b-256 da098819c18d99e275dcd72e92cced7160706e5f8d7575945468d1edb2c69ccb

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4-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.dev4-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for isomesh-0.1.0.dev4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 63102b7ce1b6374ba6d2d12cd435c332629606ec28c8189a0e9db5783b3ccb12
MD5 c3cc8db4be0f5796a0929a8897fe5ea5
BLAKE2b-256 10c0581efcf50f1818e2373156d79c9329dc24c84a558bc124e1ab4ef5ce7a44

See more details on using hashes here.

Provenance

The following attestation bundles were made for isomesh-0.1.0.dev4-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