Take that little 01 device gathering dust in a drawer (or any cheap ESP32 mic board) and turn it into Puck: a portable, push-to-talk voice assistant backed by Claude through Home Assistant — one that holds real conversations, controls your smart home, searches the web, remembers things across days, and speaks in a persona voice of your choosing.
Puck: a hockey-puck-sized device, and a quick, mischievous little sprite. Fitting for a small companion that runs your house.
Tap a button → talk → Claude answers, out loud or on a tiny screen.
Open Interpreter's 01 was a lovely idea — a handheld, open voice interface to an AI. When it was sunset, a lot of us were left with the hardware (M5 Atom Echo, M5StickC) and nowhere to point it.
It turns out the 01's guts are just a microphone + button + ESP32 with WiFi — exactly what Home Assistant's Assist voice pipeline runs on, via ESPHome. And Home Assistant can now use Claude as its conversation agent. So the same hardware becomes a satellite for something considerably more capable than the original:
- Real conversations — not just "turn on the lights". Ask it anything; it answers with substance, in a voice-friendly length.
- Full smart-home control — it is your Home Assistant, so it can actually do things.
- Web search — current prices, news, weather beyond your sensors.
- Persistent, shared memory — a small MCP server (below) lets it remember facts and preferences across conversations, and even share that memory with Claude Code / Claude Desktop on your computer.
- A custom persona + voice — this repo ships "Rocky" (the Eridian engineer from Project Hail Mary: short, broken, sincere English), but the persona is just a prompt you can rewrite.
You do not need an ex-01 device. Any ESPHome-supported mic board works — an M5 Atom Echo (~13,ドル has a speaker) is the easiest starting point.
This repo documents two device builds and one server. Mix and match:
| Piece | Hardware | Role |
|---|---|---|
| Talk-back speaker | M5Stack Atom Echo | Press → speak → Claude replies out loud on the device. |
| Screen terminal | M5StickC PLUS2 | Press → speak → reply rendered on the screen (+ optionally spoken on a HomePod/speaker). |
| Shared memory | any always-on box (a Raspberry Pi) | An MCP server giving Claude durable remember / recall / forget tools, shared across the voice assistant and your computer. |
flowchart LR
subgraph Device["ESP32 voice satellite (ex-01 / Atom Echo / StickC)"]
MIC[Mic + button] --> ESP[ESPHome<br/>voice_assistant]
end
ESP -- audio --> HA
subgraph HA["Home Assistant — Assist pipeline"]
STT[Speech-to-text] --> AGENT[Claude conversation agent]
AGENT --> TTS[Text-to-speech<br/>your cloned/persona voice]
end
AGENT -- controls --> DEVICES[Lights, scenes, media...]
AGENT -- web_search --> WEB[(Web)]
AGENT <-- MCP tools --> MEM[(Puck memory server<br/>Pi · SQLite)]
MEM <-- same MCP server --> CC[Claude Code / Desktop<br/>on your computer]
TTS -- reply audio --> ESP
The device is a thin satellite: it just streams mic audio to Home Assistant and plays/displays the answer. All the intelligence lives in HA's pipeline (Claude + your tools). That's what makes it portable and cheap.
firmware/ ESPHome YAML for the two device builds (+ Rocky sprites)
stickc-claude/ M5StickC PLUS2 screen terminal
atom-echo-claude/ M5Stack Atom Echo talk-back speaker
secrets.yaml.example
home-assistant/ The Rocky persona prompt + the rocky_say.py grammar reference
memory-server/ The shared-memory MCP server (Node + SQLite) + systemd unit
docs/ Step-by-step guides — start here ↓
- docs/hardware.md — the devices, what to buy, flashing your first board.
- docs/home-assistant.md — the Assist pipeline: Claude agent, STT/TTS, exposing your home, web search.
- docs/persona.md — the Rocky persona & voice, and how to make your own.
- docs/memory-server.md — the shared-memory MCP server, wired to both HA and your computer.
- docs/homepod-output.md — the reliable way to speak replies on a HomePod / AirPlay2 speaker (genuinely hard to find documented — this recipe just works).
- docs/troubleshooting.md — every hard-won gotcha (mic/OOM crashes, the HA↔MCP transport, and more). Read this if something misbehaves — it will save you hours.
You can absolutely flash one of these boards, point it at Home Assistant's built-in Assist agent, and get plain local voice control ("turn on the kitchen lights") with no Claude, no persona, no memory, no cloud — the firmware here works fine that way, and HA's own voice docs cover it well.
But — being honest — that's not the point of this project. The whole reason 02 exists is everything on top of basic voice: real conversation, web search, persistent shared memory, and a custom persona voice. If all you want is offline light-switching, use stock HA Assist and skip most of this repo. If you want a little AI companion that happens to also run your house, read on.
- Home Assistant (any recent version; these builds were validated on a bleeding-edge one).
- The Anthropic integration in HA (needs an Anthropic API key) — this is the Claude conversation agent.
- A speech-to-text and text-to-speech engine. Home Assistant Cloud (Nabu Casa) is the easiest; the persona voice here uses a cloned voice via Fish Audio (optional, see persona doc).
- An ESPHome-flashable mic board (ex-01 hardware, Atom Echo, StickC PLUS2, ...) and the
esphomeCLI (pip install esphome). - (Optional, for memory) an always-on Linux box — a Raspberry Pi is perfect.
- "Rocky" is a character from Andy Weir's Project Hail Mary. The persona prompt and the pixel sprites in this repo are fan work, shared non-commercially for personal use. Bring your own persona if you'd rather.
- The cloned voice used in the author's setup is a personal Fish Audio voice (CC BY-NC, personal use) and is not included — you supply your own TTS.
- The firmware is built on ESPHome and Home Assistant's Assist — huge thanks to those projects and the M5Stack ecosystem.
- Everything original in this repo (firmware config, the memory server, the docs) is MIT licensed — see LICENSE.
Built by Alkemist. Contributions and forks welcome — if you revive your own 01 with this, open an issue and tell us. 🪨