git log --oneline -- hardware/es3c28p-enclosure.scad returns fourteen commits, all in the six days between April 28 and May 3. In that window the battery moved from beside the PCB to under it, the standoffs grew from 5 mm to 12 to 13.5, the USB-C port changed walls twice, and the BOOT button’s coordinates went from a guess to a measurement to a different corner of the board entirely.
That pace is what hardware iteration looks like when the design is parametric: every collision with reality lands as a one-or-two-line diff, and the video sphere’s git history doubles as the build log. This post is that log, annotated.
Six days of case
- Apr 28 ·
enclosure. First cut: battery in a side bay beside the PCB, toggle on the right wall, 5 mm standoffs. - Apr 28 ·
move toggle. The big rethink: the battery moves under the PCB, and the standoffs go from 5 to 12 mm. - Apr 28 ·
port. The stem-port pedestal, plus its registration pocket in the case bottom. - Apr 28 ·
dont show pcb.showPCB = false; preview housekeeping. - Apr 29 ·
rev1. First exported STLs, and a fix for the battery pocket sitting one plate-thickness too high. - Apr 29 ·
fix batteryheight. Battery re-measured: 11 → 11.2 mm thick. Standoffs 12 → 13.5 mm for wrapper and lead clearance. - Apr 30 ·
slack.ridgeSlack0.2 → 0.35, a one-line loosening of the lid’s snap fit. - Apr 30 ·
wall.standoffHoleSlack0.2 → 0.5; USB-C moves to the back wall, toggle to the front. - Apr 30 ·
booxy. BOOT plunger added, position guessed at PCB (2.5, 10). - Apr 30 ·
shaft. Plunger position measured: (2.5, 36). Guide tube added; tilt held to ~2.9°. - Apr 30 ·
render flags.partdispatch replaced with per-part booleans, because YAPP can’t resolve variable chains during its setup pass. - May 1 ·
usb-c cutout. USB-C back to the front wall; the whole board orientation flips; the plunger lands at (83.5, 14). - May 1 ·
screen center. Lid cutout trimmed 4 mm,paddingBack3 → 7. Screen centering, first attempt. - May 3 ·
padding nudge. Trim 4 → 6 mm,paddingBack7 → 9. Centering converged at PCB X = 40.
The battery moved twice conceptually and never physically. The first design put it beside the PCB, which made the case wider than the screen. Moving it underneath cost standoff height instead of footprint, the right trade for a module that’s seen face-on. Then fix batteryheight is the classic hardware commit: the actual battery is 11.2 mm, not the 11 in the listing, and it wears a wrapper, kapton tape, and a lead bulge. The clearance number in the file went from “datasheet” to “measured,” which is a one-way transition every dimension eventually makes.
The USB-C indecision was really a screen decision. The port sat on the front wall, moved to the back, and came back to the front. What was actually being decided was which way the board faces in the case, which determines where the wide bezel goes, which determines how the visible screen centers. The two centering commits that follow are the 6 mm trim + 6 mm padding trick converging over two tries.
The plunger commits are a measurement story. booxy placed the BOOT plunger from the datasheet’s drawing, flagged in the source with a MEASURE YOUR BOARD warning. shaft replaced the guess with measured coordinates and added the guide tube (with the tilt math in a comment: 5 mm of bearing holds the plunger to ~2.9° of wobble versus ~7° without). Then the board flip in usb-c cutout moved it across the PCB to (83.5, 14). Three commits, each one line of coordinates plus a paragraph of why.
The sphere grew 10 mm
The hub had its own correction arc, on a slower clock. Version one (April 24): a 50 mm sphere, twelve holes, 12 mm deep. Three days later it gained the thirteenth south-pole hole for the mounting stem, plus the long stem and pedestal. And on May 4, a commit titled “sphere largening update” changed two numbers (diameter 50 → 60, hole depth 12 → 10) and added the six-line comment explaining the south-pole clearance inequality that forced them. The hub post derives it; the short version is that at 50/12, three converging holes merged inside the ball.
That commit is the pattern in miniature: the fix is two characters, the comment is the artifact. The next person to change sphere_diameter inherits the constraint instead of rediscovering it.
The base got a sequel
The newest hardware change isn’t even committed yet as I write this: icosahedron-sphere-v2.scad, which changes exactly two things about the pedestal. The foot grows from 150 to 200.8 mm (+2 inches), and the stem socket deepens from 10 to 35.4 mm (+1 inch). Both changes are in the direction of “harder to knock over,” and the reason is the venue: the sphere was headed for NYC Resistor’s Interactive Show, where the art shares a floor with a crowd and things get busy.
Meanwhile, in firmware
The hardware wasn’t the only thing iterating. The firmware has its own reality-corrections thread: deep sleep so the battery can charge without the device burning 150+ mA, an on-screen battery badge that only appears on external power, a BSSID lock born from two access points broadcasting the same network name. Those stories are in the firmware post; I mention them here because they follow the same shape: each began as a physical fact and ended as a small diff.
Every assumption is a parameter
The pace in that log is only sustainable because every physical assumption in the design is a named parameter, with the constraint that produced its value in a comment beside it. A correction is then a value change rather than a remodel, cheap enough to commit the same day the problem shows up.
Part 4 of the video-sphere series. Previous: The Printed Parts · Next: The Camera Rig.