Why we publish this
Every repair tool says it fixes STL files. Few say how often, on which files, or what they count as fixed. A repair can close every hole and still leave triangles crossing each other, or throw away half the model and call the rest watertight. We want you to be able to check our claims, see where other tools do better, and know when to stop trying automatic repair.
The test files
200 STL files from Thingi10K, a research dataset of real Thingiverse uploads (metadata revision 2d5d3b2). They were drawn with a fixed random seed from files whose licence allows reuse (Creative Commons BY, BY-SA and public domain; no NC or ND), in five size bands from under 1,000 to 3 million triangles, and weighted toward files the dataset tags as defective.
- 131 files fail at least one check below; 69 pass all of them.
- The set is not a blind test. 50 of the files were used while developing the FixSTL engine, and the other 150 have since been used as a regression set. That favours FixSTL; the other tools had no such tuning.
- The set is weighted toward broken files and is not a sample of what people upload to this site, so the percentages are not a success rate you should expect.
We do not redistribute the models. The per-file results list each file's Thingi10K ID, Thingiverse link, author, licence and SHA-256, so you can fetch the same files.
What counts as repaired
A broken file counts as repaired only if the file the tool wrote passes all of these checks:
- Strict solid. Closed (no open edges), every edge and vertex manifold, consistent winding, no self-intersecting triangles, outward-facing shells, no duplicate or zero-area faces.
- Shape kept. The same number of separate shells, surface area within ±5%, and no sampled point of either surface more than 5% of the bounding-box diagonal from the other.
Every tool's output, including ours, is judged by the same checker: the stl-repair diagnose and assess-shape commands of the FixSTL engine. Because that is our own code, we also run an independent cross-check with trimesh (watertight, consistent winding) and MeshLab (self-intersecting faces) and publish it next to the main result.
Refusing to change a file is never counted as a repair. For files that were already fine, the right result is to leave them valid with the same shape; a tool that breaks one counts against it.
Every tool runs with its default repair settings, one file per process, with a 300-second limit. We did not tune any tool. A file that did not finish counts as not repaired.
Results
200 Thingi10K files, 131 broken and 69 healthy. Sorted by files repaired.
| Tool | Repairedof 131 | Healthy files brokenof 69 | Solid, shape changed | Cross-check passof 131 | Median time |
|---|---|---|---|---|---|
| FixSTLengine 0.6.0 (a7ea280) | 57 | 0 | 2 | 62 | 0.46 s |
| Blender 3D Print ToolboxBlender 5.2.1, toolbox 1.5.0 | 41 | 1 | 3 | 59 | 0.77 s |
| MeshFix (pymeshfix)pymeshfix 0.18.1 | 40 | 11 | 66 | 120 | 0.99 s |
| ADMesh0.98.5 | 33 | 2 | 2 | 44 | 0.06 s |
| PrusaSlicer2.9.6 | 30 | 4 | 2 | 41 | 0.75 s |
| trimesh5.2.0 | 26 | 2 | 2 | 39 | 0.48 s |
| MeshLab (PyMeshLab)PyMeshLab 2025.7.post1 | 25 | 2 | 0 | 38 | 0.46 s |
- Solid, shape changed: the output passes the strict solid check but fails the shape check, for example because shells were deleted. MeshFix makes 106 broken files solid, more than any other tool, but 66 of them lose shells or move the surface; by default it keeps only the largest shell.
- Cross-check pass: trimesh finds the output watertight with consistent winding and MeshLab finds no self-intersecting faces. It ignores shape and non-manifold vertices, so it is looser than the main check: FixSTL passes it on 62 files, Blender 59 and MeshFix 120, because the cross-check does not notice the shells MeshFix deletes.
- Median time includes starting the process and loading the tool (Blender and Python libraries take about half a second), measured with five jobs in parallel on an Apple M5. Use it only to compare orders of magnitude.
How much the shape limit matters
We fixed the ±5% shape limit before running any tool. Stricter limits change the order: tools that rebuild surface lose repairs, tools that change little keep them.
| Tool | ±5%headline | ±1%area ±2% | ±0.1%area ±1% |
|---|---|---|---|
| FixSTL | 570 broken | 550 broken | 490 broken |
| Blender 3D Print Toolbox | 411 broken | 391 broken | 371 broken |
| MeshFix (pymeshfix) | 4011 broken | 3015 broken | 2615 broken |
| ADMesh | 332 broken | 322 broken | 312 broken |
| PrusaSlicer | 304 broken | 304 broken | 304 broken |
| trimesh | 262 broken | 262 broken | 252 broken |
| MeshLab (PyMeshLab) | 252 broken | 242 broken | 232 broken |
Broken files repaired (of 131) at each limit for the distance between surfaces, as a share of the bounding-box diagonal; below each, healthy files broken (of 69). At ±0.1%, FixSTL keeps 49 of its 57 repairs, Blender 37 and MeshFix 26. The repairs FixSTL loses there are files where it cut out and rebuilt a damaged patch, which may move the surface by up to 1% of the bounding-box diagonal.
By problem type
Broken files repaired, by the kind of defect the file had. A file often has several, so rows overlap.
| Tool | Holes (open edges)of 76 | Non-manifold edges or verticesof 82 | Flipped normals or inside-out shellsof 29 | Self-intersectionsof 88 | Duplicate or zero-area facesof 90 |
|---|---|---|---|---|---|
| FixSTL | 29 | 26 | 5 | 20 | 30 |
| Blender 3D Print Toolbox | 23 | 17 | 4 | 5 | 17 |
| MeshFix (pymeshfix) | 23 | 17 | 3 | 16 | 19 |
| ADMesh | 20 | 12 | 1 | 1 | 12 |
| PrusaSlicer | 17 | 12 | 1 | 1 | 12 |
| trimesh | 11 | 14 | 2 | 2 | 14 |
| MeshLab (PyMeshLab) | 11 | 14 | 2 | 2 | 14 |
FixSTL repairs the most files in every problem type. Self-intersections are still the hardest for every tool: FixSTL repairs 20 of 88, MeshFix 16. On holes, FixSTL repairs 29, Blender and MeshFix 23. We rerun this benchmark with each engine release.
Files we cannot publish
We also ran the same tools on 58 files we cannot share: our own synthetic cases, AI-generated models and files users sent us. They are reported separately and are not in the download.
| Set | Broken files | FixSTL repaired | Best other tool |
|---|---|---|---|
| Community repair attempts | 10 | 0 | 1: MeshFix (pymeshfix) |
| Synthetic test cases (one defect each) | 27 | 11 | 9: MeshFix (pymeshfix) |
| Cropped self-intersection cases | 3 | 0 | None repaired |
| AI-generated high-poly models (about 1.9 M triangles) | 12 | 12 | 8: MeshFix (pymeshfix) |
| User-submitted models (0.9–2 M triangles) | 3 | 2 | 2: Blender 3D Print Toolbox |
On the AI-generated high-poly models FixSTL repaired 12 of 12, MeshFix 8 and four of the other tools 6. These meshes typically have a few tiny flaps hanging off one edge and a handful of crossing triangles; FixSTL removes the flaps and rebuilds the crossing patches. With engine 0.5.0 (3b370e8) it repaired 4.
What we cannot repair, and why
64 of 131 broken files were not repaired by any of the seven tools. Most of them combine several defects; the most common were self-intersections (59 files) and non-manifold geometry (49 files).
- Self-intersections. FixSTL repairs 20 of 88. It cuts out the crossing triangles and patches the gap, but only when the patch fits without touching other surface and moves the original by at most 1% of the bounding-box diagonal. Overlapping parts and leftover boolean cutters need cutting along the intersection and choosing which side is solid, which is not implemented; we report the problem and keep your file rather than guess.
- Non-manifold edges where parts touch. When three or more faces share an edge, deciding which belong together needs the design intent. We repair the simple cases and leave the rest.
- Large holes. FixSTL fills flat and curved holes up to about a third of the bounding-box diagonal when the patch hits no other surface. Larger openings, such as a whole missing side, would need surface that may not be what you designed, so we leave them.
- Thin walls and printability. No tool here checks wall thickness, units or overhangs. A file that passes every check can still fail in a slicer.
When a repair would move the surface beyond tight limits, FixSTL keeps the original and says so. That is why it changes fewer healthy files than any other tool, and also why it gives up on some files that other tools “fix” by deleting or reshaping parts.
Tools we did not test
- Microsoft 3D Builder: Windows-only; we test on macOS and could not run it in batch.
- Autodesk Netfabb: Commercial Windows software; we could not run it on our machine.
- Autodesk Meshmixer: No longer developed by Autodesk and has no command-line batch mode we could use.
- Online repair sites: Uploading 200 files to third-party services one by one is not reproducible, and their versions change without notice.
We make no claims about these tools. If you can run them on the same files, we will add the results.
How to reproduce
- Download Thingi10K (revision
2d5d3b2) and pick the 200 files by the IDs in the per-file results; check each SHA-256. - Install each tool at the version listed below.
- Run each tool on each file with the settings listed, in a separate process, with a 300-second limit.
- Check every output for the strict-solid conditions and the shape limits above. The trimesh and MeshLab cross-check needs only those open-source libraries.
| Tool | Version | Settings |
|---|---|---|
| FixSTL | engine 0.6.0 (a7ea280) | The repair session this site runs in your browser: Rust/WebAssembly repair, a TypeScript second candidate, and the shape guard. |
| MeshFix (pymeshfix) | pymeshfix 0.18.1 | MeshFix.repair() with library defaults, which keep only the largest shell. |
| MeshLab (PyMeshLab) | PyMeshLab 2025.7.post1 | Remove duplicate vertices, duplicate and null faces; repair non-manifold edges and vertices; close holes; re-orient faces coherently. |
| trimesh | 5.2.0 | Merge vertices, drop degenerate and duplicate faces, fix_normals, fill_holes. |
| ADMesh | 0.98.5 | All default fixes: exact and nearby merge, remove unconnected facets, fill holes, fix normals. |
| PrusaSlicer | 2.9.6 | Load and --export-stl (PrusaSlicer repairs meshes on import). We undo its move onto the print bed before checking shape. |
| Blender 3D Print Toolbox | Blender 5.2.1, toolbox 1.5.0 | "Make Manifold" (print3d_clean_non_manifold) with default settings. |
The FixSTL engine and its checker are not open source yet, so the main check cannot be rerun outside our team today; the cross-check can. Run on macOS 26 (Apple M5, 32 GB), Python 3.12.
Updates
First published October 27, 2026. Last run October 27, 2026 with FixSTL engine 0.6.0 (a7ea280); only FixSTL was rerun, the other tools' results are from the first run. With engine 0.5.0 (3b370e8), FixSTL repaired 38 of 131 broken files and broke 0 healthy files. We rerun the benchmark when the FixSTL engine changes and update this page with the new numbers, including when they get worse.