◧ print-bench

Alcove rod socket

A parametric, two-part screw-together end socket for a 40 mm round curtain/closet rod spanning a recess or alcove, used in pairs: a wall boss screwed flat to each facing wall, the rod's ends plugging into knurled collars that hand-thread onto the bosses. Removing the rod for washing = unthread the collar, no tools. Brief: issue #355 (reworked from MakerWorld #1200171, a 2-part fixed-STL 25 mm holder, scaled intent not mesh).

Overview

Product shot

Product Hero Studio render 1 / 7

Product shot

A parametric, two-part screw-together end socket for a 40 mm curtain or closet rod that spans a recess or alcove. A wall boss screws flat to each facing wall; the rod's ends plug into knurled collars that hand-thread onto the bosses. Curtains down for washing = unthread two collars, no tools.

v2 — ships the separable multi-object plate deliverable. v1 (#361) printed fused in the field (a single STL of the two parts slices as one welded body); v2 fixes the packaging, geometry unchanged. See Deliverable below and the field test log in NOTES.md.

What you get

Printed in pairs (one holder per wall, one pair per rod):

  • boss — the wall plate: Ø58.8 × 18 mm disc with a countersunk M5 screw hole and an external printed thread (an optional second off-axis screw setting, screw_count=2, grows the flange for heavier installs — a hung pair over ~10 kg; see Assembly).
  • collar — the rod socket: Ø54 × 40.6 mm knurled tube, internal printed thread below, Ø40.6 rod bore above (default engagement_depth=28).
  • collar-shallow — the same collar at engagement_depth=12 (far side of the push-in-deep / drop-in-shallow install). Gated and shipped in the Release; not on the plate (the plate is the default-depth holder pair).
  • thread-coupon / bore-coupon — the "print this first" fit checks (see Print settings).

Deliverable — two objects, never one fused STL. boss and collar print as separate parts, and the one rule is: keep them as two distinct objects in the slicer. STL carries no object separation, so exporting the two into a single STL imports as one fused body and welds them together — v1's field-test failure (NOTES.md). Two ways to get the parts, both give the separation:

  • Downloaded a Release (the usual path): v2.0 ships the gated per-part STLs — alcove-rod-socket-boss.stl, alcove-rod-socket-collar.stl, alcove-rod-socket-collar-shallow.stl, plus the two coupons (alcove-rod-socket-coupon.stl, alcove-rod-socket-bore-coupon.stl), a zip, and a checksum manifest. Import what you need and keep them as separate objects. The plate is still the default-depth holder pair (boss + collar); grab collar-shallow from the same Release for the far side of the push-in-deep / drop-in-shallow install. There is no multi-object plate .3mf on that Release (only STLs / zip / manifest) — the plate stays a local build artifact (see the clone path below). That is a tracked follow-up: the platform release-bundle does not upload the multi-object plate 3MF today.
  • Cloned the repo (advanced / local): ./scripts/plate.sh alcove-rod-socket bundles the two default-depth parts into one multi-object 3MF (build/alcove-rod-socket-plate.3mf) — the same two objects in one file. For the far-side shallow collar, run ./scripts/gate.sh alcove-rod-socket (or --slice) and take the gated STL at build/alcove-rod-socket-collar-shallow.stl — that is the printcheck'd artifact, not a hand-render. Advanced override only: -D 'part="collar-shallow"' if you need to re-export outside the gate.

Either way, saving bed space is fine — lay the two parts side by side and flat (the plate's --merge does exactly that). Don't stack them one on top of the other: two separate objects stacked vertically still print the upper one over open air — the ~10-layers-in spaghetti from v1.

A rod takes a pair — two holders, so print (or import) the set twice. For the push-in-deep / drop-in-shallow install (Assembly step 3, Parameters table) the two holders share the same boss; only the far holder's collar differs — use collar-shallow (engagement_depth=12). So a deep+shallow pair is two bosses + one default collar + one shallow collar.

Twice can be one print. Import the boss and default collar STLs from the Release (or both objects from a local plate.sh 3MF), select both → right-click → Add Duplicate, then swap one of the two collars for collar-shallow from the same Release — so the run is boss ×2, one default collar, one shallow. One pair (~113 × 59 mm of bed for a boss beside a collar) fits any 150 mm bed; two pairs want the 256 × 256 mm P2S.

  • Material: PETG or ASA for a permanent, load-bearing install — PLA creeps under sustained load, and a hot south-facing window is the one-strike failure. Both want a retune, measured on the coupons: PETG prints the thread slightly fatter, so expect thread_tol +0.05–0.1 mm vs PLA; ASA shrinks the bore ~0.2–0.4 mm — about the whole slip — so print the bore coupon in ASA first and expect +0.1–0.2 mm on rod_clearance (a material-specific preset is charter backlog B4).
  • Layer height: 0.2 mm, 0.4 mm nozzle.
  • Perimeters: 3 — the 3.2 mm walls carry the load.
  • Seam: Scarf (Bambu Studio) or Back — the default Aligned seam stacks a ridge up the printed threads and inside the rod bore, and that ridge can locally eat the 0.3 mm radial sliding fit.
  • Infill: 20% gyroid.
  • Supports: none needed anywhere, by design.
  • Bed adhesion: brim the collar (and collar-shallow), per-object (Bambu Studio and most slicers brim per object — select just the collar). Its first layer is a thin ~2.2 mm annular rim carrying a 40.6 mm tube, the part that can lift; the boss doesn't need it — it prints flange-down on a full Ø58.8 disc, the best contact on the plate. Cheap insurance on the collar rim's own merits (the v1 field failure was packaging, not adhesion — see NOTES.md — so the plate is what fixes that; the brim is separate). A per-object collar brim can't reach the ~5.7 mm gap to the boss, so nothing bridges. (Brim the whole plate instead and the two brims may meet in one web; it should peel clean, but that is untested — predicted, not observed, and the proving print is what confirms it. Per-object avoids the question.) Trim the collar's brim tabs flush and set it on a flat surface to confirm the rim sits flat before threading it onto the boss — the rim is both the bed-contact face and the seating face on the flange.
  • Orientation: print every part as rendered — boss flange-down, collar (and collar-shallow) rod-mouth-down (the internal thread prints at the top of the collar, never on the first layer). Never flip the collar grip-band-down for a nicer face: the printed thread has to stay up top. If the collar's first-layer ring lifts, fix it with the brim above — don't flip the part.
  • Print order: both coupons first, then tune (below), then a pair (deep+shallow: two bosses, one collar, one collar-shallow).

The gate scores the boss / collar / collar-shallow / thread-coupon set with the same thin-wall warning pattern (tessellated thread crests and knurl ridges under 0.8 mm on a few percent of sampled surface; the bore coupon is clean) — collar-shallow is 54×54×24.6 mm at printcheck 92/100, matching the default collar's pattern. That is by design and needs no slicer action. The coupon carries the same profile, so a coupon that prints clean says the parts will too.

Measure your pole with calipers where it will sit and set rod_d to that barrel reading — "40 mm" is sometimes the finial size, not the pole.

Parameters

The ones you are most likely to touch (all in alcove-rod-socket.scad, Customizer-grouped; override on the command line with -D 'rod_d=38.5' — and pair it with -D 'part="collar"' or -D 'part="collar-shallow"', or you'll export the fused assembly preview instead of a printable part):

ParameterDefaultWhat it does
rod_d40.0 mmrod barrel outer Ø where it sits in the socket
rod_clearance0.6 mmdiametral slip added to rod_d → socket bore
engagement_depth28 mmdeep-side rod plug depth (collar); far side is the gated collar-shallow part at 12 mm
thread_tol0.3 mmradial thread fit — dial on the thread coupon
screw_count11 central M5, or 2 off-axis (grows the flange; stops boss spin)
knurl_flutes36grip flute count — guarded to keep flutes printable
wall3.2 mmstructural wall everywhere

Sizes other than the default 40 mm rod are untested — the geometry scales, but the fits are only proven at 40 mm, and the coupons are the proof: print them in your material first and trust them over this page.

Assembly & use

  1. Screw a boss to each facing wall, countersunk M5 head flush in the neck. Screw length: the boss is 18 mm through, so M5 × 40 mm into a rated drywall anchor (the anchor card governs the exact pairing), or M5 × 55 mm into a stud behind ~13 mm board (18 + 13 leaves ≥ 20 mm in the stud). One M5 in a rated anchor holds a pair to roughly 10 kg of hung weight — heavier curtains than that want a stud or screw_count=2 (derivation in NOTES).
  2. Slide the collars over the rod before hanging it — one at each end.
  3. Thread each collar onto its boss until the rim seats on the plate. For a rigid rod between two fixed walls: use one default collar (deep) and one collar-shallow — push into the deep side, drop the shallow end in, tighten both collars. Measure wall-to-wall, then cut the rod ≈ 40 mm shorter (38–42 mm is the safe band): each end bottoms on its collar shoulder 19 mm from that wall, so the seated rod spans nearly wall-to-wall (mouth-to-mouth plus ~38 — both sockets sit recessed into their collars).
  4. To wash the curtains: unthread the collars (~1¼ turns each — 2-start thread) and lift the rod out — holding the flange still as you unthread, because unscrewing friction can walk the single M5 out of the wall over enough wash days. No tools.

If a fit is off, don't resize the parts — reprint the coupon and move the tolerance (thread_tol, rod_clearance) in 0.05–0.1 mm steps; see "Print this first" in NOTES.md, including a one-print tolerance sweep (./scripts/render.sh alcove-rod-socket --sweep thread_tol=0.2:0.4:0.05).

Workbench

View in 3D

Inspect the real geometry — drag to rotate, scroll to zoom. The model is rendered from this design's own source at its default settings, right in your browser; nothing is uploaded.

Make it fit

This design has 20 tunable parameters. Change them and render your own STL — OpenSCAD runs in your browser, so nothing is uploaded and nothing is installed.

An STL you configure here is ungated. The files this project ships have each passed a printability check and a PrusaSlicer test-slice; your variant has not. Treat it as a starting point, and print the fit coupon first if the design has one.

History

History of work together

  1. 2026-10-11 commit · git

    Point alcove-rod-socket README at Release v2.0 (#784)

    Shai Perednik shai
  2. 2026-10-10 commit · git

    Refuse non-positive t, width, and E in bistable_arch_fs / span_for (#796)

    Shai Perednik shai
  3. 2026-10-10 commit · git

    Clamp stencil-glyph diagonals to 0.8 mm; refuse negative spacing (#788)

    Shai Perednik shai
  4. 2026-10-04 commit · git

    lib/compliant.scad stage 1: bistable arch + root fillets (#202) (#758)

    Shai Perednik shai
  5. 2026-10-04 commit · git

    lib/spaceframe.scad — parametric space-frame truss generator (warren / pratt / vierendeel) (#755)

    Shai Perednik shai
  6. 2026-10-03 commit · git

    lib/stencil-glyphs.scad + two-sided ci.fusecheck assert (exactly-N bodies) (#612) (#618)

    Shai Perednik shai
  7. 2026-10-03 commit · git

    Add lib: helical_window brand-mark module + sever guard (#642)

    Shai Perednik shai
  8. 2026-10-03 commit · git

    lib/bevel.scad — FDM bevel and spur gear pairs, one generator, one tol (#619)

    Shai Perednik shai
  9. 2026-09-13 commit · git

    Ship alcove-rod-socket collar-shallow as gated part (B3 / #631) (#632)

    Shai Perednik shai
  10. 2026-09-12 decision · PM.md

    Ship collar-shallow as a gated part (B3 / #631)

    ci.parts cannot carry a free-form -D engagement_depth=12; dual--D hand-render is the foot-gun the deliverable rules stop. Depth threaded into collar/collar_use; plate unchanged (boss+collar only)

    Orin orin
  11. 2026-08-30 commit · git

    Categorize the design catalog: NUGGS + technique-domain groups (#374) (#501)

    Shai Perednik shai
  12. 2026-08-29 commit · git

    render.sh: emit the --render form the installed OpenSCAD build accepts (fixes the render camera opt) (#408)

    Shai Perednik shai
  13. 2026-08-29 commit · git

    Fix teardrop_hole() point orientation to +Z as documented; pin it with a mates manifest (#424)

    Shai Perednik shai
  14. 2026-08-24 decision · PM.md

    The deliverable is the multi-object 3MF plate, never one STL of both parts (NOTES D11)

    v1's field test printed fused — STL carries no object separation, so a boss+collar export slices as one welded body (#377)

    Orin orin
  15. 2026-08-24 decision · PM.md

    Field test FAILED on packaging, not the holder

    the parts were exported stacked/assembled: they fused, and the stack put the extruder over a mid-air discontinuity (spaghetti ~10 layers in) — the geometry never got tested

    Orin orin
  16. 2026-08-24 decision · PM.md

    Correction: the 3MF cures the fuse, not the spaghetti

    two separate objects re-stacked vertically still print the upper over open air; the plate's side-by-side flat layout is the safe way, and stacking is never a space-saving option

    Orin orin
  17. 2026-08-24 decision · PM.md

    v1 → v2 numbering (not v0.2)

    the field-test failure forced a second version before any release shipped: v1 = the frozen geometry, v2 = the packaging fix

    Orin orin
  18. 2026-08-24 commit · git

    Update design: alcove-rod-socket — product-page pass (#379) (#384)

    Shai Perednik shai
  19. 2026-08-24 commit · git

    Add the missing product-manager characters to the People page (#381)

    Shai Perednik shai
  20. 2026-08-24 commit · git

    alcove-rod-socket v2 — ship the separable multi-object plate deliverable (field-test fuse fix) (#377)

    Shai Perednik shai
  21. 2026-08-23 decision · PM.md

    Thread major 47.0 = bore + 2·wall (brief said ≈ 50)

    brief's "+clearance" read as female-side fit clearance (thread_tol, collar OD wall stack); recorded in NOTES D2 and the PR audit

    Orin orin
  22. 2026-08-23 decision · PM.md

    lead_in 1.6 mm (8 layers at the pinned 0.2 mm height) vs brief's "~1–2"

    doubles as the thread phase offset that makes the mate boolean exact (NOTES D3/D4)

    Orin orin
  23. 2026-08-23 decision · PM.md

    One tier-1 hero shot only

    utility part; cutaway + contact sheet carry the internals

    Orin orin
  24. 2026-08-23 decision · PM.md

    2-start thread (lead 8 mm)

    ~1¼ turns to full engagement = tool-free both directions (N3)

    Orin orin
  25. 2026-08-23 decision · PM.md

    Withdraw the workshop-utility claim, keep the tokens

    the pack's required corner-radius/curve-smoothness rules fire on the male thread's tessellated crest (phantom r=1.76/fn≈8 rounding) and no waiver exists; printability wins (CLAUDE.md), amending the pack is the owner's call — NOTES D10

    Orin orin
  26. 2026-08-23 field test · NOTES.md

    Field test — Bambu P2S + H2C

  27. 2026-08-23 commit · git

    Add design: alcove-rod-socket — two-part threaded end socket for a 40 mm alcove curtain rod (#361)

    Shai Perednik shai