Check a mesh against a printer profile, verify the G-code your slicer produced, or repair a broken file. 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 broken mesh
Folders, CI/CD, slicer hooks
Twelve 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. 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. |
| 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.
strict_quality:1 in your recipe and any step that breaks topology or makes overlaps worse will roll itself back.
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 count toward
your plan's monthly usage.
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 /
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.