3D-printable parts written by Claude Code and previewed live in the browser. Every model is a single-file parametric OpenSCAD design on top of BOSL2 and QuackWorks; a Next.js
- WASM UI at stuff.seanoc.com exposes each one with live sliders and an STL download.
The interesting part isn't the models — it's the authoring loop.
- Describe the part to Claude Code: "parametric holder for X, fits Y range, mounts to Z."
- Claude writes the
.scad, annotates each@param, seeds a<stem>.invariants.pysidecar (watertight / bbox / single-body claims), a param-sweep test, and a catalog entry. - Push. CI regenerates thumbnails and runs the invariants gate.
- Vercel deploys on merge to
main. - Open the model's page at stuff.seanoc.com to tweak sliders and download an STL.
A minimal first prompt worth copy-pasting:
Add a new model: a parametric wall-mounted hook for hanging a bike helmet. Parameters: hook diameter (30–80 mm), mount plate size, Multiboard backer. Annotate with
@param, add an invariants sidecar, add a catalog entry, render thumbnails.
See AGENTS.md for the agent-facing spec (param grammar,
invariants, render pipeline) and app/README.md for
web-app architecture.
Every .scad under models/ ships with a gallery card at
stuff.seanoc.com. The catalog —
category and blurb per model — lives in
lib/models/catalog.ts, which is the single
source of truth (CI fails on a model without an entry, so the site
listing is always complete).
Adapting an externally-authored STL for openGrid wall mounting? Follow
docs/imported-model-opengrid-playbook.md
— the step-by-step recipe (import, snap orientation, supportless
printability, blending, verification) distilled from the
ego_powerhead_mount series.
After cloning:
./scripts/setup-git-hooks.sh # one-time — commit-trailer + pre-commit gotcha
# gate (see docs/dx-precommit.md)
npm install
npm run dev # http://localhost:3000Render a model directly via OpenSCAD (the project pins engine snapshot
2025.06.12.ai25773 — downloadable from this repo's
openscad-2025.06.12.ai25773 release tag; other builds can disagree
about watertightness, see docs/ci.md):
openscad -o out.stl models/cylindrical_holder_slot.scadlibs/ vendors BOSL2, QuackWorks, and gridfinity-rebuilt-openscad
pinned to compatible commits — newer BOSL2 breaks QuackWorks'
vector-spin syntax. See libs/README.md for the
pins and docs/deps-review-2026-07.md
for the July 2026 dependency review.
Every push and PR runs vitest unit tests and Playwright end-to-end
tests. Model-touching changes additionally run render-thumbnail
regeneration, STL export with per-model invariants (watertight,
single-body, triangle ceiling, PRINT_ANCHOR_BBOX drift), and a wasm
param sweep that renders every model at each parameter's extremes
through the site's real browser pipeline. Renders happen on a pinned
OpenSCAD engine (2025.06.12.ai25773) for watertightness parity. See
docs/ci.md for the full pipeline and the job/trigger
matrix.
- Code — MIT.
- Models (
models/*.scad) —(see also
models/LICENSE) - Bundled libraries keep their own licenses:
libs/BOSL2/LICENSE(BSD-2-Clause) andlibs/QuackWorks/LICENSE(CC BY-NC-SA 4.0).
Built with Claude Code using a multi-agent authoring workflow.

