Check a mesh against a printer profile, verify the G-code your slicer produced, repair a broken file, or run a quick stress check before a long print. One file at a time or a whole folder. Available as a CLI, an HTTP API, and Python / C# SDKs.
Copy-paste in 30 seconds
What each verb does
Fix a mesh, check it can hold up
Folders, CI/CD, slicer hooks
Thirteen commands cover the workflow: check a mesh, verify a G-code, repair what's broken, simplify a heavy file, auto-orient for printing, boolean two meshes together, run a quick stress check. Every command emits the same JSON shape on stdout so you can drop any of them into a script.
| audit <mesh> --recipe X | Full audit against a printer + material recipe. Reports Topology / Readiness / Inspection scores. |
| audit <mesh> --recipe geometry_only | Mesh-only check, no printer needed. Fast hygiene pass. |
| audit <mesh> --repair | Repair the mesh inline before checking it. |
| verify <gcode> --recipe X | Check the G-code your slicer produced — temperatures, speeds, layer timing, collision. |
| diagnose <mesh> | Counts of common defects: cracks, overlaps, flipped faces, intentional openings. |
| thickness <mesh> --min-thickness N | Wall-thickness map. Filters out intentional thin features (blades, wires, membranes). |
| diff <a.stl> <b.stl> | How far apart two meshes are: max + mean deviation, bounding box, volume. |
| units <mesh> | Detect whether the mesh is in millimetres or inches. |
| repair <mesh> -o <out> | Close cracks and overlaps. Designed never to make the input measurably worse — if a step would, it rolls back. |
| decimate <mesh> -o <out> --ratio R | Reduce triangle count while preserving the look. Has a built-in safety gate that rejects collapses creating new defects. |
| orient <mesh> -o <out> | Auto-orient for minimum support (FDM) or bed adhesion (SLA/SLS). Samples 100 candidate rotations and picks the lowest-score pose. Profile-aware via --printer-profile. |
| boolean <union|subtract|intersect> -i a.stl b.stl -o <out> | Exact mesh boolean (Manifold). Multi-operand cases fold left-to-right. Inputs must be watertight manifolds — run repair first if they aren't. |
| pipeline <mesh> -o <out> --recipe X | Run several repair / cleanup steps in order via a recipe file. Useful for shop workflows. |
| stress-check <mesh> | Default scenario: gravity + cooling shrinkage, bottom fixed. Materials: PLA, ABS, PETG, resin, nylon, PA12. Per-printer modifier via --printer. |
| stress-check <mesh> --fixed-z N --load-axial N --load-region "z>X" | Probe with your own simple load case. Returns a first-pass safety factor, peak stress, and any thin walls in the hotspots. Models the part standalone — not the assembly. |
| stress-check <mesh> --load-spec FILE.json | Multi-load JSON: axial / point_mass / face / wrench (force + moment via couple-of-forces). |
| stress-check <mesh> --body NAME=A.stl --body NAME=B.stl | Multi-body assembly: vertices in different bodies within --contact-tol mm get welded into a tied contact. One MFEM solve over the merged body. |
| stress-check <mesh> --drop-height M --impact-surface concrete|wood|foam|carpet | Quasi-static drop test: F = m·v/Δt where v=√(2gH). Force applied upward at the lowest mesh vertex. |
| stress-check <mesh> --g-load N | Multiply gravity body force by N (default 1). Use 5 for 5g posing peak. |
| fdm-slice <mesh> --recipe X | Calls PrusaSlicer / OrcaSlicer / Bambu Studio under the hood, captures the G-code, and runs verify on it. |
Help for a single verb: admeshio <verb> --help.
List the built-in recipes: admeshio --list-recipes.
You can also pass your own recipe file: --recipe ./my-shop.json.
Hollowing and arranging are not commands here — your slicer does both better. For SLA, turn on hollowing in the slicer profile; for FDM, use 0% infill. To arrange multiple parts on the plate, use the slicer's arrange UI.
Repair is built so the output is never measurably worse than the input — every step has a safety net that rolls back if it damages the mesh. The stress check is a first-pass indicator: it spots weak spots in the part's geometry under simplified loading, so you can catch a thin wall in a stress hotspot before you commit a long print. It models the part on its own — assembly-level analysis still belongs in dedicated FEA.
strict_quality:1 in your recipe and any step that breaks topology or makes overlaps worse will roll itself back.
admeshio stress-check part.stl assumes the part sits
on its base and is loaded by its own weight plus cooling shrinkage.
No load points to configure — you get a first-pass safety
factor against the material's yield strength.
Three flags expose the underlying boundary conditions for users who need a specific scenario (bracket tip, peg pull-out, lateral bend). Default is unchanged when none are passed.
| --fixed-z N | Override the default 0.5 mm bottom-fix slab — fix everything below z = N mm. |
| --load-axial N | Apply N newtons along -Z to the load region. |
| --load-region "z>X" | Region selector for the axial load. Forms: z>X or z<X. Default: top 1 mm slab. |
The solver assumes the part is a single solid piece of one material. Layer-direction strength differences (FDM prints are weaker between layers) are not yet modelled — treat results as the upper bound for axial loads, and de-rate by ~30% if the part is loaded across the print direction.
Every audit is evaluated against a specific printer + material
profile (a "recipe"). The catalog covers the printers and
materials shipped by OrcaSlicer, PrusaSlicer, and Bambu Studio
— synced daily so a freshly-released vendor profile shows up
within a day. Seven hand-tuned reference recipes cover the
common cases out of the box (Bambu X1C / PLA, Elegoo Saturn 3 /
resin, generic FDM presets, geometry-only). Drop in your own
JSON file to encode shop-specific thresholds. A folder-wide
policy file (.admeshiorc.yml) is on the
roadmap.
Both audit and verify accept a directory and
auto-parallelise. Each file gets its own JSON + HTML report written next
to the source — one folder in, one folder out. Failed files
(malformed, unsupported format) are skipped and don't cost credits.
Auto-sort into ready/ / review/ /
rejected/ buckets is on the roadmap.
| --recursive | Scan subfolders |
| --workers N | Parallel worker count (default: cores/2) |
| --limit N | Max files to process (useful for dry runs) |
| --format html | Also write a self-contained HTML report next to each file |
| --auto-pair | When the folder has a mesh + matching G-code (same stem), audit them together |
Drop the CLI straight into a build step. Exit code is derived from the audit result, so the standard "fail the job on non-zero" wiring already works — no separate flag needed.
Exit code is derived from the audit result automatically —
0 when the mesh passed or only warned, 1
when the engine decided the mesh cannot be printed, or on a
runtime error. The full GitHub Action + policy config
(.admeshiorc.yml) is on the
roadmap.
Bambu Studio, OrcaSlicer, and PrusaSlicer all expose a
Post-processing scripts setting that calls a binary
after slicing. Wire admeshio verify into that hook and
every slice gets audited before it leaves the slicer — no
plugin to install, no upload step.
| --recipe-from-3mf | Auto-resolve canonical profile from the gcode/3mf's embedded printer/material/quality metadata. Removes the need to pass --recipe manually for each slice. |
| --gate-on-fail <SCORE> | Exit non-zero when GRI-I drops below SCORE (0..100). The slicer surfaces this as a post-processing error so the user sees the failing slice instead of silently sending it to the printer. |
| --quiet, -q | Suppress info-level stderr (recipe matched, plate detected, verify complete). Errors and warnings still print so the slicer log stays readable. |
Bambu Studio / OrcaSlicer / PrusaSlicer: Print Settings → Output options → Post-processing scripts. Paste the binary path and flags on a single line:
The slicer appends the sliced file path as the final argument automatically. A failing audit (GRI-I < 70 in the example above, or any engine error) flips the slicer's "Slicing completed" message to a red error referencing the post-processing script. The full JSON envelope still lands on stdout for any downstream tooling that wants the per-rule detail.
Cura uses a different post-processing API (Python plugin, not a subprocess hook). Native Cura support is on the roadmap.
HTTP service wraps the CLI. See the full API reference for request schemas, response headers, and SDK examples.
| Method | Path | Description |
|---|---|---|
| POST | /v1/admeshio/audit | Returns admeshio-report/v1 envelope. HTTP 422 when the engine cannot evaluate the mesh. |
| POST | /v1/admeshio/verify | Returns v1 envelope for G-code. HTTP 415 on unknown format |
| POST | /v1/admeshio/repair | Upload STL → repair → download. |
| POST | /v1/admeshio/diagnose | Topology counters + intent openings. |
| GET | /v1/admeshio/catalog | Machine-readable capability spec (admeshio-catalog/v1) |
| GET | /health | Health check |
Typed clients for the v1 envelope. Both SDKs auto-detect folder vs. single-file input
and return AuditReport / list[AuditReport] accordingly.
SDK exposes audit / verify /
diagnose / repair /
decimate / pipeline /
stress_check / diff /
units / thickness /
catalog.
SDK works against the local binary (set ADMESHIO_BIN) or
the hosted API. Same envelope shape either way.
| Format | Import | Export | Best for |
|---|---|---|---|
| Mesh | |||
| STL (.stl) | Yes | Yes | Standard print workflows |
| 3MF (.3mf) | Yes | Yes | Multi-part models, AMS/MMU color data |
| OBJ (.obj) | Yes | — | Object/group-based assets |
| GLB (.glb) | Yes | Yes | Compact scene, vertex colors, UV |
| glTF (.gltf) | Yes | — | JSON-based scene interchange |
| PLY (.ply) | Yes | Yes | 3D scanning, point clouds, dental |
| Slicer output (FDM) | |||
| G-code (.gcode/.gco/.g) | Yes (verify) | Yes (fdm-slice) | OrcaSlicer / PrusaSlicer / Bambu / Cura output |
| Slicer output (resin / MSLA / DLP) | |||
| CTB (.ctb) | Yes (verify) | Yes (internal slicer) | CHITUBOX native, all CTB v3+ printers |
| cbddlp (.cbddlp) | Yes (verify, via UVtools) | — | Photon DLP / older CHITUBOX exports |
| pwmx (.pwmx) | Yes (verify, via UVtools) | — | Anycubic Photon Mono X family |
| pwmo (.pwmo) | Yes (verify, via UVtools) | — | Anycubic Photon Mono |
| goo (.goo) | Yes (verify, via UVtools) | — | Elegoo Saturn / Mars 4K+ family |
| Recommend INI (audit emit) | |||
| PrusaSlicer (.ini) | — | Yes (--emit-fixed-profile out.ini) | FDM & resin SLA — drop into PrusaSlicer Import Config |
| CHITUBOX (.cfg / .cfgx) | — | Yes (--emit-fixed-profile out.cfg) | Resin — Normal/Bottom Exposure, Lift/Retract Speed natively |
UVtools dispatch (cbddlp / pwmx / pwmo / goo): admeshio invokes the
UVtools CLI
as a subprocess to extract layer PNGs, then runs the same Phase 2 raster
checks (floating-island, vacuum-trap with 3D filter, peel-force spike)
as the native CTB path. UVtools is not bundled — install separately and
set ADMESHIO_UVTOOLS env var, or place at the standard
path. Native CTB (.ctb v3+) needs no external dependency.