◆ PROJECT MILO — HUMANOID PLATFORM

Hello. I am being
assembled in public.

A bipedal, conversational robot built one subsystem at a time — Raspberry Pi 5 for the body, Jetson for the brain, RealSense for the eyes. Nothing is assembled yet: the skull is still CAD, and zero steps have been taken. Everything I learn gets logged here, and every file ends up downloadable.

Concept render of Milo: a white humanoid robot with a visored head, mid-stride against a dark background.

/ SUBSYSTEM STATUS

Head ACTIVE

2026-07-27 : Finally got shell had to get help from designer to create it for me, I added the camera bracket to hold RealSense D435if

50% COMPLETE
Hands ACTIVE

2026-07-20 -- Started Researching different hands for humanoids. 2026-07-25 -- Still In Design Phase, Setting up Fusion Project

10% COMPLETE
Vision SPEC'D

RealSense D435if streaming depth. No tracking loop yet.

5% COMPLETE
Compute SPEC'D

Pi 5 + Jetson split decided. Power budget open.

5% COMPLETE
Speech / LLM R&D

R&D

0% COMPLETE
Locomotion R&D

Bipedal walking. Hardest problem, deliberately last.

5% COMPLETE
Torso / Frame R&D

R&D

0% COMPLETE
Power R&D

R&D

0% COMPLETE

/ ANATOMY

▸ HEAD

Head + Sensor Pod

Finished Design of Shell, added bracket to house the Intel RealSense D435if for RGB + depth, still need to add brackets for mic and speakers.

STATUS ACTIVE

/ DEVLOG

projectmilo.dev

Seven months in, the project gets a home. projectmilo.dev, on Cloudflare.

Naming was less obvious than it looks — there’s a well-known commercial robot called Milo (RoboKind’s autism-education humanoid) that owns the search results, so the .dev suffix and the “project” prefix are doing real work.

The site is flat static HTML, no build step, dropped straight into Cloudflare Pages. Dark depth-map visual system: a live canvas point cloud rendering Milo’s proportions in roughly 2,800 particles, coloured on a depth ramp from indigo at distance through cyan and amber to hot orange up close, with mouse parallax and a sensor sweep line running down the figure. The hero sets MILO enormous with the same gradient through the letterforms.

Status board covers seven subsystems. The stat rail ends on “0 steps taken” — which is honest, and it stays there until it isn’t true.

Backdating the log to day zero. Turns out that’s 30 December 2025, not 1 January 2026. Two days earlier than I thought, which is a fitting way to discover you’ve been at something longer than you remember.

NEXT → Backfill every entry above and keep this thing current.

Five cuts that make a machined hand printable

Printed the index finger at 61% and learned what everyone learns: a hand designed for machined tolerances does not survive FDM at 61% scale. The fork-and-tab joints bind, bottom out, and won’t seat.

Validated the fix on the Finger_1 coupon. Five operations plus one rule:

  1. Scale to 61% natively in SolidWorks. Not in the slicer. Export the STL and print at 100% — this keeps parametric control and stops the slicer silently scaling tolerances that shouldn’t scale.
  2. Widen the fork slot ~0.25 mm per side into a funnel mouth so the tab self-centres on the way in.
  3. Chamfer or dome the tab lead-in edges.
  4. Slot depth relief so the tab tip doesn’t bottom out before the joint seats.
  5. Shoulder relief so the fork rings seat fully forward.

Then bores: leave them at ~3.05 mm and drill through the assembled joint to fit the 3 mm steel pins. Drilling through assembly trues the alignment in a way no amount of modelling does.

The other outcome — the finger caps are deleted from the BOM. They split along layer seams under hoop stress every time. Retention has to live in the joint geometry itself, not in a separate retaining part. That’s a real design principle, not a workaround.

Sourced precision 3 × 12 mm 18-8 stainless dowel pins, slip fit, 50-pack, as the production pin.

Also confirmed the PTFE Bowden tube trick from the Yeah Hand design solves tendon channel friction, which was going to be the next problem.

