Non-Manifold Edges: Why Sealing Every Hole Does Not Clear the Error

Published 2026-08-20

You seal every hole. You run the repair. The model reports as closed, and the slicer throws exactly the same error it threw before. At this point most people conclude their software is broken, and go looking for a different repair tool.

The software is fine. The problem is that the error was never about holes.

What the error is actually telling you

A surface mesh is manifold when its topology could describe a real physical surface without ambiguity. In practice that reduces to two conditions. Every edge is shared by exactly two faces, and the faces around every vertex form a single continuous fan rather than several fans meeting at a point.

The formal version, if you want it, is that the neighbourhood of every vertex must be homeomorphic to a disk, with boundary vertices allowed a half disk. David Stutz’s formal definition of watertight meshes works through this carefully, and MathWorks documents the same distinction in the isWatertight function reference. Both keep watertightness and manifoldness as separate tests, because they are separate tests.

Two examples make the difference concrete, and between them they cover the cases that confuse people.

Manifold but not watertight. A single flat plane. Every one of its interior edges has two faces, every vertex neighbourhood is a proper disk or half disk, so it satisfies the manifold conditions completely. It also encloses no volume whatsoever. A slicer can do nothing with it.

Watertight but not manifold. Two sealed cubes, positioned so they touch at exactly one corner. Both volumes are perfectly closed. Nothing leaks. But the shared vertex has two separate fans of faces meeting at a single point, which no disk can be mapped onto. The same thing happens on an edge when two solids meet along a line rather than a point: that edge now has four faces instead of two.

This second case is the one that generates the support threads. Nothing about the model looks open, because nothing is open.

That number is counting something

Bambu Studio and OrcaSlicer report the condition with a number attached, and it reads like an error code. It is not one. The Bambu Lab community forum has separate threads titled Error 11376 Non-manifold Edges, Error 776 non-manifold edges, and Error 646, all describing the same situation with the same symptoms.

Three different codes for one condition would be strange. Three different counts for three different models is not.

Can you just print it anyway?

Frequently, yes. This deserves saying plainly because the warning is worded as though it were fatal.

Slicers do not evaluate your mesh as a solid. They intersect it with a horizontal plane at every layer height and trace the resulting closed loops, which become perimeters. If a defect sits entirely within the interior of the volume, that intersection never reaches it. The outer loop closes normally, the perimeter is generated normally, and the infill fills as instructed.

So the decision does not come from the import dialog. It comes from the preview after slicing:

  • Step through layers rather than looking at the final render. A defect that drops geometry usually drops it on a handful of layers, which the completed preview hides.
  • Look hardest at thin walls, small raised details, and any place two parts of the model join. These are where an interior defect is closest to the surface.
  • Watch for regions that fill when they should be hollow, or stay hollow when they should fill. Both mean the slicer resolved the inside and outside differently from how you intended.
  • If nothing is missing and nothing unexpected is solid, the warning has told you about geometry that does not affect this print.

The reason to check rather than repair reflexively is that automatic repair is itself a destructive operation. The same forum has threads about repair removing walls from a model that sliced acceptably before it ran.

What each slicer does about it

The condition is universal. How each slicer reports it, and what it offers to do about it, is not.

Bambu Studio and OrcaSlicer

Validation runs at import. A defective model gets an orange warning badge next to its name in the object list, and clicking the badge offers to repair.

That repair is not Bambu Lab’s own code. It calls into a model repair capability that Windows provides at the system level, which matters more than it sounds.

Mac and Linux have no repair button

Because the repair is a Windows system service, it does not exist on other platforms. There is no button to press, and depending on the build you may be pointed at third party software instead.

This is acknowledged rather than obscure. The BambuStudio repository carries several issues on it, including 1585, 6714 requesting the repair tool for macOS specifically, and 11174 from a user who found that videos showed an option their Mac did not have.

