He’ll grow up with robots. He should know how they’re made. So my son and I are teaching a small round device to listen, talk and remember. He decides what it does. We build it together.
Six weeks · 18 workshops · Sat mornings, Sun afternoons, Wed at six.

Why build it together
A robot from a box is a toy. One decided at the kitchen table is his. And the time it takes is ours.
The magic word, the voice, the jobs, the face. I don’t overrule. I type.
Real firmware, a real speech → model → voice loop. He learns by holding it, breaking it and fixing it.
Every workshop ends with something that didn’t work an hour ago. Eighteen small wins in a row.
Three slots a week, on the calendar, with a streak that resets if either of us skips.
The device
A small round device already has a screen, two ears, a voice, a brain, a memory card and room for a battery. Out of the box it shows a flower and the time, and knows nothing about him.
Six weeks of programming turn it into his. He holds it and picks the words. I type.


A round screen the size of a big coin. That's where the face lives.
Two tiny microphones, so it can hear you from across the room.
A little speaker. It talks back.
A chip that runs our code and can call the cloud when it's stuck.
A card full of stories it keeps inside.
So it can come with us instead of living on the desk.
It knows what time it is, even when it's asleep.
It can tell when you pick it up or shake it.
From the bench
The box, the first plug-in, the moment it forgot everything it came with.






The build log


Soon: taking my Agents out to the real world.


Guess what just arrived in the package?


Soon: taking my Agents out to the real world.


Guess what just arrived in the package?


Soon: taking my Agents out to the real world.


Guess what just arrived in the package?


Soon: taking my Agents out to the real world.


Guess what just arrived in the package?

Where the wire ends
Pip is the companion we imagined first: screen-free, worn on the wrist, holding a real spoken conversation with a small child. Wake-word only, nothing stored, no camera, no ads. Ours is the same idea, with the kid who’ll wear it making the calls.
The plan
Each workshop has two lines: what we tell him, and what’s really going on under the hood.
One medal per finished week.
By Wednesday it has a face and can hear us.
Take it out of the box, plug it in, and wipe everything off it so it's ours.
Unbox, enter download mode, erase_flash, check the eFuses are unburned.
Put our own code on it and draw a face on the little screen.
First firmware flash. Something on the AMOLED that isn't the vendor demo.
Talk into it, then make it play our voices back.
Mic + speaker through the ES8311 codec. Record, play back.
Say the magic word and it tells a story.
Pick a word. When we say it, it wakes up.
ESP-SR wake word running. Test it on a kid's voice, not just ours.
Give it a card full of stories to keep inside.
Format the TF card, load the starter audio, write the manifest.
Say the magic word, ask for a story, and it tells one.
Wake word → command → play cached story off the SD card.
It has a name, a character, and knows yours.
Decide who lives inside it, and what they sound like.
One character, one voice. Generate the first batch with TTS.
Teach it to say your name out loud.
Fragment stitching — names, numbers, time of day assembled on device.
Teach it words it can listen for, like 'story', 'game', 'again'.
Local command vocabulary. The command list is the curriculum.
It answers things nobody taught it.
Now it can answer things nobody taught it.
Live STT → LLM → TTS round trip over Wi-Fi. The core loop.
Make it look like it's thinking, so waiting isn't boring.
Fill the 1–2s cloud latency with a sound and an animation.
Give it two jobs: wake you up, and say goodnight.
Activity state machine — the two rituals end to end.
It remembers what you played, never what you said.
It writes down what you played, but never what you said.
Append-only event log. Ring buffer, oldest overwritten. No raw audio.
When it finds Wi-Fi, it sends the notebook home.
Sync agent → Supabase edge function. Push events, pull manifest diff.
It goes to sleep, and wakes up knowing new stories.
Content pull + OTA check. Loved a dragon story — next sync brings more.
Battery in, shell on, hand it to a real kid.
Put the battery in so it can come with us.
LiPo in the case, AXP2101 charging, measure real runtime.
Decide what it looks like, and make it that.
Minimal shell for the test. Room object first — the logs pick the form.
Give it to a real kid. See if they come back to it.
Week-6 kid test. Day 3 return is the number that matters.
How we keep going
Six weeks is long for a kid. So the plan is a game.
10 coins the moment we press “We did it”. He decides what coins buy.
25 bonus coins every 3 in a row. Skip one and it’s back to zero.
Four per workshop plus a note: what happened, what broke, what was funny.
The last one only lights up after a real kid has kept it for three days.
One email after each workshop: photos, what broke, what he decided.