A 3D-printable bay and toolless caddy for 3.5" hard drives, and for 2.5" drives through an adapter in the same caddy. Bays are identical and sit on top of and beside each other, located by hex bumps that drop into the neighbour's honeycomb, with no connector parts. The drive drops into the caddy without screws; the caddy slides into the bay and clicks home. Every part prints flat, no supports.
Status: first test print done; its findings are in this revision, which is verified by the geometry checks but not yet reprinted. The drive-in-caddy fit is still untested. See docs/design.md for the spec and the print results.
| Part | File | Per bay | |
|---|---|---|---|
| Caddy tray | scad/caddy_tray.scad |
1 | flat on its floor |
| Caddy bezel | scad/bezel.scad |
1 | flat, front face down |
| Plate, top and bottom | scad/plate.scad |
1 + 1 | flat, bumps up; top has six slots, bottom two |
| Wall (left and right) | scad/wall.scad |
2 | flat, bumps up |
| Rear panel | scad/rear.scad |
1 | flat |
| Pin coupon | scad/coupon.scad |
optional | flat |
Accessories:
| Part | File | Use | |
|---|---|---|---|
| 2.5" adapter | scad/adapter25.scad |
one per 2.5" drive, in a normal caddy | flat on its base |
| Foot | scad/foot.scad |
four under each bottom bay | flat, pins up |
| Width joiner, 1 and 0.5 | scad/joiner.scad, kind="w1" / "w05" |
between stacked bays | flat |
| Height joiner, 3, 1 and 0.5 | scad/joiner.scad, kind="h3" / "h1" / "h05" |
between bays side by side | flat |
Print the coupon first: a 34 mm slice of the caddy with one fixed pin and one finger, to check pin diameter and finger stiffness on a real drive.
Views (not prints), all in out/ after a render:
| Image | Shows |
|---|---|
assembled.png |
one assembled unit, every printed part plus the drive |
testfit.png, testfit_open.png |
one unit with the drive and SATA plugs, one colour per part; the second with the top plate lifted off |
assembly_steps.png |
assembly drawing: rear panel in the bottom plate, top plate above, walls pulled out to the sides |
join_stack.png, join_side.png, join_detail*.png |
how bays join, exploded and close up |
assembly_parts.png |
the 2 × 2 combo, one colour per part class |
assembly_units.png |
the 2 × 2 combo, one colour per bay |
The walls and rear panel carry a low groove that must line up round the
bay. The plates need no mark: the top has six slots, the bottom two, and
the rear-panel slots sit at the rear edge.
scad/hdd.scad is the reference drive and scad/sata_plugs.scad the mated
cable plugs used for the rear cutout check.
Step by step with pictures: docs/assembly.md.
- Drive in caddy. Two fixed pins on one wall, two pins on 45° cantilever fingers on the other. Tilt the drive onto the fixed pins, press the other edge down, the fingers flex out and the pins snap into the drive's side holes. The fingers are diagonal so their slots print without support; the recessed tip gives a fingernail purchase to release.
- Caddy assembly. The bezel presses onto five tabs, two on each of the tray's walls and one on the floor. It snaps over the wall tabs' slightly flared outer faces and a small barb on the floor tab's pull ledge, which then keep it from sliding off.
- Caddy in bay. Slide it in until the bezel seats on the bay's front face. The top edge of each caddy wall is a leaf spring with a ramped bump. The bumps ride under the top plate's solid rim and drop into two slots when the caddy seats. The springs stay preloaded, holding the caddy down and the bezel tight against the bay. There is no honeycomb on the bump's track, so there are no false clicks. To remove, pull by the ledge the tray floor pushes out under the bezel; there is no handle, so the bezel prints flat. Or push it out from behind: a tongue in the middle of the tray's rear edge reaches through the rear panel's open SATA corner as a push tab.
- Bay assembly. Rear panel into the bottom plate; top plate onto the panel; then each wall slides in from the side. Its tabs are dovetails in notches at the plates' edges, sloped both ways: steeply, so the wall cannot lift off, and only slightly, so it slides in tight and stays put. The panel's open corner clears the SATA plugs. No glue. A set of checks proves the insertion path and the locks.
- Bay to bay. No extra parts. Every bump stands on its part's honeycomb lattice, offset so that the same part turned for the opposite face presents an open cell where each bump arrives: plates turned over for stacking, walls turned end for end for side by side. Set a bay on top or beside, facing the same way, done. Bumps locate, they do not lock: glue them if a block must lift as one.
- Airflow. Honeycomb through plates, walls, caddy floor and bezel, inside solid rims that carry the load.
Needs Docker and a stock python3 (standard library only). OpenSCAD
(openscad/openscad:2021.01) and the preview renderer run in containers.
scripts/render.sh # STL + PNG for every part and view -> out/
scripts/assemblies.sh # coloured 3MF assemblies -> out/assemblies/
scripts/assemblies.sh bay # the named ones only, e.g. bay caddy_hdd35
scripts/check.sh # all interference checks; all must PASS
scripts/check.sh quick # single unit and neighbours only
scripts/check.sh array # loaded 2x2 combo only (slow, CGAL)
scripts/check.sh acc # accessories: 2.5" adapter, feet, joiners
scripts/check.sh only a b # the named checks only
scripts/thin.sh # no part has material under 0.8 mm (two perimeters)
AXES=z scripts/thin.sh wall # one part along one axis
scripts/vent.sh # caddy floor and bay plate honeycombs line upscripts/check.sh intersects pairs of bodies and asserts the result is empty
(a face-to-face touch passes, a volume fails), or, for the hold checks, that a
displaced part hits material: tabs shifted in their slots, neighbours shifted
along the bay into the bumps. scripts/thin.sh slices every part in its print orientation,
opens each slice by 0.4 mm and fails on whatever the opening removed, unless
it is only the tail of a slice grazing a sharp corner.
GitHub Actions runs check.sh, thin.sh and vent.sh on every push and
pull request, and builds the printable STLs and the 3MF assemblies as
downloadable artifacts. Pushing a v* tag publishes both as a GitHub Release
once every check passes. The 3MFs carry one coloured object per part:
| 3MF | Contents |
|---|---|
assembled_hdd35.3mf |
bay, caddy and 3.5" drive, seated |
assembled_hdd25.3mf |
bay, caddy, 2.5" adapter and 2.5" drive, seated |
bay.3mf |
the bay alone: plates, walls, rear panel |
caddy_hdd35.3mf |
tray, bezel and 3.5" drive |
caddy_hdd25.3mf |
tray, bezel, 2.5" adapter and 2.5" drive |
scad/ params.scad lib.scad hdd.scad hdd25.scad sata_plugs.scad shared model
caddy.scad bay.scad accessories.scad
caddy_tray.scad bezel.scad plate.scad wall.scad rear.scad coupon.scad printable parts
adapter25.scad foot.scad joiner.scad
testfit.scad assembly.scad joining.scad steps.scad accessory_views.scad views
checks.scad thin.scad vent.scad verification
scripts/ render.sh assemblies.sh check.sh thin.sh vent.sh
preview.py color_mesh.py stl_components.py stl_bbox.py
docs/ design.md adr/ img/
out/ build output (ignored)

