Skip to content

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.

Oct 2026v0.2.0, verified end to end
reachy-mini.local · DJ Reachy Remix

DJ Reachy Remix

Music, conversation and motion for your Reachy Mini

Voice transport connectedChatGPT subscription Live

Ready

Generate a new track or play one from your library.

Stop ends local playback. Provider generation may continue.

ChatGPT subscription selectedProvider access unverifiedMusic key configured

Music generation

Eleven Music model

music_v2_5

Duration

30 s

Request type

Prompt

Song prompt

Local motion

Groove, the original
Intensity80 of 100, the original level

Saved tracks

Antenna Shuffle

20261020_Antenna_Shuffle.mp3, 12.1 KB

Bass Bot Bounce

20261019_Bass_Bot_Bounce.mp3, 12.1 KB

Neon Groove

20261018_Neon_Groove.mp3, 12.1 KB

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.

Notable

A stray yes can't spend credits

When the model decides you asked for music, it only creates an unbilled, frozen draft. The app reads back the exact request and duration, and only your replies to that draft go to a bounded planner that classifies approval, correction or refusal. Approval consumes the draft once, any correction forces a fresh preview, and the draft dies after 90 s or four replies. Silence, the assistant's own narration, stop or a disconnect never count as consent.

Stack and numbers

PythonFastAPIReachy Mini SDKElevenLabs MusicChatGPT LiveWebRTC (aiortc)PyAVpytestuv
Test functions
349
Fork commits
43
Lines added over upstream
20
k
Test code
11.6
k lines