Watertight and Manifold STL Files: What They Mean and How to Check

A watertight mesh has every edge shared by exactly two triangles. Here is why STL makes that hard to verify, how the check actually works, and how to repair a mesh that fails it.

4 min read

"Watertight" sounds like a subjective quality judgement, but it has an exact definition: every edge in the mesh is shared by exactly two triangles. That single rule is what separates a surface that encloses a solid from a collection of triangles floating in space.

The three states an edge can be in

Walk every triangle in a mesh and count how many triangles use each edge. Each edge lands in one of three categories:

Triangles using the edge Meaning
Exactly 2 Correct — the surface continues cleanly across the edge
1 An open edge: a hole in the surface
3 or more Non-manifold: surfaces meet in a way no solid object can

A mesh where every edge has a count of two is closed and manifold. It encloses a definite inside and outside, which is what makes volume calculation valid and what lets a slicer decide where to put plastic.

Non-manifold edges are the harder case to visualise. They appear when an internal wall is left inside a model, when two separate shells are merged without cleanup, or when a surface is duplicated in place. Nothing looks wrong from the outside, but there is no consistent answer to "is this point inside the object?"

Why STL makes this awkward

STL has no concept of a shared vertex. Each triangle stores its own three corner points as raw floats. A cube's corner, touched by six triangles, is written six separate times — and because the exporter produced those numbers through its own transforms and rounding, the six copies are frequently not bit-identical.

So a naive edge count on a perfectly valid STL reports that every edge is open. The check only works after welding: grouping vertices that sit at effectively the same position into one.

The tolerance for that welding cannot be a fixed number. A 5 mm dental part and a 2 m architectural model need wildly different thresholds. A practical approach scales the tolerance with the model itself — for example, quantising vertex positions onto a grid sized relative to the bounding-box diagonal, with a floor so that tiny models do not collapse to a point. Too tight a tolerance and real duplicates survive; too loose and genuinely distinct detail gets merged.

This is worth knowing because it explains disagreements between tools. If Blender says a mesh is clean and another program reports 40 open edges, they are almost certainly using different welding tolerances rather than reading different geometry.

How to repair a mesh that fails

Ordered from least to most invasive:

  1. Merge by distance. In Blender, select everything in Edit Mode and use Mesh → Merge → By Distance. This alone fixes meshes whose only problem was unwelded duplicate vertices.
  2. Find the actual holes. Blender's Select → All by Trait → Non Manifold highlights the problem edges so you can see whether it is one missing face or a shredded surface.
  3. Fill small holes. MeshLab's hole-filling filter, or Blender's F key on a selected boundary loop, closes simple gaps.
  4. Automatic repair. Microsoft 3D Builder, Autodesk Netfabb and the repair step built into PrusaSlicer will fix most defects without you looking at the geometry. Convenient, but they can also alter detail you cared about.
  5. Remesh. For a badly broken scan, a voxel remesh in Blender rebuilds the surface from scratch. You get a guaranteed-closed mesh at the cost of sharp edges and exact dimensions.

After any repair, re-run the check. Repair tools sometimes close one hole by creating a non-manifold edge somewhere else.

Does it actually stop you printing?

Usually not. Slicers have spent two decades defending themselves against broken STL files and will happily produce G-code from a mesh with a few open edges. What you lose is trustworthiness:

  • Volume, surface area and weight estimates stop being meaningful.
  • Boolean operations in CAD software fail or produce garbage.
  • Large defects show up as missing walls, unexpectedly hollow sections, or cavities that get filled with infill.

If a model is going into production, or you are quoting a price based on material use, fix it first. Watertightness is one item on the broader pre-print checklist.

Checking without installing anything

Mes3D runs the weld-and-count check in a background worker and reports the open-edge count alongside volume, surface area and overhang ratio. Since parsing happens in your browser, confidential geometry never leaves your machine.

Frequently asked questions

What does watertight mean for a 3D model?

A watertight mesh encloses a volume with no gaps. Formally, every edge is shared by exactly two triangles. An edge used by only one triangle is a hole, and an edge used by three or more is non-manifold geometry.

How do I check whether an STL file is watertight?

Weld vertices that sit at the same position within a small tolerance, then count how many triangles use each edge. If every edge count is exactly two, the mesh is closed and manifold. Browser viewers, Blender, MeshLab and Netfabb all perform some form of this check.

Why does a mesh that looks fine report open edges?

STL stores each triangle independently, so corners that should be one vertex are written three or more times as separate floating-point values that may differ in the last decimal places. Without welding those duplicates first, every edge looks unshared. The tolerance used for welding has to scale with the model size.

Can I still print a model that is not watertight?

Often yes. Modern slicers repair small holes automatically and will produce usable G-code. But the volume and weight figures become unreliable, and larger defects cause missing walls or wrongly filled cavities, so it is worth fixing the mesh.

Open the 3D viewer

More guides

All articles