# print-bench > Co-designed, parametric 3D-printable designs in OpenSCAD — plus the > platform that gates them: render/printability/slice CI, drift-checked > docs, and a human-gated autonomy loop. Every page on this site is > generated from a committed markdown source; this file indexes where > each source is served. ## Contributing (the platform) - [Contributing to the print-bench platform](/docs/contributing/README.md): The contributor guide for the system underneath the designs — the scripts, gates, CI, shared libraries, tools, product site, and autonomy routines. - [The autonomy loop](/docs/contributing/autonomy.md): The scheduled agent routines that keep the backlog moving without a human driving each step — what each one does, and the safety architecture that makes an unattended agent with a repo secret an acceptable thing to run. - [CI and the gates](/docs/contributing/ci-and-gates.md): How CI decides what to run for your PR, what each gate proves, and the one behavior that surprises newcomers most: CI pushes commits onto your branch. - [Conventions](/docs/contributing/conventions.md): The standing rules platform code is held to — each one enforced by a check, each check born from a real failure. - [Extending the platform](/docs/contributing/extending.md): Recipes for each kind of platform change, each step tied to the check that enforces it where one exists. - [Getting started](/docs/contributing/getting-started.md): How to stand up the toolchain, understand the environment contract every script assumes, and get your first green check run — the on-ramp for platform contributions. - [Pull requests](/docs/contributing/pull-requests.md): The lifecycle of a PR here — what CI will do to your branch, who reviews what, and where the process differs from an ordinary repo. ## Architecture - [Architecture](/docs/architecture/README.md): Two layers, kept apart on purpose. - [CI & automation platform](/docs/architecture/ci-platform.md): The domain-agnostic half of print-bench: how any repository built this way selects its gates, keeps derived files honest, and runs unattended agents. - [Design workflow](/docs/architecture/design-workflow.md): The domain half: what print-bench actually builds, and the gates that decide a design is done. ## Designs (product pages) - [aerochord](/designs/aerochord/README.md): A musical wind instrument that (a) prints in place as **one piece** with no supports, (b) does not correspond to any instrument in the historical record, and (c) is only really designable/printable with an FDM machine and a computed internal geometry. The brief was an explicit stress test of the whole co-design pipeline. - [Alcove rod socket](/designs/alcove-rod-socket/README.md): 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). - [bistable-toggle](/designs/bistable-toggle/README.md): A fixed–fixed pre-buckled arch with two stable states (bowed up / bowed down) separated by a negative-stiffness region: power only to switch, not to hold. The monostable snap of `snap-cantilever-clip` taken to genuine bistability. - [calibration-cube](/designs/calibration-cube/README.md): Simple dimensional-accuracy test print; also serves as the repo's starter design demonstrating the parameter conventions. - [captive-spinner](/designs/captive-spinner/README.md): A one-piece, support-free, no-assembly fidget: a rotor ring captured on a fixed post + cap, spinning about the vertical axis after you shear the break-in fusion. - [compliant-gripper](/designs/compliant-gripper/README.md): A monolithic print-in-place **parallel-jaw** gripper. Each jaw rides a parallelogram of two leaf flexures, so the grip faces stay mutually parallel while they translate in Y. A captive push-plunger drives both jaws through diagonal edge-notches; a pre-buckled arch (the #389 solve) drops its apex tip into a valley detent on the plunger wing and holds the clamped state with zero applied force. Push the tab → jaws close in parallel → tip passes the crest and seats in the valley → held. Pull the tab → tip climbs back over the crest → flexures spring the jaws open. One piece, no supports, no assembly. - [constant-force-slider](/designs/constant-force-slider/README.md): A linear shuttle that moves under ~constant force over its stroke. It rides a guide slot (print-in-place sliding fit) and is returned by a QZS spring built from two flexure families in parallel. - [czs-slider — the constant-force print-in-place slider](/designs/czs-slider/README.md): A one-piece captive slider whose resistive force is **near-constant across its stroke** — push the knob and it glides at ~2 N instead of fighting a rising spring — printed in place, support-free, in PETG. - [Desiccant Capsule](/designs/desiccant-capsule/README.md): Refillable two-part capsule for loose silica gel beads, lived-in filament dry-boxes. Perforated body lets air/moisture reach the beads; screw-on lid with real threads (not press-fit) and a ribbed grip edge so it can be opened with dry-box gloves on. Must print on FDM with no supports on either part. - [Extrusion Shelf Bracket](/designs/extrusion-shelf-bracket/README.md): A shelf corner bracket that locks into the **side slot of standard 2020 T-slot aluminum extrusion**: hammer-head lugs on the back of the plate slide along the slot, so a shelf board attaches anywhere along a rail with no T-nuts and no frame teardown. Horizontal arm carries the board between 45° gussets and a front stop lip. One printable part + a fit coupon. Brief: issue #283 (design-brief, `workshop-utility` style). - [Gridfinity starter set](/designs/gridfinity-starter/README.md): A first-party Gridfinity starter set (issue #733): one screw-down baseplate (3×3 default) plus the open bins that drop into it — 1×1×3U, 2×1×3U and a 1×1×1U low tray. The product is **interoperability**: every bin printed from this design must drop into any community Gridfinity baseplate, and every community bin must drop into this baseplate. Wrong-by-0.5 mm breaks that, so the spec numbers below were pinned before any modeling. - [hex-bit-rail — a tuned-fit bench rail for ¼″ hex driver bits](/designs/hex-bit-rail/README.md): A bench-top rail that stores ¼″ hex driver bits standing up, every one held by a printed hex pocket and presented label-up — the workshop basic the catalog had zero designs for (no tool-storage part existed). The engineering is the fit: a hex pocket registering six faces accurately enough to grip a hardened steel shank printed against PLA. Brief: issue #594. Design run: SHIP-LOCK contract in the issue thread. - [let-folding-panel](/designs/let-folding-panel/README.md): Two rigid panels joined by a Lamina-Emergent Torsional (LET) joint: fabricated flat from one sheet, folds to 90°, zero clearance / zero assembly / no rattle. The alternative to a pin hinge when you want a fold, not a full revolution. - [N.U.G.G.S.](/designs/nuggs/README.md): An 80 mm-bore tunnel **system** for an adult Syrian hamster, built around one genderless quarter-turn port that every module carries at every end. The kit that exists today is the Bin Bridge: two bulkheads and one straight joining two enclosures through their walls, with nothing inside the cage. - [NUGGS bottle adapter](/designs/nuggs-bottle-adapter/README.md): The NUGGS **bottle adapter** (issue #515): the part that turns an off-the-shelf PCO-1881 water bottle into a drop-in habitat module. One printed body, two interfaces — the standard genderless quarter-turn NUGGS port below (80 mm bore, full library defaults), a threaded throat above that takes a stock bottle finish. The animal never passes *through* this module: the passage narrows to the bottle's own orifice by design, so this is a service module (water/bedding), not a transit module — the 70 mm bore floor governs entrances an animal uses, and the port below it stays full standard. - [N.U.G.G.S. Den](/designs/nuggs-den/README.md): A **terminal** NUGGS module — the first one in the system that is not a run of bore. `nuggs` is the straight (the Bin Bridge), and the `nuggs` backlog lists elbow / node / open module / wye, all of them still tube; `nuggs-yard` shares the `nuggs-` name but not the port, so it is a sibling, not a system module. This is the end-cap: a single-port rounded **refuge bulb** that turns the dead flat wall at the end of a run into a place to sit, hoard and hide. - [nuggs-elbow](/designs/nuggs-elbow/README.md): A first-party NUGGS module: a curved (elbow) tube that routes an 80 mm-bore run around a corner, carrying the genderless quarter-turn NUGGS port (`nuggs_neck()`/`nuggs_port()` from `lib/nuggs-coupling.scad`) on each end, joined by a bent tube shell with a **continuous, smooth bore through the bend** (welfare non-negotiable). It is a consumer of the port standard, exactly like `designs/nuggs`: it builds one `cfg` with `nuggs_cfg()` defaults and never redefines a coupling number. - [nuggs-frieda](/designs/nuggs-frieda/README.md): A Word-World module: a NUGGS straight whose midspan is *made of* the resident's name — **FRIEDA** wrapped around the tube as a structural letter cage. Functionally it is a drop-in replacement for the nuggs straight (same 160 mm face-to-face length, same port standard at the same defaults); the letters are what it is *for*. The brief: "like Word World the object is made of letters … the word is Frieda. you can mix case … as needed." - [N.U.G.G.S. Feeder Hopper](/designs/nuggs-hopper/README.md): The NUGGS ecosystem's feeding module: a shallow gravity hopper that mates the standard quarter-turn port and holds a few days of food, dropping it into the enclosure as it is eaten. Owner refills from outside the cage through the open top port. The catalog had den, elbow, bridge, orrery and shutter-valve — all tube or refuge; feeding was the gap (scout mandate: deepen the NUGGS ecosystem). - [NUGGS open module](/designs/nuggs-open/README.md): The first member of the NUGGS **open-module family**: a straight 80 mm-bore module whose midspan opens into a longitudinal window ≥ 180° with the bore's own arc as its floor. Under charter N2 an open module is one of only three things that **reset a run** (an open end, an open module, a turnaround node), so any layout longer than one straight *requires* a part like this to stay legal. Who it's for: a NUGGS owner extending a run past the 360 mm limit, or wanting a mid-run check/hand-access point without disconnecting anything. - [nuggs-orrery](/designs/nuggs-orrery/README.md): An abstract, boundary-pushing NUGGS module that is *only manufacturable on a dual-nozzle 3D printer* (Bambu H2-series class; AMS available for color): the standard port at both ends, and outside the hamster-contact envelope a kinetic sculpture — six twisted fins carrying three captive, free-spinning orbit rings in a second material. Request: unique/abstract, dual materials using both nozzles, bonus for built-in break-away supports and other advanced techniques. NUGGS rules constrain the animal-contact surfaces; the exterior is fair game (owner's brief, this session). - [nuggs-rim-saddle](/designs/nuggs-rim-saddle/README.md): A saddle that clamps over the top rim of a glass-tank enclosure — no drilling (N9: tempered glass shatters), no adhesive — and carries one standard NUGGS genderless quarter-turn port (`lib/nuggs-coupling.scad`, N10: the one interlock), so a run starts from a glass cabinet the same way it starts from a plywood bulkhead. Target enclosure: IKEA Detolf (the cabinet charter N9 itself names), parametrically — every rim dimension is a parameter with the Detolf value as the default, so another cabinet is a `-D` override. - [NUGGS Sand Bath](/designs/nuggs-sand-bath/README.md): The grooming module the NUGGS ecosystem was missing: an **open-topped sand-bath trough** a run dead-ends into. The animal walks the standard 80 mm bore, crosses a containment lip down a ≤45° beach, and stands on a flat sand floor wider than the bore; sand goes in from the open mouth, the animal can be lifted out the same way. One `nuggs_cfg()` consumer like every NUGGS module — the port is the shared interlock, nothing about it is restated here. - [NUGGS shutter valve](/designs/nuggs-shutter-valve/README.md): - **Bore 80 mm, wall 2.4 mm, tube OD 84.8 mm** — inherited from `nuggs_cfg()` defaults so the valve mates with every existing NUGGS module. Every coupling number is the standard's; the coupling guards fire inside `nuggs_cfg()`. - **Slide clearances** — the battleship-tuned values `lib/print-in-place.scad` carries (rail 0.4 vertical / 0.5 horizontal tabs, lip engagement). Do **not** loosen the rail clearances (the acoustic property); tune only the door-side `door_fit` on the coupon. - **Target printers** — Bambu P2S (256 mm bed) / H2C (bigger). Gated against the smaller P2S bed. Jane runs the same hardware. - **Welfare non-negotiable** — when open, the shutter retracts entirely out of the 80 mm bore; the bore is continuous and smooth with no interior ledge. - [N.U.G.G.S. Turnaround Node](/designs/nuggs-turnaround/README.md): The NUGGS **turnaround node** (issue #394, charter backlog B4): the run-resetter. A module carrying the standard genderless quarter-turn port on **two faces of one widened chamber**, so an adult Syrian hamster can enter port A, pivot 180°, and leave port B — doubling a run back on itself. This is the module that makes layouts larger than one straight legal: charter **N2** caps any continuously enclosed run at 2 × body length between *breaks*, and a turnaround node of **clear internal width ≥ body_len_mm that is itself open to ventilated space** is one of only three breaks. Without this part, no layout bigger than one straight tube is legal. - [N.U.G.G.S. Turnaround Tee](/designs/nuggs-turnaround-tee/README.md): The **three-port turnaround** for the N.U.G.G.S. run system: everything the two-port `nuggs-turnaround` node is, plus a **third port on the chamber crown**, anti-parallel to the two bed ports, so a run can pass **straight through** the turnaround instead of only switching back. Issue #435 — the 2-vs-3-ports decision deferred from #394; the owner settled it on-thread: build it **as a derivative** of `nuggs-turnaround`, same rule set, same port revision, deliverable `designs/nuggs-turnaround-tee/`. - [NUGGS vent cap](/designs/nuggs-vent-cap/README.md): The NUGGS **vent cap** (issue #592, the filter body the ecosystem names but doesn't have): the standard genderless quarter-turn port face closed by a **support-free lattice dome**. Air and light pass; bedding stays; openings stay at or under the assumed 6 mm welfare ceiling (1/4″ hardware-cloth convention — owner confirmation on a live animal is still pending). Charter **N2** caps a continuously enclosed run at 2 × body length between breaks, and today the only way to *end* a run is a solid cap — which seals it dead (ammonia and CO2 build up in an enclosed system) — or leaving it open, which is an exit. The vent cap is the third option: an enclosed end that breathes. It does **not** break a run the way nuggs-open does (air passes; openings stay at or under that assumed ceiling), so under the run-length rule it is still an end. - [NUGGS wheel](/designs/nuggs-wheel/README.md): The NUGGS **exercise module** (issue #834): a segmented rim wheel on a free-standing stand that anchors into a standard genderless quarter-turn port. The ecosystem had no locomotion module; an exercise wheel is the standard welfare kit a hamster habitat has. Segmentation is the design premise — a Syrian-scale Ø280 mm wheel exceeds the gate's 200 mm test-slice ceiling (#673). - [nuggs-y-splitter](/designs/nuggs-y-splitter/README.md): A first-party NUGGS junction module: branch an 80 mm-bore NUGGS run into two paths — one inlet port, two symmetric outlets at a 60° included angle — with all three faces carrying the standard genderless quarter-turn bayonet port (`nuggs_port()` from `lib/nuggs-coupling.scad`). Branching was the one topology the ecosystem could not do; every other module is two-port single-path. A consumer of the port standard, exactly like `designs/nuggs` and `designs/nuggs-elbow`: one `cfg` built from `nuggs_cfg()` defaults, handed to every port call, never a redefined coupling number. - [N.U.G.G.S. Yard](/designs/nuggs-yard/README.md): An open-top run for an adult Syrian hamster's **playpen** — free-roam time outside the cage. The ask was "loops and twists, turns, branches, all the stuff to keep him busy". It is a floor-standing kit of modules the owner lays out themselves, not a fixed object. Despite the `nuggs-` name, it is a sibling of the NUGGS tunnel system, not a module in it — its lap-skirt joint does not mate with the NUGGS port. - [Over-center toggle clamp](/designs/over-center-toggle-clamp/README.md): Brief #285: promote bistable-toggle's buckled-beam physics to a load-carrying **print-in-place over-center toggle clamp** for bench-top workholding. One PETG print, no hardware: squeeze a lever, the moving jaw closes on the workpiece, the linkage passes dead center and self-locks, and a buckled-beam arch makes the toggle bistable so it stays both closed and open with a positive snap. - [ovodyo — kinetic dice-ball clock](/designs/ovodyo/README.md): A clean-room, print-bench-native re-creation of Mectolab's "ovodyo" kinetic dice-ball clock, built as the **v0 base** every issue in the [#599](https://github.com/shaiss/print-bench/issues/599) improvement backlog modifies. The reference study and the improvement brainstorm were produced in-session (design study + `ovodyo-improvement-brainstorm.md`). - [Perspective Coin](/designs/perspective-coin/README.md): John Cena carries a watch engraved on two sides: *"comparison is the thief of joy"* on the back (for when he doesn't feel enough) and *"memento mori"* on the other (for when his head gets too big) — "a keeper of perspective, not time" (as he tells it in an [interview clip shared on Reddit](https://www.reddit.com/r/MotivationalThoughts/s/q9BbhOayrd)). This design turns those two engravings into a two-sided pocket coin, plus a print-in-place **flipper charm**: the coin captured in a keyring gimbal so you physically flip it to the reminder you need. Tier reference: `docs/advanced-techniques.md` Domain 3 (print-in-place kinematics). - [pip-cable-chain](/designs/pip-cable-chain/README.md): One flat print produces an articulated chain — no assembly, no hardware in the joints, no supports. Each link's pin stubs are printed inside the next link's blind bores; the run flexes to break the sacrificial fusion and is a working drag chain. - [pip-piano-hinge](/designs/pip-piano-hinge/README.md): A multi-knuckle hinge that comes off the plate assembled and swinging — the Domain-3 pin-in-bore joint tiled into a real piano hinge, plus the two piano-hinge-specific defenses (xy≠z clearance, per-knuckle axial play). - [pip-planetary — a print-in-place planetary gear set](/designs/pip-planetary/README.md): A print-in-place planetary (epicyclic) gear set — sun, three planets, internal ring — printed as ONE assembled part, per brief #307: the catalog's first toothed-gear design (Domain 3 "Gears & rotary" in `docs/advanced-techniques.md`). Turn the sun's crank; the carrier walks round at **5:1**. - [pip-ratchet](/designs/pip-ratchet/README.md): A print-in-place ratchet demonstrator (brief #668): one captive wheel that **freewheels with a click one way (CCW) and locks solid the other (CW)**, printed as ONE piece — wheel, two compliant pawls and frame in a single print, no supports, no assembly. The reference shape for a ratchet/freewheel family: tune the coupon, print the wheel. - [pip-ratchet-pla](/designs/pip-ratchet-pla/README.md): The pip-ratchet print-in-place ratchet demonstrator re-sectioned for PLA (brief #675, deferred from #668 per the parent's PM.md N6): same wheel, same teeth, same frame, same every-clearance — only the pawl beam thickness re-derived so a PLA build clicks like the shipped PETG one, and an honest stress/fatigue verdict recorded for the section. **The PETG parent changes nothing** (brief: "No geometry in the PETG design changes as part of this"); this design is a derivative that ships beside it. - [pop-fidget-card](/designs/pop-fidget-card/README.md): A print-in-place 1st-birthday keepsake card (brief: issue #342) themed on a bubble/"POP" party motif — built for the **parents**, who keep fidgeting with it after the party. Flat landscape card, displays on a shelf via a punched easel flap, with four working fidgets printed in place on its face. Hard constraint: test-slice under 2 h; target 60 min on a fast modern printer. - [preroll-elevator](/designs/preroll-elevator/README.md): A chapstick / glue-stick–style twist tube that stores and *presents* pre-rolls. Unscrew the hex cap-nut lid, twist the hex knob at the base → a central screw raises an internal elevator carrying 4 pre-rolls in a ring so their tops rise out the top to grab; twist back to retract, cap the lid to close and protect. Styled deliberately as an **industrial hex bolt with a nut on top** — the mechanical look is the point, and the interior echoes it (the elevator is literally a nut climbing a bolt). - [sbc-case — vented Raspberry Pi 4 case with fan mount](/designs/sbc-case/README.md): A hardware-rich single-board-computer case (Raspberry Pi 4 primary target) that is deliberately the **reference / stress-test design for the assembly-instructions feature** (issue #158): it ships an `assembly.conf` declaring real `vitamin:` entries — board, inserts, three screw types, washers, fan — so it exercises the NopSCADlib vitamin path, the BOM collection pass, and the GPL-3.0 product-page disclosure no existing design carries. - [snap-cantilever-clip](/designs/snap-cantilever-clip/README.md): A one-piece clip that snaps onto a plate edge and holds by cantilever deflection. Push it onto 3 mm card / shelf stock, the finger cams open over the plate, springs back, and the clip grips by spring preload — removal takes ~2× the insertion force via the steep retention shoulder. - [snap-clamshell-box](/designs/snap-clamshell-box/README.md): A clamshell box: two trays joined at a spine by a **living hinge**, closed by a **compliant snap latch** (tab-in-window). Prints flat and open, folds 180° so the openings meet, and the front latch clicks shut. One piece, no supports, no assembly. - [spring-rate-ladder](/designs/spring-rate-ladder/README.md): Give anyone designing a compliant mechanism a **measured spring constant to design against**. The field-test record says the gap bites: the pop-fidget-card 2026-08-22 print found PLA flexures printing stiffer than modeled (snap beam thinned 1.5 → 1.3 mm), and pip-ratchet deferred a whole PLA pawl variant (#675). A printed spring whose rate is *derived from first principles and then measured* turns that surprise into a number: measure k on the coupon, back out effective G for the filament, and log it as a FIELD-TEST entry (`templates/FIELD-TEST.md`). `printer.conf` write-back of G is planned (PM backlog B3) — the profile has no G field yet. - [support-free-bracket](/designs/support-free-bracket/README.md): A wall shelf bracket: an 80 × 50 wall plate fastened by 2 × M5 screws, with a 60 mm deep × 6 mm thick shelf arm, closing the cavity under the arm with a **vaulted ceiling ≤ 45°** so it never prints as a bridge roof. The point of the design is not the bracket; it is the demonstration that every support-needing feature can be designed out. - [sushi-battleship](/designs/sushi-battleship/README.md): Battleship played with real sushi. - [Sushi Battleship — Shot Tracker](/designs/sushi-battleship-tracker/README.md): The parent tracks hits structurally (an opened door is an eaten cell) but leaves **misses** to memory, and "did we already call B3?" is the real failure mode of a leisurely dinner game. The refit adds a shallow spherical **miss-marker seat** to the top face of every print-in-place shutter door: park any small round marker (dried soybean, 6 mm airsoft BB, peppercorn) on a called cell and nobody re-calls it. The product charter lives in PM.md beside this file. - [Sweetheart Hamster](/designs/sweetheart-hamster/README.md): A palm-sized (~60 mm) jewelry box shaped like a chibi hamster **cradling a heart**. It splits down the sagittal midline so the heart parts between the two halves — "hamster together, heart when the pieces are apart." It is a print-in-place clamshell: the two halves come off the bed as one piece, joined along the dorsal seam by a living-hinge web, and fold shut into the hamster. A heart-shaped pocket straddling the seam is the ring nest. - [tslot-cable-clip](/designs/tslot-cable-clip/README.md): A **snap-in cable-clip family for standard 2020 T-slot aluminum extrusion**: one hammer-head lug slides into the rail's side slot (the anchoring geometry `extrusion-shelf-bracket` already proved against the same slot table), and a loop with two flex tabs routes a common cable **along the rail** — no zip ties, no adhesive, repositionable by sliding. Three v1 stations: Ø4.0 (PTFE Bowden / micro-USB), Ø6.2 (Cat5e / USB-A), Ø8.0 (pneumatic / small bundle). Brief: issue #836 (design-brief, `workshop-utility` style). ## Styles - [Orrery](/styles/orrery/STYLE.md): Twisted-blade vortex cages carrying captive floating rings on 50-degree conical seats — kinetic, dual-material, supportless by construction - [Ribbed Industrial](/styles/ribbed-industrial/STYLE.md): Finned utility housings on a 1 mm module: 5 mm ribs, a 1 mm break on every edge, and nothing that needs support. - [Workshop Utility](/styles/workshop-utility/STYLE.md): Generously rounded utility parts with 45-degree bed chamfers and an M3 fastener vocabulary. ## Optional - [llms-full.txt](/llms-full.txt): the platform docs above, concatenated into one file - [Source repository](https://github.com/shaiss/print-bench): every file this site is generated from