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.2.dev7.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.2.dev7-cp313-cp313-win_amd64.whl (262.3 kB view details)

Uploaded CPython 3.13Windows x86-64

isomesh-0.1.2.dev7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (348.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

isomesh-0.1.2.dev7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (330.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

isomesh-0.1.2.dev7-cp313-cp313-macosx_11_0_arm64.whl (310.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

isomesh-0.1.2.dev7-cp312-cp312-win_amd64.whl (262.6 kB view details)

Uploaded CPython 3.12Windows x86-64

isomesh-0.1.2.dev7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (349.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

isomesh-0.1.2.dev7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (330.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

isomesh-0.1.2.dev7-cp312-cp312-macosx_11_0_arm64.whl (311.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

isomesh-0.1.2.dev7-cp311-cp311-win_amd64.whl (262.3 kB view details)

Uploaded CPython 3.11Windows x86-64

isomesh-0.1.2.dev7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (350.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

isomesh-0.1.2.dev7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (332.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

isomesh-0.1.2.dev7-cp311-cp311-macosx_11_0_arm64.whl (311.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file isomesh-0.1.2.dev7.tar.gz.

File metadata

  • Download URL: isomesh-0.1.2.dev7.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.2.dev7.tar.gz
Algorithm Hash digest
SHA256 54ad615556d3ca82a64578cbee8c0f8d5c939135e7d1118e144385b8b9418dcc
MD5 bd9c34273944ae053d271c9f2debc46d
BLAKE2b-256 34d6623c5d79ae233ebde8853ca985aa10872713545da3c6354ba0b8210b4f69

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.2.dev7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 9fce81249d07148fe8c6e9e51b824274703fb9f58af6cc26ca9ec32c28d06542
MD5 bc09b5a7c49586a7c0d0995d47e82e7e
BLAKE2b-256 bfe9a9024f0eb8f10870654f3b1a497393e01092b7ec3a1e00149236dc79db85

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.2.dev7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0b72d3a3d42264af83b31e73f5a9c3e49b00790659ba24109389cb096cd3c25d
MD5 e3b53bb52ba0ecbd14384db502d9542f
BLAKE2b-256 0f7b0d1acd3b4c6ff90484242c094c489c97b5914c2c33388fddde83150a1c60

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.2.dev7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7e896f85307a0cf59a2960825211fc8aa1193922d35476dd10657d11417690b2
MD5 8a7602bcd54440fa752ec0349b8934c6
BLAKE2b-256 b18d0224ebaa604f2c97c7a7767cb9e210d29e7be2eb5a1b72c58fe5c2e6e909

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.2.dev7-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0eebf88c05fa4ed6726515b6609177204cd8a9013136ae335a36794584eb928a
MD5 ff5ea6031c0d06e84ca5c0aff035072e
BLAKE2b-256 4c343491a2e0652873bac52b4f09250ade522a863a98120d01df1bbc82d85a55

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.2.dev7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 40930ed0493353a8977f57e470ff89c24308b05e591beb5746c5f5e5eec3cd00
MD5 0ef725ab67b3ab5ebc11e03edafe5bf5
BLAKE2b-256 f333cbf766cd02d0a090cd1531b8495e711bec19cc6c79ee2e8f920c7a7ad4f7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.2.dev7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cde99dec12479aa723c88241ef4328df29b2d5b03ad0f3c6821e9f5767354b0d
MD5 85429c68cd34fc646cec75ddbc206963
BLAKE2b-256 4f7ff62cf3f84ba5f8877676dff2fa36fc32f9b1960f2aa57ef0893cba5cce2d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.2.dev7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7e0bd3ef2cafd8228b523d2bf8cca5541492ef223c8fc49e593c8b224225779b
MD5 de81d315151ab2dc14c83b6ed05c7077
BLAKE2b-256 63ffd8dcd0b4a2214d3ed8c80f979939ad40c3a971d6fe059923a7151b42adb9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.2.dev7-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 77559547801b97eba4dc94c65eea642e33a046936bcb5d91db08caf4e0fd466b
MD5 cca31ad4f1ad70804a6aa1eb4232850c
BLAKE2b-256 58ef34081391f8a081580d418c08d3f409a4b075e210248cd2a3adf2eb52569f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.2.dev7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 315fcbc49a144582683e72988d6def95a9a9080aeca567b2833048d20b0603bc
MD5 bb739f682d5edc52fe95dd35ab240128
BLAKE2b-256 db473c7cc982cccaec14c7757f4a6580fa7528c7c18222301ac00d40c039b712

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.2.dev7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7c67e735b6e2cce720af7189a5cdd1547debfa7fcfdca3041b3c179e8b52d09c
MD5 de5f7c81ff41a8107e5326e10c603dd8
BLAKE2b-256 2b2bc938dcb66e547cbb78fccac84d6abad8d7dd0db4377f41fa3992ba8e6334

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.2.dev7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d6af9c6311fc714635cc2e8d93d8d8b9e11620eeff6791fd86900823c2818f11
MD5 f724ed4c1785008800b232b99a6a2bd2
BLAKE2b-256 6ce9df1b009f04cef305a971e9a06a3ab6cf13abeb9fd6e75d5f7baac19759f4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.2.dev7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b9b2298c70c5a8d5454ee89c2d3238d8676948dc1dde476d23aed608eec093f1
MD5 79ae305aa7333cd575927566ef806ad0
BLAKE2b-256 7fd187d022125ccdde6b0753c4a28e06bb7a6b3a2f5c8269a4fe579f1a1bd116

See more details on using hashes here.

Provenance

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