If you are on macOS or Linux, the practical routes are:

  1. Blender’s 3D Print Toolbox, covered below. Free, bundled, and the only option here that also shows you what is wrong before changing anything.
  2. MeshLab, which handles the topology directly and can be scripted for repeat offenders.
  3. A browser based repair service, adequate for a simple part, though you are uploading your model to do it.

None of these is a workaround for a missing feature so much as the normal way to do it. The Windows button is the convenience, not the standard.

PrusaSlicer

PrusaSlicer surfaces the same class of problem with a warning icon in the plater, and its repair command was long labelled “Fix through Netfabb”. The name confuses people who go looking for Netfabb and find an Autodesk product they do not own.

The explanation is historical. The repair technology Windows ships originated with netfabb, which Autodesk later acquired, and the menu string kept the name. Newer builds have moved away from that branding while calling the same underlying system capability, which means it carries the same platform limitation.

Cura

Cura takes a different approach, with no error code and no repair button. Problems show up as behaviour: dropped perimeters, or regions that fill unexpectedly.

Its diagnostic is visual. Switch the preview to X-Ray view, and areas where the geometry fails to enclose a volume render in red. Rather than repairing the mesh, Cura offers slicing settings that change how ambiguous geometry is interpreted, grouped under Mesh Fixes in the print settings:

  • Union Overlapping Volumes, which treats intersecting shells as one solid instead of trying to resolve them separately.
  • Extensive Stitching, which makes a more aggressive attempt to close gaps in the shell during slicing.
  • Keep Disconnected Faces, which stops Cura discarding faces it cannot connect.
  • Remove All Holes, a blunt instrument that ignores interior boundaries entirely.

These change the interpretation for this slice only. The file is untouched, which is either the advantage or the drawback depending on whether you need to print it once or ship it to someone.

Why the repair sometimes does not stick

A recurring complaint is that repair works, the file is exported, and reopening it brings the same error back. An equally common reply is that this never happens. Both are accurate, and the difference is the model.

The Error 11376 thread resolves this. The user’s model came from Tinkercad, and as another participant points out, Tinkercad exports solid bodies as hollow shells. Cutting a model there exposes a face and produces an open boundary that survives repair, because the shell was never a closed solid to begin with.

So whether a repair persists depends on what was wrong. A stray internal face can be deleted permanently. A model that is structurally a hollow shell will keep producing the same condition every time it is opened, and the fix has to happen where the model was made.

Finding it in Blender

Blender will not tell you the model is broken. It also has the best diagnostic tools of anything mentioned here, because it can show you which edges are involved and why.

The six checkboxes nobody reads

In Edit Mode, use Select then Select All by Trait then Non Manifold. The operator panel in the lower left corner then offers a set of checkboxes, and they matter: each one targets a different violation, and leaving them all enabled tells you that something is wrong without telling you what.

CheckboxWhat it selectsWhat it usually means
WireEdges with no face attachedLeftover geometry from a deleted face, or a modelling operation that produced an edge and nothing else
BoundariesEdges belonging to one face onlyAn actual hole, or an intentionally open surface
Multiple FacesEdges with three or more facesAn internal wall, or two solids merged without a boolean
Non ContiguousEdges where adjacent normals disagreeFlipped faces, common after mirroring or importing
VerticesLoose vertices, and bowtie verticesTwo face fans meeting at a point
ExtendNothing on its ownAdds to the current selection instead of replacing it

Turning on one at a time is the entire diagnostic. If Boundaries finds nothing but Multiple Faces lights up, you do not have a hole and no amount of hole filling will help. That single distinction is the one this article opened with.

Fix by cause, not by button

