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.dev3.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.dev3-cp313-cp313-win_amd64.whl (262.7 kB view details)

Uploaded CPython 3.13Windows x86-64

isomesh-0.1.0.dev3-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.dev3-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.dev3-cp313-cp313-macosx_11_0_arm64.whl (309.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

isomesh-0.1.0.dev3-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.dev3-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.dev3-cp312-cp312-macosx_11_0_arm64.whl (309.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

isomesh-0.1.0.dev3-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.dev3-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.dev3-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.dev3.tar.gz.

File metadata

  • Download URL: isomesh-0.1.0.dev3.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.dev3.tar.gz
Algorithm Hash digest
SHA256 3c65ac81167020edcc828e56fa68244755144026aae265d5866bddccb2da3271
MD5 efdab4b7b548667272674f454ff0b6d0
BLAKE2b-256 7d6ba17308c81f29fae997425f1475b411ba90c7db95459188ac24d3ad2a3a2d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.0.dev3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 cd16f659e0212427a1b2f014a79ec3a8d3b80ab0df22c2697ff7c097222ff0df
MD5 00883e2051cc422444dcb92c65e6cf3a
BLAKE2b-256 b0032a13dbcf9ae64be3666f3b910e8998640ce9663feab2caca194d82eed654

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.0.dev3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 34ceba1eec37960b4f223e8a248daea45c9d13e961e78f9dcb420313497006c7
MD5 d15ff4267a32ba37319dc38fb7a3775c
BLAKE2b-256 d6c2aebfdda831f97c63efa8429d394e4e3bdfca651537157f1550cc35faa3fc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.0.dev3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 cb68cd2b5121c91327cda66fb25473040f0b24ae63f37bfb1ab790ac17a97079
MD5 80c638124fc44ec70ce4ad39bb75d3b0
BLAKE2b-256 9be5ef2a99a64c4ee5b8addb09b7f6bbcf701aa335dee58946408f363138b02d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.0.dev3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2b624924b7163b36597914482ec808b54519331d79215eaafa5a97e1b138865b
MD5 9b7cd317295cdcfb3f398ca30bad1ff0
BLAKE2b-256 2bc17273919a79a9cb5d4c13e4080fc7d633306c31eded0782c7dd1d2008b31f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.0.dev3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3d7a24148179246c73a150846e02a8d472ccb4216bf9457dd7f0371b34ef7585
MD5 d9ddf6b4c4a18860036e335a2fdea3b9
BLAKE2b-256 05c3043c1fe7dcb14090fbb9fa5915a5e0a5ee683be79fa7ec5d1c50436d9466

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.0.dev3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8dce85299b1ea5d289e77c151857c5cfb0f8bf184d58fcb985c131ec75bc3e84
MD5 759b8e27a3af04b95869e6e7e8101cf4
BLAKE2b-256 f4f1110974151cc698732654ef2e576742e80f7cdbe5244257e2ffbe904b96a1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.0.dev3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 982ffbe8e6635cce8d9d9d00ab836c696968cfaa375f9c81abd95302c12f548c
MD5 a597c9e8c6831f843c5ad9afafcd12aa
BLAKE2b-256 bbd911019637e93b6d1f46ff42087459c8cd83cb7b52eeb538c1ff5210a10d86

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.0.dev3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c945ba47ad5d535eaf50b3c3944dc95660707a5ad7c576eb66f41940341397f1
MD5 ba59fe3cfce66303acdf3fd65add269f
BLAKE2b-256 d4aae153c5d14db6e077755cee899bfe8fb837133a4ed4fa54d3038bc0430831

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.0.dev3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e65b18b740f4fd325bd9cae2ac124fd0854e31008eaaff0fb297e9250758fb93
MD5 b613f8639afd10478317e3d1ea9fab89
BLAKE2b-256 82ea4a66241f5c6084fc6676e70c9d74efdac6bb453213d99d52dbec0170410f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.0.dev3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f3581b4c9776f612a7f1d621c38f555937725dc87c3f086f2b5543494c34d1be
MD5 ffb9143adff3439c72a9aee330bb8f39
BLAKE2b-256 4c9327ce494d23c7dee521b13b796e92db3dce8dccbc22ebee07bc13567a8503

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.0.dev3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8f3dfcb77b9c6bcde73c3d29d7c04b04b3757b4279c83186c31b119c1ce9c4e9
MD5 3fed85fa12523af0e42b1c9e7c7737e7
BLAKE2b-256 fc72695d131fea68c1cabf8ff37b796bfbf2ee93f40640964df85db1240a6351

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for isomesh-0.1.0.dev3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 582b21f79b2a7c50354ef8d8e5fdb6f945745a084cf9a80e3e59fb4096d262bf
MD5 119d623075f2b51a60a99e95dc1bf9e9
BLAKE2b-256 cd347c01c2869fec9dec55f46f29de22e87e934d112f212f7da6c6ff7e1e2003

See more details on using hashes here.

Provenance

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