Sound Purity Update
- Equalizer removed. The 15-band EQ, the album-specific EQ presets, the custom-preset library, the Hi-Fi bypass button, and the optional cast-EQ toggle are all gone. SugarSpin no longer ships with any tone-shaping equalizer at all. The signal path from your file to your speaker is shorter and simpler. Audiophiles get a tool that respects the mastering. Everyone else gets less to configure.
- What stays: Tube Warmth (optional, off by default, only affects browser playback), ReplayGain volume normalization (optional, off by default), and the bit-perfect cast path to BluOS / NAD which was never altered by EQ in the first place.
- Audio graph rewired. Source → ReplayGain → Tube chain → Analyser → Destination. No EQ filter bank in the path anymore. Less DSP, less work for your browser, cleaner output.
Bug Fixes
- Tube Warmth is now reliably audible on browser playback. With the EQ removed, Tube Warmth is the only sound-shaping stage in the chain. Picking Subtle, Warm, or Vintage now produces an obvious change in tone in real time.
- Settings page no longer crashes when adjusting an EQ slider. The slider does not exist anymore. The Rules of Hooks violation introduced by the cast-EQ toggle is gone with the rest of the EQ surface.
Removed
- 15-band Equalizer panel in Settings.
- Equalizer presets (Bass, Treble, Rock, Jazz, Classical, Hip Hop, R&B, Electronic, Acoustic, Vocal, Night Mode, and your custom presets).
- Album-specific EQ presets and the album EQ picker in the album view.
- Hi-Fi mode toggle in the player bar (no EQ to bypass anymore).
- Cast-EQ opt-in toggle (no EQ to cast).
- Server endpoints: /api/stream-eq, /api/albums/:id/eq, /api/album-eq/all.
Why
- SugarSpin is for people who want to hear their music the way the artist mastered it. An equalizer is a tone-shaping tool that some listeners love, but the audiophile community is split on whether DSP belongs in the signal path at all. Removing it commits SugarSpin to the purist side, which matches the rest of the product (bit-perfect cast, no transcoding, native sample rates preserved, no telemetry). Tube Warmth stays as an optional vintage character effect, because it is a separate philosophical thing from corrective EQ.
New Features
- Tube Warmth — analog-style vacuum-tube emulation — A built-in tube saturation stage that adds the gentle even-order harmonics and soft compression of a real vacuum-tube preamp to every track. Four presets: Off, Subtle (a hint of warmth), Warm (classic tube character), and Vintage (deeper saturation with rolled highs), plus a custom Drive slider. Runs entirely in the browser through the Web Audio API — no quality loss to your source files. Settings → Tube Warmth.
- Tubes visualizer — four glowing vacuum tubes that breathe with the music — A new Now Playing visualization showing four photoreal vacuum tubes glowing amber over a warm bokeh field. The glow brightens and breathes on a slow 5-second cycle tied to the song’s overall loudness — not jittery per-beat flicker. A secondary red glow at the base of each tube simulates the filament heat. Tube positions are measured directly from the source artwork so the glow lines up in both portrait and landscape orientations on any device.
- Polished ··· menu on mobile track rows — The cluttered metadata row on small screens is replaced with a clean 3-dot button that opens a polished bottom-sheet menu — Play, Play next, Add to queue, Go to album, Go to artist. The sheet uses a React portal to fly above the player bar instead of being clipped by it.
- iOS status-bar veil for immersive visualizers — A subtle dark gradient at the very top of the Now Playing view gives the iPhone’s white status icons (time, Wi-Fi, battery) a readable backdrop without painting a hard black bar — the visualizer still extends edge-to-edge underneath.
- Album view: currently-playing track highlight — The track you’re playing on an album page is now picked out in gold with a small animated EQ-bar icon next to it. The album cover area gets a smooth gradient-masked backdrop that fades into the track list, so the page feels like one continuous canvas.
- Home page: 2-row horizontal-scroll sections — Album sections (Recently Added, Recently Played, Top Albums, etc.) and the genre browser now scroll horizontally in tidy 2-row strips, the kind of layout you'd expect from a premium music app. More content visible per screen, less vertical scrolling. The colorful gradient genre tiles return with a decorative music-note glyph.
Bug Fixes
- Pausing on the NAD no longer skips to the next song — The server-side cast monitor was treating any “not playing” state as “track ended” — so when you paused, it auto-advanced. Now it specifically distinguishes pause (user intent, hold position) from stop (track actually ended, advance), and broadcasts the pause state to every other browser so all your screens stay in sync.
- Tube visualizer glow alignment in portrait mode — The four glowing halos now stay locked to the tubes regardless of orientation. Positions are measured directly from the source PNG and anchored to the rendered image rect, so landscape and portrait both align perfectly.
- iPhone reconnect no longer interrupts NAD playback — When a phone’s PWA wakes up on cellular and reconnects to the server, it used to fire a redundant “play this track” call that restarted the same song on the speaker. The server now rejects play requests for a track that’s already playing (unless you actually clicked play yourself).
- NAD doesn’t pause every 30 seconds anymore — The last-client-disconnect handler was too aggressive when iPhone background-pinging caused brief disconnects. Now there’s a 60-second grace window before the speaker is stopped, so transient drops don’t kill your music.
- Speaker reliably re-fetches the next track — Some NAD firmware caches stream URLs and refuses to reload an identical URL. The cast URL now includes a per-play nonce so the speaker always pulls a fresh stream cleanly.
- Mobile bottom-sheet renders above the player bar — Portaled to document.body to escape parent stacking contexts; appears in front of all other UI as expected.
- Album view: tracks flush to the left edge on mobile — Removed wasted padding on small screens so titles and album art get the full width they deserve.
- Subsonic password Show button now actually reveals the password — Was previously revealing an empty field due to a state-update timing bug.
Changes
- Tube Warmth is bypassed by default — Turn it on in Settings if you want the warmth. Listening sessions starts neutral.
- Genre tiles restored to colorful gradients — The flat single-color tiles experiment is reverted. Each genre gets its own vivid gradient with a decorative music-note glyph.
- FAB placement — The visualization settings button (the small circular glyph in the bottom-left of Now Playing) is sized and positioned to match the main floating Now Playing button on the right. Bottom: 50 px on desktop, 134 px on mobile to clear the player bar.
- New pricing & lifetime licensing — Pro is now $49 (was $19.95). Gold is $89 / regular $129 (was $39.95 / $59.95). Added a new Founder tier at $149 for people who want to back a solo developer — everything in Gold, a third server install, a personal note from Roger in the welcome email, and a direct email line for bug reports and feature requests. All paid tiers are lifetime — one purchase, no subscriptions, no renewals, ever. Existing Pro and Gold license keys continue to work at no additional cost; you keep the tier you bought.
New Features
- Live visualizers when casting to your speakers — VU meter, spectrum analyzer, oscilloscope, and waveform now animate from the actual audio while casting to a BluOS / NAD speaker. SugarSpin decodes each track on the server, computes 30-frames-per-second level data, caches it, and pushes it to every connected browser in real time. Visualizations on your Mac, iPad, and other screens all bounce in perfect sync with the sound coming out of your Bluesound Powernode.
- Synced lyrics with 3 animation styles — Scrolling karaoke-style line highlight, full-screen Spotlight focus, and gentle Wave transitions. Lyrics fetched from LRCLib with a NetEase Cloud Music fallback for huge coverage gains on older, Asian, and indie tracks LRCLib doesn't have. Cached in SQLite so they only fetch once. Click the faint settings glyph in the top-right of Now Playing to switch styles.
- Discover Daily algorithmic playlist — A fresh 25-track playlist generated daily, hand-mixed from your favorite artists, albums you haven't played in a while, and deep-cut surprises. Refreshes automatically; press Shuffle if you want a new pick on-demand. Front-and-center on the home page.
- ReplayGain volume normalization — Quiet tracks and loud tracks now sit at consistent levels. Reads industry-standard track and album ReplayGain tags from your files. Three modes in Settings: Off, Track, and Album. No more reaching for the volume between songs.
- Home page redesign — Album covers now lift, tilt in 3D, and sweep a soft shine on hover; click to spring a play button into view. The currently-playing album gently breathes with a gold halo. A subtle gold dust particle field drifts behind the page, and every section title gets a small bouncing EQ meter. Same familiar grid layout, way more alive.
- Server-side cast auto-advance, rewritten from scratch — The server now polls the speaker directly and drives queue advancement itself, with four independent end-of-track signals to handle every BluOS firmware quirk (state-stop, position-frozen, position-stalled, position-reset). Multi-browser races are gone — the server is the single source of truth. Speaker stops when the last browser tab closes.
- Floating visualization settings button — Replaces the iPad-unfriendly double-tap gesture on Now Playing. A faint glyph sits in the top-right corner at 20% opacity; tap to bring up the visualization picker. One tap, one menu, works the same on touch and desktop.
Bug Fixes
- Visualizers no longer freeze every 5 seconds — The server's heartbeat broadcast was inadvertently re-creating the animation loops on every poll. Visuals now run continuously without interruption.
- Spectrum analyzer no longer maxes out — Server-side FFT magnitudes are now properly normalized and dB-mapped, so bars actually respond to the music instead of staying pegged at the top.
- Smoother cast visualizers — Client-side interpolation between server frames means visualizations animate at 60fps regardless of network jitter.
- Speaker stops when you close the app — When the last connected browser disconnects, the server now explicitly tells the BluOS speaker to stop. No more music playing into an empty room after you walk away.
- Cast respects loop & shuffle — Auto-advance now properly honors Repeat One, Repeat Album, and Shuffle modes when casting. One-song-on-loop works correctly.
- Lyric style picker is no longer distracting — The Scroll / Spotlight / Wave pill fades to 20% opacity when idle and brightens on touch, so it doesn't compete with the lyrics for attention.
- iPad lyric-style switching feels instant — Removed Safari's tap-delay heuristic on the style picker buttons. One tap switches styles immediately.
- Tonearm loads ~10x faster on Now Playing — Tonearm image optimized from 2.1 MB down to 243 KB without any visible quality loss.
- Lyrics no longer flicker mid-song — Lyric animation components moved to module scope so React no longer remounts them on every render.
Changes
- FLAC audio quality unchanged — The new server-side level analysis decodes tracks to PCM in memory for math only. Your original FLAC files are never modified, and the bytes streaming to your NAD are still bit-perfect.
- Lyrics sources — LRCLib is still the primary source; NetEase is automatic fallback. No new credentials required from you — both are free and unauthenticated.
- Server now requires ffmpeg — Bundled in the official Docker image. If you're running from source, install ffmpeg system-wide (it's used for the server-side audio analysis).
New Features
- Cast to Bluesound & NAD speakers — SugarSpin now controls BluOS-powered speakers and amps directly. Pick your Bluesound Node, Powernode, Pulse, NAD M10, M33, or any BluOS device from the device picker in the play bar and the audio streams to it natively. Browse your library on your phone, listen on the high-end DAC in the living room. CarPlay-style listening for the home audio crowd.
- Auto-discovery on your network — SugarSpin scans your LAN at startup and finds every BluOS device on it. New speakers surface via a toast notification with a one-tap Connect button. No IP-typing needed.
- Metadata on the speaker display — Your Bluesound Powernode's front panel (or NAD M10's screen) shows the song title, artist, album, and cover art for whatever SugarSpin is playing. Pulls metadata into the speaker's native UI via ICY headers and BluOS URL params.
- Multi-device control of the same speaker — Start a song from your Mac, skip tracks from your iPad, all controlling the same Bluesound speaker. Both devices stay in sync via real-time queue broadcasts. Family-friendly multi-controller setup.
- Smart Stop-then-Play sequencing — Switching tracks on the speaker now does an adaptive Stop → wait for ready → Play sequence instead of fixed delays. Handles different BluOS firmware versions and recovers automatically if a Play command is silently dropped.
- Auto-advance through the queue — When a song ends on the cast device, SugarSpin automatically moves to the next track in your queue. Just like a regular playlist, but on your real speakers.
- Dual server URL detection — SugarSpin now tracks both your LAN URL (e.g., http://192.168.1.50:3333) and your public URL (e.g., Cloudflare Tunnel domain) separately. Cast always uses the LAN URL because speakers can't authenticate through a Cloudflare-protected endpoint — this was preventing casting for anyone using a public domain to reach SugarSpin.
Bug Fixes
- Cast clicks in the Now Playing queue work — Clicking a song in the right-side queue panel while casting to a BluOS speaker now correctly switches the speaker to that track. Previously this was silently broken: the UI advanced but the speaker kept playing the old track.
- Stop Casting actually stops the speaker — Switching the audio target from a BluOS speaker back to your browser now sends an explicit Stop command to the speaker. Previously the speaker would keep playing until the song ended even after you "stopped" the cast.
- No more iPhone duplicates — On cellular connections that frequently re-establish the WebSocket, the device list used to grow with entries like "iPhone (a3f2)" every time the phone reconnected. Devices now have a stable client ID stored in localStorage, so reconnects replace the old entry cleanly.
- "Update available" banner no longer lies — The server's reported version was hardcoded to v1.3.4 regardless of the running build. Now it reads dynamically from package.json so the update notifier is honest.
Changes
- Cast is a Pro / Gold feature — Like CarPlay, casting to Bluesound or NAD speakers requires a Pro or Gold license. Free tier continues to support the web UI on a single client. Upgrading unlocks the entire BluOS ecosystem — many users have $1,000+ amplifiers that suddenly have a great UI in front of them.
- Settings panel: Local Network URL — Removed the "Public URL" card per user feedback. Most users access SugarSpin locally; the public URL is auto-detected silently if needed for routing but doesn't clutter the UI.
New Features
- CarPlay & Android Auto support — Stream your library directly to your car's dashboard. SugarSpin now speaks the Subsonic API, the same protocol used by Navidrome and Airsonic, so any compatible iOS or Android app (Amperfy, play:Sub, Ultrasonic, Symfonium, and many more) connects in seconds. Browse albums on the screen, control playback from the steering wheel, see album art mid-drive. Pro & Gold tiers only.
- External app access — Beyond just CarPlay, the same Subsonic API unlocks dozens of mature mobile and desktop clients for SugarSpin. Use whichever app you prefer; SugarSpin is the server.
- CarPlay settings panel — New section in your Settings page lets you enable/disable Subsonic access, generate a strong password with one click, and view connection details ready to paste into any compatible app.
- HTTP Range request streaming for the Subsonic endpoint — CarPlay scrubbing and seeking work natively, no transcoding or buffering tricks needed.
- Configurable playback buffer — New Playback Buffer setting (3s, 5s, 10s, 20s) under your playback settings. Pre-loads more audio ahead of the playhead to eliminate stuttering on flaky Wi-Fi or cellular. The player now also pauses sync broadcasts during buffer underruns so other devices don't reset to a stale timestamp.
Bug Fixes
- Smoother streaming on Wi-Fi — Audio elements now use
preload="auto" so the browser aggressively buffers ahead, reducing audible stutters when the network briefly drops out.
- Next-track prefetch tunes itself — The gapless-preload window now scales with your buffer setting, so the next song is fully loaded before the current one ends, even on slow connections.
Changes
- Free tier scope clarified — Free continues to support the web UI with 1 simultaneous client. CarPlay, Android Auto, and external-app access now require a Pro or Gold license.
- Shared family streaming — On Pro and Gold, the unlimited simultaneous clients limit applies to Subsonic clients too. Your spouse, kids, and friends can use the same credentials in their own apps and stream from your library at the same time.
New Features
- Repair All Album Tags — One button to fix your entire library. Phase 1 groups unknown tracks into albums from your folder structure. Phase 2 looks up every album on MusicBrainz and corrects the artist, title, year, and genre.
- Smart MusicBrainz Search — Cleans messy album titles before searching. Removes file extensions, splits "Artist – Title" folder name patterns, strips edition suffixes, and uses keyword fallback when exact matches fail.
- Smart Fix per Album — Click the gear icon on any album to preview MusicBrainz corrections before saving. Changes are preview only until you confirm.
- Playlist Sort Toggle — Sort playlists by oldest first or newest first with one click.
- Software Updates Page — This page! Track what's new in each version.
Bug Fixes
- Heart (Liked) sync in play bar — The play bar heart now correctly reflects whether the current track is liked. Previously it always showed empty due to a property name mismatch between the server and the app.
- Shuffle actually works — Shuffle now picks a random track on every skip and when songs end naturally. Previously it only shuffled the queue once and then played linearly.
- Pause stops all audio — Pressing pause now silences both audio channels. Previously, if a crossfade was in progress, the incoming track kept playing in the background.
- Smart Fix no longer auto-saves — Cover art and metadata changes are preview only. Nothing saves until you click "Save Changes." Clicking Cancel discards everything.
- Fetch Missing Covers — Fixed a URL encoding bug that prevented MusicBrainz cover art downloads from working.
- Duplicate route conflicts resolved — Several API endpoints had duplicate definitions causing save failures and missing features.
Changes
- Shuffle simplified — Reduced from three confusing modes (Off, Standard, Smart) to a simple On/Off toggle.
- Shuffle Mode removed from Settings — Shuffle is now controlled entirely from the play bar button.
- Watchtower moved — Watchtower now appears at the top of the right column in Settings for easier access.
- Repair Library — Now has its own dedicated state and progress indicator, separate from other repair tools.
- About page rewritten — Updated with Roger's personal story in his own voice.
- Deploy script updated — Now supports local-only deploys by default. Use
--push flag to publish to Docker Hub.
Removed
- Fix All button — Replaced by Repair All Album Tags, which uses MusicBrainz as the authority instead of blindly trusting folder names.
- Fix Unknown Tags button — Merged into Repair All Album Tags (Phase 1 handles unknowns automatically).
New Features
- Multi-device sync — Play music from one device, control it from another. All clients stay in sync over WebSocket.
- Audio target selection — Choose which device plays the audio. Control playback from your phone while sound comes from your desktop.
- Album editor — Edit album title, artist, year, and genre. Upload or search for cover art from iTunes and Discogs.
- Cover art search — Search iTunes and Discogs for album artwork directly from the album editor.
- File watcher (Watchtower) — SugarSpin watches your music folder and automatically picks up new files.
- Crossfade — Smoothly blend between songs with adjustable duration (0 to 15 seconds).
- Hi-Fi mode — Bypass the equalizer for pure signal output to your DAC.
- 15-band equalizer — Fine-tune your sound with built-in presets (Bass, Treble, Rock, Jazz, Classical, and more) or create custom EQ profiles.
- Album EQ presets — Save EQ settings per album so they load automatically when that album plays.
- Format-aware playback — When you have the same song in multiple formats (FLAC + MP3), choose which version plays.
- License system — Free, Pro, and Gold tiers with offline validation.
Changes
- Now Playing view — Full-screen experience with vinyl animation, VU meters, and spectrum visualizer.
- Improved scanning — Faster initial library scan with better metadata extraction.
- Responsive design — Better mobile layout for phones and tablets.
Initial Release
- Self-hosted music streaming from your NAS or server
- Docker-based installation with one command
- Support for FLAC, MP3, M4A, WAV, OGG, AAC, OPUS, AIFF, APE, WV, ALAC
- Album and artist browsing with artwork
- Search across your entire library
- Playlists and Liked Songs
- Play history and listening stats
- Works on any device with a web browser