v0.2.0 — Spotify-style player, shuffle & repeat
Big UX release: Syncwave now feels like a real music app, and it's rock-solid to self-host.
✨ New
- 🎚️ Spotify / YouTube-Music-style player — a fixed bottom player with shuffle and repeat (off / all / one) as shared room controls, plus play/pause, skip, a scrubber, and a reactions popover.
- 📲 Mobile-first app shell — fixed top bar + bottom player with tabbed Queue / Add / Chat that fits a phone screen in one view; two-column layout on desktop. Chat is a proper scrolling window.
- 🎨 Consistent design system — unified rounded pills, panels, and rows (no more mismatched square/rounded controls).
🛠️ Fixes & reliability
- 🐳 yt-dlp works out of the box in Docker — the image now ships
python3(yt-dlp's Python build needs it); tracks resolve and cache instead of skipping. - 📱 Mobile rendering fixed — killed a horizontal-overflow bug that made phones render the desktop layout.
- ⏳ Honest caching UX — the progress bar no longer advances while a track is still downloading; it shows a caching/processing state, then starts the shared clock when audio is ready. Failed tracks auto-skip.
- 📌 Per-room PWA install — installing from a room opens straight back into that room (server-rendered per-room manifest); a secure-context-aware install banner.
📚 Docs
- HTTPS is required for PWA install — added a clear guide with the easiest paths: Tailscale Serve/Funnel (free, no domain) and Caddy + domain. See DEPLOY.md.
Deploy
cp .env.example .env
docker compose up -d --buildRuns on a VPS or home server (needs a long-lived WebSocket server + disk cache) — not serverless. Node 20+ and ffmpeg required for local dev.