Skip to content

Releases: avisforevelyn/Duetto

Duetto 1.0.1

Choose a tag to compare

@avisforevelyn avisforevelyn released this 04 Jul 19:35

listen together, in tune.

A playback-robustness release — background listening on iOS is now solid.

Fixed

  • Background auto-advance rebuilt — track advancement and prefetch now live in a plain module cursor (window.__lsAdv), mutated synchronously inside the ended handler. React state is frozen in a backgrounded iOS tab, so the old React-driven advance died after one hop.
  • The real culprit of silent background playback: preload='auto' — the audio element eagerly downloaded the whole file the moment src was set, and iOS cuts that network off in the background. Now preload='none': the address is set instantly, bytes load on play(), which iOS allows.
  • "Advances but pauses" — a track finishing naturally fires a pause event that used to knock the just-advanced next track back into pause. Now guarded (internal-load window + ended check).
  • Personal FM keeps flowing — the module cursor stays in sync when FM batches extend the queue, and switching from FM to a playlist properly escapes the FM queue kind.
  • Updates actually reach installed PWAsindex.html and the web manifest are served with no-cache.

Upgrade: git pull and restart the service — no schema or config changes.

Duetto 1.0.0

Choose a tag to compare

@avisforevelyn avisforevelyn released this 04 Jul 15:23

listen together, in tune.

The first public release of Duetto — a self-hostable listen-together player for two, with a bring-your-own-AI companion that actually listens.

Highlights

  • Listen together in real time — shared rooms over WebSocket: play, pause, seek, and track changes stay in sync; share songs as cards; status cards record who played, paused, hearted or collected what
  • An AI that actually listens — it downloads the very stream you are hearing and listens with a multimodal model (timed-lyrics fallback), once per song, cached forever. Every reply knows the playback position, the exact lyric line playing, your play count together, and the rolling memory grown from your conversations about the song
  • Two reply styles — split chat bubbles, or a full single reply with an unfoldable thinking chain
  • Quote a lyric — long-press any line and it rides your message as a quote block, archived as the exact passage
  • Built-in access gate — first-open PIN protects every API route and the sync socket
  • Background-safe playback — a three-track prefetch granary (shuffle draws its plan ahead) keeps lock-screen playback rolling with zero network
  • NetEase Cloud Music integration, personal FM auto-continue, five palette skins, per-surface glass controls, installable PWA

Docs

Ships empty of private data — bring your own key, songs, and the person you want to listen with.