I eventually tracked a distressingly loud rattle from the BOB Yak trailer to a fender mount failure:

The screw clamped the round aluminum fender between two flat washers (the other of which has been touring the workbench). The hole in the aluminum started as a screw slot and eventually fretted away around the edge of the washers, leaving a trapped fragment to fall out as I loosened the screw.
Well, this mount lasted a decade longer than the wire mount at the top of the fender, so there’s that.
As before, a bit of math conjures a chunky mount from the vasty digital deep:

The first iteration didn’t have the hole for the threaded insert angled downward at 10°, but it’s easier to make better measurements with a “pretty close” prototype. I’m reasonably sure the angle is a glitch due to hand-brazing the frame tubes, but we’ll never know.
The inner plate angles to match the insert, thus keeping the screw & washer perpendicular to the surface:

A brim around that chip of plastic ensures a good grip on the platform:

I suppose rounding the corners would make it prettier:

The original screw was slightly too short, so that’s a shiny replacement from the Drawer o’ Random M5 Screws. If I ever have occasion to go in there again, I’ll use a button head screw, although there’s certainly enough clearance:

From the top, the gray PETG-CF looks like it grew there:

I figured the mount’s radius by feeding measurements into the chord equation and assuming the overall curve is circular; the radius came out slightly too large, which likely won’t make much difference.
The OpenSCAD source code as a GitHub Gist:
| // BOB Yak Trailer – fender front mount | |
| // Ed Nisley – KE4ZNU | |
| // 2026-06-15 | |
| include <BOSL2/std.scad> | |
| Layout = "Show"; // [Build,Show,Frame,Fender,OuterMount,InnerMount,Mounts] | |
| /* [Hidden] */ | |
| ID = 0; | |
| OD = 1; | |
| LENGTH = 2; | |
| HoleWindage = 0.2; | |
| Protrusion = 0.01; | |
| NumSides = 4*3*2*4; | |
| Gap = 5.0/2; | |
| $fn=NumSides; | |
| WallThick = 5.0; | |
| Washer = [6.0,16.0,1.5]; // M5 fender washer | |
| Rivnut = [5.0,10.3,1.5]; // M5 rivnut in frame | |
| FrameOD = 16.1; // trailer frame tubing | |
| FrameAngle = 10; | |
| FenderOA = [52,440,1.5]; // minor major thickness | |
| BlockOA = [0,40.0,1.25*Washer[OD]]; | |
| //—– | |
| // Define things | |
| // Relevant part of the trailer frame | |
| // origin at center of rivnut | |
| module Frame() { | |
| yrot(FrameAngle) | |
| union() { | |
| left(Rivnut[LENGTH]) | |
| ycyl(2*BlockOA.y,d=FrameOD,anchor=RIGHT); | |
| xcyl(FrameOD/2,d=Rivnut[OD],anchor=RIGHT); | |
| left(Protrusion) | |
| xcyl(10,d=Rivnut[OD],anchor=LEFT); | |
| } | |
| } | |
| module OuterFender() { | |
| torus(od=FenderOA[OD],d_min=FenderOA[ID],orient=FRONT,anchor=LEFT); | |
| } | |
| module FullFender() { | |
| difference() { | |
| OuterFender(); | |
| right(FenderOA[LENGTH]) // make it a cup | |
| torus(od=FenderOA[OD] – 2*FenderOA[LENGTH],d_min=FenderOA[ID] – 2*FenderOA[LENGTH], | |
| orient=FRONT,anchor=LEFT); | |
| right(FenderOA[ID]/2) // remove inner half | |
| ycyl(2*BlockOA.y,d=FenderOA[OD] – FenderOA[ID],anchor=LEFT); | |
| down(2*Washer[OD]) // remove bottom part | |
| cuboid(2*[FenderOA[OD],FenderOA[OD],FenderOA[OD]],anchor=TOP+LEFT); | |
| } | |
| } | |
| module OuterMount() { | |
| difference() { | |
| right(FenderOA[ID]/2) | |
| cuboid([FrameOD/3 + Washer[LENGTH] + FenderOA[ID]/2,BlockOA.y,BlockOA.z], | |
| rounding=1.0,anchor=RIGHT); | |
| Frame(); | |
| OuterFender(); | |
| } | |
| } | |
| module InnerMount() { | |
| difference() { | |
| render() | |
| intersection() { | |
| yrot(FrameAngle) | |
| cuboid([WallThick + FenderOA[LENGTH],BlockOA.y,BlockOA.z],anchor=LEFT); | |
| right(FenderOA[LENGTH]) | |
| OuterFender(); | |
| } | |
| yrot(FrameAngle) | |
| xcyl(FenderOA[ID],d=Washer[ID],anchor=LEFT); | |
| } | |
| } | |
| //—– | |
| // Build it | |
| if (Layout == "Frame") { | |
| Frame(); | |
| } | |
| if (Layout == "Fender") { | |
| FullFender(); | |
| } | |
| if (Layout == "OuterMount") { | |
| OuterMount(); | |
| } | |
| if (Layout == "InnerMount") { | |
| InnerMount(); | |
| } | |
| if (Layout == "Mounts") { | |
| OuterMount(); | |
| InnerMount(); | |
| } | |
| if (Layout == "Show") { | |
| OuterMount(); | |
| InnerMount(); | |
| color("Gray",0.6) { | |
| Frame(); | |
| FullFender(); | |
| } | |
| } | |
| if (Layout == "Build") { | |
| up(BlockOA.z/2) left(FenderOA[ID]/4) | |
| OuterMount(); | |
| up(BlockOA.z/2) | |
| xrot(180) | |
| yrot(-FrameAngle) | |
| InnerMount(); | |
| } |
Spam comments get trashed, so don’t bother. Comment moderation may cause a delay.