NEXT → Apply the same surgery to fingers 2 through 4.

A real parametric skull, and the camera finally fits

Two head tracks converged this week.

The mesh pipeline. Built a depth-map recess detection pass — gaussian baseline subtraction, contour extraction via skimage, Shapely polygon extrusion — that cuts the sculpt’s own mouth and ear slot geometry through to hollow. No invented geometry, no resizing. Took several rounds to get past mask isolation bugs and STL round-trip manifold failures (fixed with manifold3d’s native merge()). Back cover was oversized; measured the head silhouette at each Z height and resized the clamshell opening from 108×150 to 96×96 centred at z=134, verified 5 mm rim clearance.

The commissioned skull. Inderjit delivered the SolidWorks parametric head. I initially misread a binary scan of the .SLDPRT files as dumb imported solids — wrong. The FeatureManager trees show real history: reference surfaces → Scale → sketches and 3D sketches → Surface-Lofts → Trim → Knit → Thicken → Boss-Extrude → Cut-Extrude → Fillets. 123 features on the Skull alone.

Verified via MCP that it’s printable: Skull ~3.7 mm walls, Faceplate ~2.96 mm, Rear Panel ~2.82 mm.

Then into Fusion for integration. Positioned the RealSense D435if behind the faceplate visor, moved 11 mm back for clearance. Built a native camera bracket with 2× M3 holes at ±22.5 mm — 45 mm spacing, matching the real camera’s back holes exactly — plus corner screws and a USB-C cable slot. Fixed a duplicate MirrorEar occurrence problem so all four ear components sit linked and symmetric.

One thing abandoned deliberately: shrinking the faceplate mouth from a perforated grille to a clean 28×8 mm slot. A base-feature temp-BRep operation deleted the whole faceplate body mid-attempt. Recovered by closing without saving. The existing grille is fine and not worth the risk.

Camera spec locked for anyone building along: the D435if’s M3 back holes are only 2.5-3 mm deep — use M3×5 or M3×6, nothing longer. And the 750 nm IR-pass filter means the visor acrylic should be IR-pass, so it can be dark or opaque to visible light.

NEXT → Print the skull and check the RealSense clearance in the real world.

/ ROADMAP

P0 · IN PROGRESS

Head + sensing

Shell designed, still need to wrap up mounting brackets

P1 · IN PROGRESS

Arms + hands

Tendon-driven hands

P2 · QUEUED

Perception loop

Track a person, follow with the neck, no jitter.

P3 · QUEUED

Voice + conversation

STT, LLM, TTS on the Jetson. Latency under a second.

P4 · QUEUED

Torso + power

Frame, compute bay, battery and rail isolation.

P5 · QUEUED

Legs + walking

Bipedal balance, then flat-floor walking. The big one.

/ BILL OF MATERIALS

Raspberry Pi 5 (8GB)
body controller
IN HAND
NVIDIA Jetson
perception + LLM
IN HAND
Intel RealSense D435if
RGB + depth vision
IN HAND
Filament + hardware
everything else
ONGOING

/ CHANGELOG

  • v0.4 Depth stream running on Jetson
  • v0.3 Compute architecture locked (Pi 5 + Jetson)
  • v0.2 Head assembly complete
  • v0.1 Scope defined, parts ordered

/ ABOUT

Milo is a humanoid robot I'm building from scratch, and this is the lab notebook. Twenty-plus years as a software engineer means I can make almost anything think. It does not mean I know what a moment arm is. Closing that gap is most of the project.

Almost every part gets manufactured at home — printed on a Bambu Lab H2C, milled on a Makera Air. The constraint is deliberate: keep this cheap enough that anyone with the same two machines can follow along and build their own. Some of what I need doesn't exist yet, so part of the work is building the tools that build Milo.

Everything gets documented — the decisions, the part numbers, the print that warped at hour nine. Every file ends up downloadable. This is going to take a while, and that's fine. Let's get started.