Reachy Mini robot app, remixed
DJ Reachy Remix
My remix of mzurki's DJ Reachy, a Reachy Mini app that takes a song request by voice, composes it with Eleven Music and dances to it.
DJ Reachy Remix turns a Reachy Mini into a DJ you can control. You ask for a song, Eleven Music composes it, and the robot plays it and dances with a local audio-reactive engine, while a deck-style web panel lets you pause, resume, stop and replay.
01 / 06 · Ask by voice
Motivation
The original DJ Reachy by mzurki is a fun demo, published as a Hugging Face Space in December 2025. You talk to the robot over OpenAI Realtime, it writes a song with Eleven Music, and it grooves along. The audio-reactive dance engine and that core loop are mzurki's work, and the fork keeps their Apache 2.0 history.
I wanted the parts a demo skips. Pause, resume and stop that cancel work mid-song, explicit Eleven Music controls, a library so I don't pay to hear the same track twice, and separate settings for conversation, music and motion.
I also wanted the conversation on the ChatGPT subscription I already pay for instead of per-minute API billing, with a hard guarantee that nothing ever bills a different account than the one I picked. The fork ships under its own package name and app slug, so it installs next to vanilla DJ Reachy.
Capabilities
- A deck-style control panel served by the app itself, with live Ready, Composing, Playing, Paused and Stopping states, connection chips, toasts and a sticky phone layout.
- Eleven Music controls for model (
music_v1,music_v2,music_v2_5), 3 to 600 s duration, prompt or composition plan, styles to include or exclude, lyrics, language and force-instrumental. - A paid-generation guard in the panel. Generate stays disabled until you tick the ElevenLabs credits box, and the box clears after every request.
- Spoken music requests on subscription voice become a frozen draft that the app previews and a planner judges as approval, correction or refusal.
- Pause, resume and stop from voice or the panel through the same tools. Stop reaps the decoder subprocess and kills it after a 1 s grace.
- A saved-track library with in-browser preview, replay on the robot without regenerating, and delete.
- Four named dance styles (groove, bounce, classic, smooth) and an intensity fader on top of the upstream dance engine.
- Two voice backends picked explicitly, ChatGPT subscription Live through a trusted-host broker or OpenAI API-key Realtime, plus a settings-only mode that never touches the robot.
Key decisions
Subscription voice never falls back to API billing
Why
Choosing one billing path must not quietly spend money on another. If the subscription session is selected, that's the only thing that runs.
What it cost
A broken subscription session just fails, and I have to switch backends by hand.
Sign-in stays on a trusted host
Why
The Codex sign-in for ChatGPT Live lives on a broker host. The robot only gets the broker URL and a scoped bearer token. The broker caps concurrency and body size, follows no redirects and requires TLS off loopback.
What it cost
One more process and host to run, and it depends on the consumer ChatGPT Live contract, which differs from the public API.
Paid music needs a real confirmation
Why
Silence, the assistant's own narration or a stale yes must never spend credits. A spoken request becomes a frozen draft that is consumed once and expires after 90 s or four replies.
What it cost
Extra planner calls while a draft is pending, and one more turn of conversation before the music starts.
Cancellable playback tasks with a decoder subprocess
Why
The voice loop must not wait for a song to finish, and pause or stop must clear queued audio and reset the dancer.
What it cost
A lot more lifecycle code for owner handover, stale-job fencing and reaping, with its own test modules.
Hand-written panel with no build step
Why
Plain HTML, CSS and JS served by the app's FastAPI server works offline on the robot and adds no runtime dependencies.
What it cost
No component framework, and the deck infers its state from the HTTP requests it has open.
Architecture
The panel and the voice session drive the same tool registry. Spoken music requests detour through the confirmation step, and the decoder feeds the speaker and the dancer from one stream.
Limits and what's next
- Verified end to end against synthetic fixtures. A session on the physical robot is next.
- The deck shows generation as one Composing state. Per-phase progress needs a status endpoint, which is planned.
- Stop ends playback on the robot. Cancelling the generation at the provider is future work.
- Subscription voice depends on the ChatGPT Live endpoint and follows its upstream changes. The API-key backend is the stable alternative.
- Pause works on 40 ms frame boundaries, and voice settings apply from the next connection.
- A transcript view in the panel is planned. For now, voice requests and confirmations live in the voice session.