DuetPlus

Every phone at the party, playing one song, in sync.

Free and open source

One phone hosts, everyone else joins over Wi-Fi, and every speaker in the room plays the same sample at the same moment. No echo, no drift. iPhone and Android, together.

Version 1.2.0 · Android 9+ · iOS 15+ · GPL-3.0

DuetPlus on three iPhones: the home screen, the host playing Get Lucky by Daft Punk with the album cover on a spinning record, and a guest showing In sync with 0.0 ms playout error.

Host. Join. Play.

One phone taps Host a party. Everyone else taps Join a party and finds it under Parties nearby.

Phones find each other on the same Wi-Fi, or on the host’s hotspot. If your network blocks discovery, type the last number of the IP shown on the host and you’re in.

A friend who arrives halfway through a song joins at the right spot. A phone whose Wi-Fi drops keeps playing and reconnects on its own.

The Join a party screen in DuetPlus, listing two parties found on the Wi-Fi.

Why it stays in sync.

Most apps send play and hope. DuetPlus sends “sample N leaves the speaker at time T”, and every phone works backwards from there.

Each audio buffer carries a hardware timestamp for the moment it leaves the speaker, so a phone with 40 ms of delay simply plays 40 ms earlier than one with 10. Small errors are corrected while the song plays, by a speed change of a tenth of a percent that nobody hears.

A guest phone in DuetPlus, In sync: network round trip 0.1 ms, playout error 0.0 ms.
One clock
Guests ping the host ten times a second, keep only the fastest replies and follow the host’s clock to about a millisecond, drift included.
Sync check
Each phone plays a short chirp on cue while the host’s microphone listens. It measures every phone’s real delay, corrects it and checks again.
Same samples
Every phone decodes the same Opus stream with the same code, so the songs match sample for sample, not just at the start.
No waiting room
Join mid-song, drop off the Wi-Fi, come back: the music never restarts for anyone else.

Any song.

Search YouTube Music or YouTube, or paste a link. Or play your own files.

The host fetches only the audio and hands it to every phone over the local network. MP3, FLAC, WAV, M4A, AAC, ALAC and OGG files work too, with their tags and covers.

The album cover spins on the record on every phone, guests included, and the colours of the screen follow it.

The DuetPlus host playing Get Lucky from YouTube Music, with the album cover on a spinning record and the controls below.

The rest, in short

iPhone and Android
Mix them freely in one party. Built with Flutter on a shared C++ audio core.
No account
No sign-up, no servers of ours. The phones talk to each other on your own network.
Up to date
On Android, the bundled yt-dlp updates itself once a day, so YouTube keeps working.
Free and open source
The code is on GitHub under the GPL-3.0 licence: read it, change it, share it.

DuetPlus for Android and iPhone

Version 1.2.0 · Android 9+ · iOS 15+. Questions:

Android: DuetPlus-1.2.0-arm64.apk All downloads on GitHub

Android: open the APK on your phone and allow installing from your browser when asked. iPhone: install the IPA from the releases page with AltStore or Sideloadly, or build it from the source. DuetPlus plays YouTube audio outside YouTube’s own player, which YouTube’s terms don’t allow; it is a technical project for your own listening.