We turned a palm-sized desk robot into a second body for Milo, our home AI. Same idea as Reachy Mini: one brain, one memory, another face in the room. As of this morning you can tap its head, ask it a question out loud, and Milo answers through its little speaker — in his real voice, with live web lookups and his own long-term memory.
| Ability | Status |
|---|---|
| Hold a spoken conversation as Milo | Works. Tap the head, talk, get an answer in Milo's real voice. The mic now stops on its own about a second after you finish a sentence, instead of a fixed recording window. |
| Look things up on the live web | Works. News, weather, facts — through the same read-only lookup service Reachy uses. One pipe, both robots. |
| Remember past conversations | Works, both directions. Searches Milo's long-term memory, and now writes every desk conversation back to the same shared store — tell StackChan something, and Reachy knows it too. |
| Recognize faces (family, dogs) | Works with decent light. Named James from one frame of its own camera, same matcher and gallery as Reachy. Unknown faces get silence, by design. |
| Show what it's doing | Works. Wide eyes while listening, a thinking face while it works, a smile while it talks, back to idle after. |
| Hands-free wake word | Not yet. Tap-to-talk only, on purpose — the mic opens only after a tap. |
James: Hello Milo, how are you?
StackChan: Hey James — doing good, just hanging out on the desk. How's it going with you?
James: Hey Milo, tell me what you know about Benny.
StackChan: Bennie's our labradoodle, about six years old. He's one of the two dogs with Chewy the chocolate puppy. That's the main stuff I have on him.
James: I love you.
StackChan: Love you too, James. Always here.
That Bennie answer didn't come from the language model's guesswork — it came from a memory search against the same store Reachy writes to. The speech recognizer sometimes hears "Myla" or "Malu"; Milo corrects it in stride and answers anyway. If an answer needs a slow lookup, he says "one sec, checking" instead of leaving dead air. We learned that one the hard way: the first version said "I'll check Pensacola for you" and then went silent forever, because it had no tools and no way to come back with an answer. Never let a robot promise what it can't do.
The best bug of the day: the firmware plays a happy chirp when you pet the head — and the mic opened fast enough to hear it. Whisper faithfully transcribed the robot's own sound effect as "Woop! Woop! Woop!", and Milo, hearing what sounded like cheering, asked "What's the celebration?" He got confused by his own body. A longer pause between the chirp and the mic fixed it.
| Step | What we proved |
|---|---|
| Own the robot | Flashed local-only firmware over USB-C so it talks to our Mac, not the vendor cloud. Mixed WPA2/WPA3 Wi-Fi broke joining; a WPA2-only network fixed it. Details: local control writeup. |
| Give it a face | Six Twemoji expressions baked into firmware; listening and idle looks. Face test notes. |
| Prove the hardware | Tap sense, slow nod, speaker, mic, one camera still — each a separate gated test on the spare unit. |
| Name a face | First frames were too dark and matched nobody (correctly: unknown means silence). A desk lamp fixed it — it named James from one frame using the same matcher and family gallery Reachy uses. |
| Milo's voice | Streamed his real voice to the robot speaker. The vendor test voice is not Milo and never will be. |
| Conversation | Wired tap → listen → transcribe → think → speak into a loop, then added web lookup and memory search after the robot promised a lookup it couldn't do. |
| Make it feel alive | Streaming everything: the reply speaks sentence-by-sentence as it's generated, the mic ends on silence instead of a timer, and every turn is written back to shared memory. Runs as a background service on the Mac now, not a script someone has to babysit. |
Code and steps: github.com/jmeadlock/stackchan-milo
git clone https://github.com/jmeadlock/stackchan-milo.git
cd stackchan-milo
uvx pytest
Run it for days and see what breaks: reconnects, servo wear, surprises. Maybe a wake word — though honestly, tapping a robot on the head to get its attention feels right. The family units stay boxed until the spare has earned its keep.