- Python 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .github/workflows | ||
| cad | ||
| docs | ||
| models | ||
| scripts | ||
| .gitignore | ||
| CONTRIBUTING.md | ||
| LICENSE | ||
| LICENSE-MIT | ||
| NOTICE | ||
| README.md | ||
| requirements-dev.txt | ||
Stair finial — Blender remaster
A printable replacement for the spherical brass finials on a stair railing, with a deep socket for longer mounting studs. The design, threads, fit samples, materials, lighting, dimensions and typography are rebuilt in Blender. The project does not import the previous meshes or use OpenSCAD.
Open the editable Blender project · Dimensioned section · Fit samples
Prototype v0.2 — photo-derived dimensions; physical fit is untested. M6 × 1 right-hand is a working assumption. Confirm it with a known nut and print a fit sample before a complete finial.
The Blender project
cad/stair_finial.blend contains four named scenes:
| Scene | Contents |
|---|---|
| 01 · STUDIO | Polished brass exterior, a true cutaway, studio materials and lights; ready to render with F12 |
| 02 · DIMENSIONS | The actual section contour, dimensions, leaders and editable Blender text |
| 03 · FIT SAMPLES | All three samples with their real engraved clearance values |
| 04 · PRINT MASTERS (mm) | Six complete, editable manufacturing meshes, each at its own local Z=0 |
Print masters share the same origin; reveal one at a time using the Outliner eye icons. The default finial is visible when you switch to the print scene. Presentation objects share the full masters' mesh data at metre scale. Cutaways and display discs are marked as illustrations and excluded from the printable exports.
The .blend includes the design scripts, presets, packed fonts and a START HERE text block. No photos, HDRIs or image textures are needed to open or render it. The included fonts retain their licence.
Print one first
- Try an ordinary M6 × 1 nut on an exposed stud by hand. Identify the actual thread if it does not run freely.
- Print the 0.35 mm fit sample, broad grip flat on the bed, using the intended filament and layer height.
- If it binds, try 0.45 mm; if it has excessive play, try 0.25 mm. The engraved number is added diametral clearance, not thread size.
- Print the matching finial collar down. Support the lower outside of the sphere; block supports inside the socket. Start with PETG, a 0.4 mm nozzle, 0.12–0.16 mm layers, four walls and 20–25% infill.
- Remove support and brim, then check that the collar seats on both a short and a long stud. Tighten by hand.
| Clearance | Fit sample | Complete finial |
|---|---|---|
| 0.25 mm, tighter | STL | STL |
| 0.35 mm, starting point | STL | STL |
| 0.45 mm, looser | STL | STL |
All STLs use millimetres and sit on Z=0. Confirm 47 mm width in the slicer. Use the complete finial for printing; the illustrated section is intentionally cut open. Brass and sample colours are illustrative finishes.
Dimensions and longer studs
| Feature | Supplied design |
|---|---|
| Sphere | Ø47 mm, estimated from the reference photographs |
| Collar | Ø16 × 4 mm, with a 0.16 mm outside foot chamfer |
| Overall height | 49.596 mm, including the collar |
| Socket | Assumed M6 × 1 right-hand; 10 mm threaded region; 0.8 mm lead-in |
| Upper relief | Ø7.2 mm, extending to Z=32 mm from the seating face |
| Suggested longest stud | 31 mm above its seating face, allowing 1 mm tip clearance |
| Roof | Closed 45° cone, apex Z=35.6 mm; the cone is beyond the usable depth |
| Fit sample | Ø16 × 10 mm boss; approximately 32 × 16 mm footprint; 2.4 mm rounded grip with a 0.36 mm deboss |
The 32 mm depth includes the threaded region. It is measured from the collar's bottom seating face. A roughly 9 mm short stud engages about 8.2 mm after the lead-in. The longer relief accepts the rest of a threaded stud; it does not admit a wider unthreaded shoulder through the M6 opening.
The longest installed stud has not been measured. Set rod_depth to at least its projection plus 1 mm, and retain room for the conical roof and crown. See measurements and assumptions and printing and fitting.
Rebuild or change the design
Use official Blender 4.5 LTS or newer. Blender supplies its own Python and geometry tools, including the closed-solid Boolean solver used for the engraved samples; no external modelling package is required.
# Blender must be on PATH, or set BLENDER=/path/to/blender.
python3 scripts/build.py
python3 scripts/render.py
# A fast visual check, written separately to .work/render-previews/.
python3 scripts/render.py --quick
# Rebuild one preset without touching the supplied project or STLs.
python3 scripts/build.py --preset M6x1_c035 --output-dir .work/custom
Edit cad/presets.json for dimensions and clearances, cad/finial.py for the native geometry, and cad/studio.py for the presentation. The sphere is a stitched surface of revolution; its interior is a continuous helical mesh. Blender booleans integrate each rounded grip and engrave its label. The entry chamfer clips the real thread, and the finial retains a closed crown.
For an exploratory edit inside Blender, switch to 04 · PRINT MASTERS, select a master, change its Object Custom Properties, and run the embedded rebuild_selected.py in the Text Editor. This updates that master and its full-model instances. Regenerate the project from the presets for a release so the cutaways, dimensions, exports and manifests agree. Do not scale an STL to adjust fit: that also changes pitch.
The render script detects builds without OpenImageDenoise and renders without it. For F12 rendering in such a build, turn off Render Properties → Sampling → Render → Denoise. Official Blender 4.5 includes the denoiser used for the supplied artwork.
Verify and package
python3 -m venv .venv
. .venv/bin/activate
python -m pip install -r requirements-dev.txt
python scripts/validate.py
python scripts/inspect_blend.py
python scripts/package.py
models/validation.json records mesh integrity, single-solid connectivity, dimensions, bed placement, thread profile/pitch/handedness, the open relief and closed crown. The Blender inspection reopens the saved project and checks its masters against the actual STL exports, embedded source and render scenes. Render provenance ties the PNGs to the saved Blender project.
These checks verify digital geometry and the delivered project. Printer tolerances, strength and physical fit still require an actual print. See development for the complete reproduction and checking workflow.
scripts/package.py creates dist/stair-finial-v0.2.0.zip, containing the Blender project, source, six STLs, artwork, reports and guides. Local reference photos and downloaded tools are excluded. The design, meshes and documentation use CERN-OHL-P-2.0; helper scripts and CI use MIT. See NOTICE and release notes.
This is a decorative replacement; the railing's structural fixings are separate.


