How to fix holes and open edges in an STL
A hole in an STL is an open edge: an edge used by only one triangle instead of exactly two. The surface no longer encloses a solid, which is why your slicer calls the mesh not watertight. To fix it, stitch the boundary loops shut. SliceReady does that in your browser, free, with nothing uploaded.
The model looks perfect. It renders beautifully, it spins in the preview, every surface is there. Then the slicer loads it, calls it not watertight, and you are left with a file that looks finished and behaves like it is full of gaps.
It is full of gaps. You just cannot see them. Nearly every "not watertight" STL is broken by a handful of missing triangles too small to notice, and the fix has nothing to do with modelling skill. It is plumbing.
What an open edge actually is
A triangle mesh describes a solid by wrapping a skin around it. For that skin to hold, every edge must be shared by exactly two triangles: this face and the one next to it. That is the whole rule. An open edge is an edge only one triangle uses. Its neighbour is missing, so the skin stops there.
A run of open edges joined end to end forms a boundary loop — the rim of a hole. That rim is what a repair tool has to sew shut. And "not watertight", "has holes" and "has open edges" are not three problems. They are three names for this one.
Here is the part that catches people out: the hole is almost never a crater. Picture a single missing triangle on a smooth curve, tucked under an overhang. Your eye will never find it. Your slicer finds it immediately, because it is not looking at the model — it is counting edges.
Why a hole stops your slicer
A slicer cuts your model with a stack of horizontal planes and fills what falls inside the outline on each one. To do that it must answer one question for every point on every layer: inside, or outside? A closed surface answers with no ambiguity. Trace a ray outward and count how many times it crosses the skin. Odd number, you were inside. Even, outside.
Now punch a hole in the skin. The ray slips straight through the gap without crossing anything, and the count comes back wrong. Inside and outside bleed into each other. There is no right answer to give, so the slicer either refuses the file or picks one and hopes.
When it hopes, you get the classic failures: walls that vanish for a few layers, infill floating in mid-air, a solid model that prints as a paper-thin shell. An open edge is one of the three defects that make a mesh non-manifold, and if that word turned up in your slicer's warning too, we cover all three in the guide to fixing a non-manifold STL.
Why holes appear in the first place
You did not necessarily do anything wrong. Holes are a byproduct of how meshes get made and moved around.
- Export and conversion. Every hop between formats is a translation, and translations lose things. A model that was watertight in its native format can come out of an STL export with faces missing along a seam.
- Boolean operations. Cutting one solid out of another has to rebuild the surface along the intersection. When the maths lands on an awkward edge, the rebuild leaves a gap.
- Decimation. Reducing triangle count means collapsing edges. Collapse the wrong one and the neighbouring faces no longer meet.
- Scans and photogrammetry. A scanner only sees what it can see. The underside where the object met the ground was never captured, so the mesh arrives with an open bottom — usually the largest hole you will ever close.
- AI generators. Text-to-3D tools are rewarded for output that renders well, and a good render does not require a closed volume. Holes are routine. That is the whole story of the AI model that won't print.
How to fix holes in your browser — step by step
SliceReady runs ADMesh compiled to WebAssembly, locally, on your own machine. The file never leaves the browser, because there is no server for it to go to.
- Open SliceReady and drop your STL or 3MF onto the page.
- The mesh is analysed and the open edges are counted, then highlighted on the model so you can see where the surface is torn — including the gaps that are invisible at normal zoom.
- The repair runs. It walks each boundary loop and stitches it shut, and you get a ledger in plain language: exactly how many were closed, and what else was corrected along the way.
- Download the repaired STL and load it back into your slicer.
What it will not do, and will not pretend to do. SliceReady repairs topology: open edges, flipped normals, degenerate triangles. It does not thicken thin walls, hollow a model, remesh it, rescale it, or sculpt anything. Those change the shape, and a tool that quietly changes your shape is a tool you cannot trust.
When a repair does not fully succeed, the report says so in as many words: "Partially fixed — this mesh is still not watertight." A repair that failed does not get to call itself repaired.
When a hole cannot be closed automatically
Stitching works when there is a rim to stitch. Two cases break that assumption.
The first is a genuinely missing region. If a scan lost an entire flank of the object, no algorithm can recover what was never recorded. It can only span the gap, which is right for an open-bottomed scan and quite wrong for a curved surface. The second is a self-intersecting boundary, where the rim of the hole crosses itself. There is no obvious way to close it, and a tool that picks one anyway is guessing on your behalf.
In both cases the report says what is left open rather than declaring victory. That is when the file goes to a desktop tool — Blender or similar — and you bridge the gap yourself, because you are now deciding what the surface should be. That decision is yours.
Check it worked
Never take a repair tool's word for it, ours included. Load the repaired STL back into your slicer and look for two things.
- The warning is gone. Cura, OrcaSlicer and Bambu Studio all tell you when a model is not watertight or needs repair. Silence is the signal you want.
- The layers hold up. Scrub the layer preview to roughly half the model's height and read the cross-section. You want continuous, closed walls. Walls that vanish for a few layers, or infill with nothing enclosing it, mean something is still open.
Clean slice, no warning, solid walls in the preview. That is a watertight STL, and it is the whole job.
Frequently asked questions
What does "not watertight" mean?
It means the surface does not fully enclose a volume. Somewhere in the mesh an edge is used by one triangle instead of two, so there is a gap in the skin. "Not watertight", "has holes" and "has open edges" are the same fault under three names. Fill the gaps and the warning goes away.
Can Cura close holes in an STL?
Cura will often slice a model it has flagged as not watertight, but it is patching the gap as it goes, not repairing your file. The STL on disk is still broken, and a model that gets away with it at one layer height can fall apart at another. Fix the topology first.
How do I know if my STL has holes?
Not by looking — that is the trap. A renderer only draws the triangles facing the camera and never asks whether they close, so a mesh full of holes can look flawless. You need a count of open edges. Drop the file into SliceReady: it counts them and highlights them on the model before it changes anything.
Can holes be fixed without Blender?
Yes, and for most files Blender is overkill. Closing a boundary loop is mechanical topology work that needs no modelling skill and no install. SliceReady does it in the browser with WebAssembly, on your machine, nothing uploaded. Save Blender for the jobs that change the shape.
Got an STL full of holes?
Drop it into SliceReady. Open edges get counted, highlighted and stitched shut in your browser, nothing is uploaded, and the report tells you the truth about what was closed and what was not.