In the midst of the humidification season, I spotted this while refilling one of the ancient Sears Humidifier bottles:

While it’s possible to buy replacement caps, this seemed more appropriate:

It’s PETG-CF, of course:

The shape is a ring with a simplified model of the cap removed from the middle:

It fits snugly over the cap atop a thin layer of JB PlasticBonder that should hold it in place forevermore:

The other side shows the crack over on the right:

Close inspection showed a few smaller cracks, so that cap was likely an original.
I made another ring for the other cap, only to find it was slightly larger with a black washer inside: apparently a previous owner had replaced one of the caps. The OpenSCAD program has measurements for both, not that you have either.
The OpenSCAD source code as a GitHub Gist:
| // Humidifier bottle cap reinforcement | |
| // Ed Nisley – KE4ZNU | |
| // 2025-11-29 | |
| include <BOSL2/std.scad> | |
| Layout = "Show"; // [Show,Build,Cap] | |
| /* [Hidden] */ | |
| Protrusion = 0.1; | |
| //—– | |
| // Bottle cap/valve | |
| // Collects all the magic numbers in one place | |
| Left = false; // the caps are different, of course | |
| CapODs = Left ? [43.0,42.1] : [43.1,42.9]; // [0] = base of cap | |
| CapHeight = 10.0; | |
| Notch = [0.6,2.0,8.5 + Protrusion]; // Z + hack for slight angle | |
| NumRibs = 24; | |
| RibAngle = 90 – atan(CapHeight/((CapODs[0]-CapODs[1])/2)); | |
| echo(RibAngle=RibAngle); | |
| $fn=2*NumRibs; | |
| module Cap() { | |
| difference() { | |
| cyl(CapHeight,d1=CapODs[1],d2=CapODs[0],anchor=BOTTOM); | |
| for (a=[0:NumRibs-1]) | |
| zrot(a*360/NumRibs) | |
| right(CapODs[1]/2) down(Protrusion) | |
| yrot(RibAngle) | |
| cuboid(Notch,anchor=RIGHT+BOTTOM); | |
| } | |
| } | |
| //—– | |
| // Reinforcing ring | |
| RingThick = 3.0; | |
| module Ring() { | |
| render() | |
| difference() { | |
| tube(CapHeight,od=CapODs[0] + 2*RingThick,id=CapODs[1] – 2*Notch.x,anchor=BOTTOM); | |
| Cap(); | |
| } | |
| } | |
| // Build things | |
| if (Layout == "Cap") | |
| Cap(); | |
| if (Layout == "Build" || Layout == "Show") | |
| Ring(); | |
Spam comments get trashed, so don’t bother. Comment moderation may cause a delay.