Drain hair catchers, and the dome that tore in the slicer
11 October 2026
Drain hair catchers came up in the same round of Reddit reading as lens caps. Three threads about them had 950, 385 and 326 upvotes. On Printables the advice under strainer models was to rescale them yourself, which works until the slots grow with the rest. I could not find a generator for them. Now there is one, the Drain Hair Catcher Generator.
Measure the hole
There are two kinds of part. An insert drops into the drain hole of a sink or a bathtub. A cover lies on top of a shower drain or its grate, round or square.
The insert was the interesting one. A flat flange on a basket overhangs 90 degrees whichever way you print it, so it needs supports. Instead I gave the flange a 45° seat underneath. The basket prints bottom down, the seat climbs out from the wall at 45° and holds the flange up, and in the sink the same cone rests on the edge of the hole and centres the basket. There is a cost. On a 40 mm hole with a 4 mm flange, the top of the flange stands about 5 mm above the sink. I took that over supports.
Slots are 1.5 mm by default. That stops hair and does not clog with soap, and you can go from 1.2 to 3 mm. The pattern can be radial slots, round holes or a honeycomb. A centre hole lets the stem of a pop-up stopper through, and a knob or an ear with a finger hole lifts the thing out.
Covers can be flat or have a low dome up to 15 mm. For grip on wet tiles I wanted a foot, but a foot under a flat plate is another overhang. So the cover gets a 2.4 mm groove under the rim and a separate TPU ring presses into it.
The dome, three times
The first domed covers were a revolved profile with the openings cut out of it, and the small ones failed. A 30 mm cover with honeycomb openings came out watertight, then tore when I loaded the STL back the way a slicer does. Cutting a hexagon into a curved surface leaves intersection points next to the surface's own vertices, and some of them are close enough for an STL loader to merge.
Second try: extrude the flat plate with its holes, refine the mesh, bend it into the dome. That broke the large square covers instead. A probe found 15 vertices at exactly the same coordinates, and after I turned the grid a little to break things up, 469. The hexagon corners sit in straight columns, the triangulation fills those columns with zero-area triangles, and refining them dropped new vertices right on top of old ones.
The third version builds the cover mesh by hand. One constrained Delaunay triangulation of the outline with all its holes is the bottom face, a copy of it is the top, and every edge of every opening gets a wall of two triangles. Then each top vertex is lifted to the dome height at its radius. Nothing is ever cut through a curve, so nothing is left to merge. The default 90 mm cover also dropped from about 60,000 triangles to 10,000, which the server notices more than you do.
Then the fuzz test ran 400 random configurations and two failed, both on the basket. An edge knob as wide as the flange touched the flange's outer wall exactly, and tangent surfaces are another way to tear a mesh. The knob now stays 0.4 mm inside both edges, and 800 more random runs came out clean. Earlier, a short ear handle had its round top reach below its own base, through the plate and down to the bed. That one I spotted by reading the bounding box numbers.
Where it stops
A 250 mm square cover with 1.2 mm holes and 1.2 mm bars is 11,412 openings, and an earlier version of the code needed 1.4 GB for it. Too many. The generator stops at 6000 and says how many you asked for. The page works out the same estimate as the server, so it refuses before sending anything. A 250 mm round cover with the default slots has 4722 openings and peaked at 380 MB in its container.
I have not put a printed basket in a real drain yet. If the clearance is off for yours, the fit-test ring takes a few minutes, and the report button sends me the settings you used.