Each violation has its own correct fix, and the reason auto repair disappoints is that it applies one strategy to all of them.

  • Boundaries. Select the border loop and fill it. A simple opening takes F. A large or curved one wants Grid Fill, which produces sensible topology instead of one enormous n-gon.
  • Multiple Faces. Usually an internal wall, from joining two objects that overlapped or applying a mirror without merging. Switch to wireframe or X-Ray, select the enclosed faces, and delete them. They are invisible in solid view, which is why they survive so long.
  • Non Contiguous. Select all and recalculate normals outward. Do this after the topology is right, not before, since the calculation depends on a coherent surface.
  • Vertices. Merge by Distance with a small threshold, then Delete Loose for anything still floating.

The origins are worth recognising so you can stop producing them. Extruding an edge that is already part of a closed surface gives it three faces. A Mirror modifier whose merge threshold is too small leaves two shells overlapping at the seam. Solidify on a surface with tight concavities makes the offset geometry intersect itself. Boolean operations on a mesh that is already open fail because the solver cannot determine which side is inside.

What Make Manifold actually does

The bundled 3D Print Toolbox add-on has a Make Manifold button, and it is worth understanding before trusting it.

It works iteratively. Non-manifold vertices are selected and treated as holes, then filled. Filling can create new non-manifold vertices, so those get deleted. Deleting can open new holes, so it fills again, and it loops until nothing is left to find.

The loop terminates, and the result is a closed shell. What it is not is a repair that understands your model. Every step is a local decision with no notion of which openings you meant to keep, which is why it will happily seal a deep recess or bridge a tolerance gap on its way to convergence. It is a good last resort for a model you cannot fix at source, and a poor first move on anything dimensional.

In CAD the same thing has three different names

Solid modelling kernels are supposed to make this impossible. A boundary representation solid is manifold by construction, so instead of reporting a broken mesh, CAD refuses the operation that would break it.

The catch is that each package describes it differently, which is a large part of why the answer is hard to search for.

SoftwareWhat it saysWhat triggered it
SOLIDWORKS”Unable to create this feature because it would result in zero-thickness geometry”A cut exactly tangent to a hole, or two bodies meeting along an edge with no material between them
Rhino”Intersection curve ends at a non-manifold edge”A boolean where surfaces are coincident or touch exactly, so the intersection curve has nowhere to go
FreeCADA BRepCheck_NonManifoldEdge exception from the OpenCASCADE kernelKnitting or fusing surface patches that do not resolve into an unambiguous solid

Rhino’s wording is the one that shows up in searches most often, and McNeel’s own Boolean FAQ confirms it belongs to Rhino rather than to the CAD world generally. If you searched that exact sentence and landed on SOLIDWORKS advice, this is why.

The fix is the same in all three, and it feels wrong the first time: stop trying to make the geometry touch exactly. Offset one body by a fraction of a millimetre so the intersection has measurable volume, or clear the merge option so the bodies stay separate. The kernel is not being fussy. An edge with zero thickness has no defined answer for which faces bound which solid.

One consequence catches people later. Exporting a body that contains unstitched surfaces to STL does not fix anything. Tessellation just converts the defective surfaces into defective triangles, and the slicer reports non-manifold edges on a file that came out of a CAD package. The mesh is not where the problem started.

Repairing it from a script

For a batch of files, or a pipeline that has to run without supervision, pymeshlab is the standard tool. Its filter for this has been renamed twice, which is why so much example code online raises an unknown filter error.

EraFilter name
Earlyrepair_non_manifold_edges_by_removing_faces and repair_non_manifold_edges_by_splitting_vertices
From 2021.10Merged into repair_non_manifold_edges
From 2022.2Category prefix added, giving meshing_repair_non_manifold_edges

The current pair of calls, with the argument types that actually work:

import pymeshlab as pml

ms = pml.MeshSet()
ms.load_new_mesh('defective_model.stl')

# Split vertices that join two separate face fans.
ms.meshing_repair_non_manifold_vertices(vertdispratio=0)

# Remove the faces that give an edge more than two neighbours.
ms.meshing_repair_non_manifold_edges(method=0)

ms.save_current_mesh('repaired_model.stl')

The method argument takes an integer, not a descriptive string. Several tutorials pass text here, which fails.

