Taikos/reachy_mini_speaker
Reachy Mini Speaker
Turn your Reachy Mini into a smart speaker that any phone in the house can stream to — and watch it dance to the beat.
- AirPlay-compatible — works with anything an iPhone, iPad, or Mac can play (Apple Music, Spotify, YouTube, podcasts, system sounds). Powered by shairport-sync, the open-source AirPlay receiver. Not Apple-MFi-licensed.
- Spotify Connect-compatible — Reachy Mini appears in the Spotify app's device list. Lock-screen "Now Playing", multi-device queue, one-tap transfer all work. Powered by librespot, the open-source Spotify Connect client. Not officially licensed by Spotify.
- Beat-reactive motion — head bob, antenna pulse, and a subtle body sway, all synced to the music in real time. Hard-clamped to a conservative safety zone with a duty-cycle backoff for long playback sessions.
- Zero-config install — click Install in Reachy Mini Control. No
curl | sh, no kernel modules, no systemd overrides.
Quick start
- Open Reachy Mini Control on your phone or laptop.
- Apps → search Reachy Mini Speaker → Install.
- From the dashboard, hit Run.
- First launch: the app auto-installs the two native dependencies (shairport-sync and raspotify, ~20 MB total). Reachy Mini OS configures user
pollenwith passwordless sudo, so this happens automatically — the web UI shows an "Installing audio codecs (~30 s)…" banner. Subsequent launches are instant. - On your phone:
- iPhone / Mac: Control Center → AirPlay → pick Reachy Mini.
- Spotify (any platform): Devices → pick Reachy Mini.
- Play anything. The robot starts moving.
What "auto-install" actually does on first launch: adds the raspotify apt source (which ships an aarch64 librespot binary), runsapt install shairport-sync raspotify alsa-utils, disables the system shairport and raspotify services (we run our own per-app instances), and symlinks/usr/bin/librespotinto the app's cache dir. All idempotent. If your robot's sudoers were customised to not be passwordless, the web UI will fall back to a clear message with the exact one-line install command to copy-paste.
How it works
Phone (Spotify / AirPlay)
│ Wi-Fi (mDNS discovery)
▼
┌─────────── Reachy Mini ───────────┐
│ librespot shairport-sync │ ← per-app subprocesses
│ │ │ │ spawned by main.py
│ └──── PCM ───┘ │
│ │ │
│ ▼ │
│ AudioTap (in-process tee) │
│ │ │ │
│ ▼ ▼ │
│ ALSA out Beat detector │ ← onset envelope autocorrelation
│ (5W (BPM + confidence) │
│ speaker) │ │
│ ▼ │
│ TargetStore │ ← single source of truth
│ │ │
│ ▼ │
│ ControlLoop @ 100 Hz │ ← only set_target call site
│ │ │ │ │ │
│ Head Body Antennas Pitch │
└────────────────────────────────────┘No kernel modules. No systemd edits. No system-wide raspotify install. The whole audio path runs as subprocesses owned by this app, in this app's cache directory.
What's different from existing apps
This is not a fork of CreaturesDigital/spotify_dancer — credit to that project for being first, but it requires a curl | sh raspotify install, an snd-aloop kernel module load, and /etc/systemd/.../override.conf edits. We avoid all of that:
Controls
- Antenna press (bend forward or back, hold ~250 ms, release) — toggles reactive motion on/off.
- Antenna long-press (>1 s) — re-pairs (clears caches; phones will re-discover the speaker).
- Web UI — open
http://reachy-mini.local:8042for pair status and the on/off toggle.
Reactivity
One chill mode. Antennas are the primary rhythm cue — they swing at half-tempo (peak every other beat), small enough to stay quiet (~15° amplitude). The head bobs about 4 mm and nods ±2°. The body drifts ±5° on a slow 10-second cycle, ambient rather than beat-locked.
That's deliberate: the small antenna motors are nearly silent, the larger Stewart-platform and base motors stay calm so they don't whine over the music. Motion auto-pauses after 60 s of silence to keep motors cool.
Requirements
- Reachy Mini Wireless (Lite works for streaming, but mDNS auto-discovery is most reliable on Wireless's onboard Wi-Fi).
- Phone and robot on the same Wi-Fi network without client isolation (most home networks; many hotel/conference networks block this — use a phone hotspot if you hit issues).
- Spotify free or Premium (both work; Premium gets 320 kbps).
Troubleshooting
Credits, trademarks & license
App source code: Apache-2.0. Bundled binaries (downloaded at runtime) keep their own licenses:
- librespot by librespot-org — MIT. Open-source reimplementation of the Spotify Connect protocol; not officially endorsed or licensed by Spotify AB.
- shairport-sync by Mike Brady — MIT. Open-source AirPlay 1 / AirPlay 2 audio receiver; not Apple-MFi-licensed and not officially endorsed by Apple Inc.
This is the same software stack used by community projects like raspotify, Snapcast, Volumio, and most non-MFi "AirPlay-compatible" hardware. Apple, AirPlay, and the AirPlay logo are trademarks of Apple Inc. Spotify and the Spotify logo are trademarks of Spotify AB. We don't claim any affiliation with either.
See THIRD_PARTY_NOTICES.md for full attributions.
Built by [Taikos](https://huggingface.co/Taikos). Inspired by Pollen Robotics' conversation app design system. Thanks to the Pollen team and the Reachy Mini community.