Order matters. Repairing vertices first splits apart the fans that share a point, which sometimes resolves edges that would otherwise have faces deleted. Running edges first removes geometry that vertex repair could have saved.

The same operations exist in the MeshLab GUI under Filters, Cleaning and Repairing, if you would rather see the result before committing to it.

A newer source of the problem

Most of the causes above are modelling mistakes. There is now a category that involves no modelling at all, and it produces non-manifold geometry at a rate the classic causes never did.

Image to 3D and text to 3D generators do not build a mesh face by face. They optimise a continuous volumetric field, a signed distance field or something similar, and then extract a surface from it with Marching Cubes, Dual Contouring or a differentiable variant. The mesh is a by-product of that extraction, and its topology is whatever the extraction produced.

Two things follow from that. When a generated feature is thinner than the extraction grid’s resolution, both sides of that thin wall land in the same cell, and the algorithm has to resolve a contradiction inside a single voxel. Pinched geometry, self intersection and bowtie vertices come out of exactly those cells. Separately, the loss functions these models train against measure visual agreement, usually against rendered images. Nothing in that objective rewards manifold topology, so there is no pressure during training to produce it.

This is not a theoretical concern. Production pipelines treat mesh repair as a required step rather than an optional one: 3DTopia-XL calls meshing_repair_non_manifold_edges and meshing_repair_non_manifold_vertices in its own mesh utilities, alongside decimation and duplicate removal. Newer extraction methods such as FlexiCubes improve topological fidelity substantially, but the cleanup pass is still there.

Working in the image to 3D field, the failure I see most often is not the generator producing something visibly wrong. It is a model that renders beautifully, passes review, and then stops at the slicer, because the surface that looks correct is topologically ambiguous underneath. The rendering never had to answer which side was inside. The printer does.

Frequently asked questions

What does the number in "Error 11376 non-manifold edges" mean?

It is a count of the offending edges in your model, not an error code. The Bambu Lab community forum carries separate threads for 11376, 776 and 646, all describing the same condition, which is why searching the number rarely helps: yours will be different from everyone else's. A large number is not proportionally worse than a small one either. One badly placed internal wall in a dense mesh can account for thousands of edges.

Can I print a model with non-manifold edges?

Often yes. Slicers work by intersecting the mesh with a horizontal plane at each layer height, so a defect that sits entirely inside the solid never reaches the outer boundary the toolpath follows. The check that decides it is the sliced preview, not the import warning: step through the layers and look at thin walls, small details and anywhere two parts join. If the perimeters are continuous and nothing is missing or unexpectedly filled, the warning can be ignored.

Why is the repair button missing in Bambu Studio on Mac?

Because the repair is not Bambu Lab's own code. Windows ships a system level 3D model repair capability that the slicer calls into, and macOS has no equivalent for it to call. This is a long standing and acknowledged gap, tracked across several issues in the BambuStudio repository including 1585, 6714 and 11174. Mac and Linux users need to repair the mesh in something else first, such as Blender's 3D Print Toolbox or MeshLab.

Is a non-manifold mesh the same as a mesh that is not watertight?

No, and conflating them is why sealing holes sometimes changes nothing. Watertight describes whether the surface encloses a volume. Manifold describes whether the topology around every edge and vertex is unambiguous. A flat plane is manifold but not watertight. Two sealed cubes touching at a single corner are watertight but not manifold, because that shared vertex belongs to two separate fans of faces rather than one continuous disk.

What is the current pymeshlab filter name for repairing non-manifold edges?

meshing_repair_non_manifold_edges, with meshing_repair_non_manifold_vertices as its companion. The name has changed twice. Two filters ending in by_removing_faces and by_splitting_vertices were merged into repair_non_manifold_edges in 2021.10, and the meshing_ category prefix was added in 2022.2. If a tutorial's code raises an error about an unknown filter, the tutorial predates one of those renames.