What's new in Subwave™ — every release, every fix.
Version 1.3.3
Browse Stations button in the Internet Radio section — search the Radio Browser community database
of 30,000+ stations by name and add them directly to your library.
Version 1.3.3
Added
Browse Stations button in the Internet Radio section — tap to search the Radio Browser community database of 30,000+ stations by name and add them directly to your library.
Radio Browser attribution added to the Open Source Licenses screen.
Version 1.3.2
Internet radio crash and overflow fixes — Now Playing screen no longer crashes on live streams,
radio stations excluded from Continue Listening, Add Media Source simplified to Subsonic and Local Device,
and seek bar scrubbing, waveform, and thumb hidden correctly for all styles during radio playback.
Version 1.3.2
Fixed
Opening the Now Playing screen while an internet radio station is playing no longer crashes — the smooth-position interpolator now correctly handles live streams where ExoPlayer reports no known duration.
Internet radio stations no longer appear in the Continue Listening section on the dashboard.
Add Media Source screen now shows only Subsonic and Local Device — Navidrome, Airsonic, Gonic, and Ampache entries removed since they all use the same Subsonic-compatible API; the Subsonic option description updated to reflect this.
Seek bar right-side time label now shows "∞" instead of an overflow value (e.g. -25197142:-32) when playing an internet radio station — ExoPlayer reports Long.MIN_VALUE for live streams with no known duration, which previously overflowed when subtracted from position.
Scrubbing is now disabled on all seek bar styles (default, squiggly, dotted, breathing, waveform) when playing internet radio.
Waveform seek bar now falls back to the flat line bar when playing internet radio instead of attempting to render a waveform.
Seek bar playhead thumb is now hidden on the default and squiggly styles when playing internet radio, matching the other styles.
Version 1.3.1
Pull-to-refresh on the dashboard, Continue Listening section, swipe the Now Playing bar to skip tracks,
Most Played Albums for local users, activity stats redesign, seek bar smoothness fixes,
localisation updates, and Play All dialog improvements.
Version 1.3.1
Added
Pull-to-refresh on the dashboard home screen — swipe down to reload all sections.
Dashboard logo is now hidden by default; toggle to show it added in Theme Settings.
Continue Listening section on the dashboard — featured track displays a progress bar and time remaining, and resumes playback from where you left off when tapped.
Swipe left or right on the Now Playing bar to skip to the previous or next track — the title and artist slide with the gesture and spring back on release.
Progress bar line shown at the bottom of the currently playing track card in the queue.
Most Played Albums section now appears on the dashboard for local-only users who have listening history.
Changed
Activity stats tabs (Listening / Plays / Top Artists) moved outside the card into a standalone pill-shaped row; page indicator dots moved below the card.
Plays chart bars now show play count and duration labels above each bar with an X PLAYS THIS WEEK summary line.
Heatmap now reads "You listen most at X" instead of "Peak: X"; label repositioned under the Less → More legend.
Continue Listening cards now snap smoothly and cycle infinitely through all tracks.
Smart Mix buttons on the dashboard now show icon and label side by side in a compact pill layout.
Dashboard section headers for local-only users now match Subsonic naming — Recently Added, Random Artists, Random Albums.
Fixed
Star ratings in the All Songs list now use the outline star icon for unrated positions and the theme primary color for filled stars, matching the rest of the app.
Play counts in the All Songs list now reflect locally tracked plays, not just the value last returned by the server.
All Songs list play count now updates immediately after a scrobble instead of waiting for the next 24-hour cache refresh.
Tapping the previous, play/pause, or next buttons on the Now Playing bar no longer opens the Now Playing screen — only tapping the rest of the bar does.
Progress bars (default and squiggly) now advance smoothly every frame instead of jumping every second.
Squiggly seek bar now flattens while scrubbing, matching the pause behaviour.
Scrubbing the default or squiggly seek bar while a track is playing no longer causes the thumb to snap back to the old position on release.
Hardcoded UI strings replaced with localised string resources across the dashboard, theme settings, and Now Playing screens — all 6 supported languages updated.
Tapping the Artists card in the library now correctly opens the Artists list for local source users instead of the Local Library screen.
Scrollbar bubble now correctly shows the section label at the current scroll position instead of an incorrect linear approximation.
Play All dialog in album detail now matches the playlist dialog — dividers between options, Play Now / Add to Queue / Play Next order, and no darker background on list items.
Activity detail screen heatmap section now correctly labelled "Last 5 Weeks" instead of "This Month".
Top Artists in the Activity section no longer inflates scores for tracks with no server play count.
Album card play button on the dashboard now works correctly for local-only users.
Version 1.3
Smart mixes, Songs library section, grouped Favorites by Artist/Album, Top Rated tabs,
and a wave of performance improvements including instant cached loads and parallel dashboard fetches.
Version 1.3
Added
After successfully adding a music source for the first time, the app now navigates directly to the home screen instead of returning to the Manage Sources page.
Tapping the artist name on the Now Playing screen navigates to the artist's detail page.
Tapping the album name on the Now Playing screen navigates to the album's detail page.
Top Tracks section on the artist detail page now always shows a header with a loading indicator while fetching, retries up to 3 times, and shows an error message on failure instead of silently not appearing.
Top Tracks section now shows "No top track charts found" when the server returns no data, instead of an empty section.
About Artist section now always renders with loading, empty, and error states — retries up to 3 times on failure.
Favorites section now groups favorited songs by Artist and Album tabs — songs are sorted alphabetically within each group, and each group is collapsible.
Top Rated library section now shows Songs and Albums in separate tabs for both Subsonic and local-only users — albums display in a grid with star ratings, songs show inline star ratings.
Star ratings now displayed on song rows in the Favorites screen, matching the rest of the app.
Dashboard Most Played Tracks star rating now uses the app's theme primary color, matching the Favorites and Top Rated screens.
Smart mix functions with dashboard quick mixes and library smart mix page.
Added Songs section to the library home grid — loads all server songs with Room database caching for instant subsequent opens, supports search, sort by Title / Album / Year / Rating / Play Count, alphabet scrollbar, and Add All to Queue.
Clearing the queue now automatically closes the Queue screen and Now Playing screen.
Artist Radio mix pill on the dashboard now always shows the radio icon instead of album art.
Fixed
Fixed waveform visualizer showing a bowtie/hourglass artifact when volume is turned to near-zero — quantization noise from the 8-bit Visualizer API was being normalized against itself, inflating noise into a full-height alternating pattern; signal below the noise floor now renders as a flat line.
Now Playing screen text now correctly uses white (dark-mode) colors in light mode when the ProjectM visualizer is active, matching the existing behaviour for blurred album art and color gradient backgrounds.
Star and heart icons on the Now Playing screen are now the same size and slightly smaller (portrait 28dp, landscape 24dp); inactive state now uses the theme primary color instead of white, matching both light and dark modes.
Artist image now loads correctly when navigating to the artist detail page from the Now Playing screen.
Library section navigation state bug.
Changed
"Artist Radio" mix type label renamed to "Artist" across all translations (previously "Radio" in Japanese, Korean, Chinese, and wrong Spanish word "Artista" in French).
Smart mix maximum size increased from 50 to 200 songs; random mix now draws from 20 server albums instead of 5.
Performance
Fixed cover art being re-fetched from the server on every load — Subsonic auth URLs include a randomly-generated token that changed on every call, defeating Coil's cache. Images now use a stable cache key and are properly served from memory and disk cache after the first load.
Coil image memory cache capped at 128 MB and disk cache capped at 512 MB to support large libraries (~10,000 albums) without unbounded growth.
Dashboard cover art now prefetched into Coil's disk cache as soon as server data arrives — images appear instantly when scrolling instead of loading on demand.
Dashboard server fetches (recently added, random albums, frequent albums, random artists) now execute in parallel instead of sequentially, roughly halving load time on most servers.
OkHttp connection pool increased from 5 to 10 connections and kept alive for 5 minutes; connect/read timeouts raised from 5s to 15/30s to prevent false failures on first connect and large responses.
Dashboard cache extended to include Most Played albums, Most Played Tracks, and Random Artists — all five dashboard sections now appear instantly from cache on relaunch instead of showing a loading spinner.
Song cache (Room) now supports filter queries by artist, album, and genre — genre album lists and album detail screens show cached content immediately while refreshing from the server.
Artist detail screen now appears immediately after the single getArtistDetail call returns; song counts are derived from the local song cache when warm, eliminating one API call per album entirely.
Song cache now syncs automatically in the background on every app launch (skipped if cache is less than 24 hours old), so genre/album/artist screens benefit from instant cached loads without requiring a visit to the All Songs screen.
Album detail song rows now show the track number instead of cover art; the track number is replaced by the animated EQ indicator when the song is playing.
Swiping up on the Now Playing screen opens the queue.
Artists, Genres, Albums, By Year, Favorites, and Top Rated library sections now show cached content immediately on repeat visits within the same session, with a silent background refresh.
Top Rated now fetches its album and song lists in parallel instead of sequentially.
Dashboard cached content is now shown immediately on relaunch instead of being hidden behind a loading spinner while the background refresh runs.
Songs section no longer triggers a full server re-fetch on every open — re-fetches only when the cache is older than 24 hours, matching the background sync policy.
Library section data (Artists, Genres, Albums, By Year) is now persisted to disk and restored at app startup — all sections load instantly from cache on every launch, with a silent background refresh.
Version 1.2.2
Offline playback fixes, local library improvements, Japanese and Korean translations,
and internet radio placeholders in the Now Playing screen.
Version 1.2.2
Fixed
Fixed widget not updating album art when local source files are playing — widget now resolves local cover art via the on-disk cache instead of routing through the Subsonic API client.
Fixed playback stopping when the user presses the back button to minimize the app — MainActivity.onDestroy no longer calls stopService on the playback service.
Playback now correctly stops when the user swipes the app away from the recents screen — PlaybackService handles onTaskRemoved to stop the player and shut down the service.
Fixed star ratings not appearing for local songs in album detail screen.
Fixed star ratings not appearing for local songs in the dashboard Most Played Tracks section.
Fixed downloaded/cached songs showing 0 songs when browsing the Local Library section — album representatives now use a local_album_ prefixed ID so the offline song list is loaded correctly.
Fixed Unable to resolve host error appearing when browsing the library with no internet — all library sections now fall back to local/downloaded content when the server is unreachable.
Fixed offline playback not starting for downloaded songs — selecting a downloaded song in airplane mode now uses the downloaded file path directly instead of generating a network stream URL.
Added
Favorites section now shows an empty state message ("No favorites yet. Heart a song to see it here.") when no songs have been favorited.
Local-only users can now favorite and star-rate songs — persisted to local_favorites.json and reflected in the Favorites and Top Rated library sections.
Local-only users now have a Most Played Tracks section on the dashboard — play counts are tracked on-device and displayed identically to the Subsonic experience.
Added Download Playlist option to the three-dot menu on each server playlist — queues all songs in the playlist for offline download.
Downloads now check available storage before writing — if the device has less free space than the file size (plus a 10 MB buffer), the download is marked failed with a localized error message.
Added Japanese and Korean translations — full coverage of all strings.
Internet radio stations now show a radio icon placeholder in the Now Playing screen album art area, the Now Playing bar, and the Recently Played section on the dashboard.
Version 1.2.1
Local-only playlists and internet radio, queue fling-scroll fix, and
"Add to Queue" / "Play Next" actions now work correctly for local artists and albums.
Version 1.2.1
Fixed
Fixed "Add to Queue" and "Play Next" being silently ignored for local artists in the artist grid — actions now use getLocalArtistSongs() instead of calling the Subsonic API.
Fixed "Add to Queue" and "Play Next" being silently ignored for local albums in the Albums by Year section — actions now use getLocalAlbumSongs() instead of calling the Subsonic API.
Fixed queue screen unable to fling-scroll upward — onPreFling was consuming all downward fling velocity unconditionally; it now only consumes velocity when a swipe-to-dismiss drag was already in progress.
Local-only users can now create playlists, add songs to playlists, delete and rename playlists, and remove individual songs from playlists — playlists are stored locally on device in local_playlists.json.
Local-only users can now add, edit, delete, and play internet radio stations — stations are stored on-device and persist across sessions.
Added
Playlists are now fully functional for local-only users (no Subsonic server required), with all CRUD operations backed by on-device JSON storage.
Added "Add to Queue" and "Play Next" 3-dot menu to each playlist item in the Playlists section, consistent with the rest of the library UI.
Internet Radio is now fully functional for local-only users — add stations by URL, edit, delete, and play them without a Subsonic server; "Import from Subsonic" option is hidden when no server is configured.
Version 1.2
Multi-language support (German, French, Spanish, Chinese), local device music
merged into the library, Android 15 edge-to-edge compliance, and queue overlay redesign.
Version 1.2
Added
Internationalization
Added multi-language support for German, French, Spanish, and Chinese Simplified.
App UI will now automatically match your device's language setting.
All screens fully localized: Library, Now Playing, Equalizer, Queue, Downloads, Settings, Theme, Search, and more.
Local Music Integration
Local device music now merged into Artists, Albums, and all library sections alongside Subsonic server content.
Local files display a device badge icon on artist/album grid cards and song rows for easy identification.
All library sections work in local-only mode: Artists and Albums pull from device files, Genres derived from file metadata, Recently Added sorted by year, Favorites/Playlists/Internet Radio show empty states cleanly.
Fixed
Migrated to enableEdgeToEdge() API, replacing deprecated statusBarColor, navigationBarColor, and setDecorFitsSystemWindows calls (Android 15 compliance).
Replaced deprecated systemWindowInsetBottom with WindowInsetsCompat for nav bar inset reads.
Added 16KB memory page size support and upgraded NDK to r27c for compatibility with devices using large memory pages.
Fixed stale Subsonic dashboard data persisting after removing a server — dashboard now reloads from local library immediately.
Fixed all library sections showing "No server configured" error for local-only users.
Fixed local music playback: file:// URIs now correctly built and threaded through queue, PlaybackService, and ExoPlayer for all queue actions.
Fixed playback stopping when the app is minimized — ExoPlayer now holds a wake lock and WifiLock to keep the CPU and network active during streaming.
Fixed foreground service being destroyed when the media notification was dismissed while paused — notification is now always ongoing while the service is alive.
Eliminated a runBlocking call on the main thread during service teardown; final position save is now fire-and-forget.
Reduced CPU usage while paused — the 1-second playback state timer now skips updates on ticks where nothing has changed.
Queue persistence now only writes to disk when the queue composition or current track index actually changes, instead of on every 1-second position tick.
Download progress now emits at most once per integer percent instead of once per 8 KB read buffer, eliminating hundreds of redundant emissions per file.
Dashboard data is now fetched only once per ViewModel session — redundant calls from recomposition are no-ops.
Queue screen is now an animated overlay on top of Now Playing (same slide-up sheet pattern as Now Playing over the main screen) — opens and closes without a full page reload.
Fixed queue swipe-to-dismiss: drag now tracks the finger synchronously with no spring lag and reliably dismisses on fast fling or slow drag past the threshold.
Fixed queue swipe-to-dismiss bounce: fling velocity is now consumed by the dismiss gesture so the list no longer fires extra scroll events that snapped the overlay back to the top before closing.
Version 1.1
Visual EQ curve, Squiggly/Breathing/Dotted progress bar styles, EQ preset persistence,
waveform visualizer fixes, and widget improvements.
Version 1.1
Added
Added a visual EQ curve that updates in real time as bands are adjusted.
Added Flat and Custom preset chips.
Selecting a preset or adjusting bands manually now saves automatically.
Opening an external equalizer now automatically disables the internal EQ to free up audio memory for the external app.
Added Squiggly progress bar style — an Android Auto-style animated sine wave with a flat unplayed section and squiggly played section, selectable in Settings.
Added Breathing progress bar style.
Added Dotted progress bar style.
Fixed
Fixed crash on app relaunch caused by DataStore singleton being incorrectly scoped inside LibraryViewModel instead of at file level.
Fixed Most Played Tracks section on dashboard not showing accurate song play count.
Fixed bass boost and virtualizer controls that had no effect due to an audioserver memory limit — these have been removed.
EQ settings (band levels, selected preset) now persist across app restarts.
Progress bar now shows -(duration - position) on the right side instead of track length.
Waveform visualizer now appears instantly on first play.
Visualizer no longer loses data when tracks change or analyzer is recreated.
Fixed an issue where swiping right or pressing previous while more than 3 seconds into a song would cause the album art card to get stuck, breaking further swipe gestures.
Tapping on the widget now opens the app directly to the Now Playing screen if a song is loaded, otherwise to dashboard.
Fixed Now Playing screen re-animating even if already open from a widget tap on release build.
Fixed users with local-only (no Subsonic server) being unable to access app after adding local-only media source.
Version 1.0 — Initial Release
The first release of Subwave™. Subsonic/Navidrome streaming, real-time MilkDrop
visualizations, equalizer, offline playback, lyrics, scrobbling, and more.
Version 1.0
Initial Release
Subsonic, Navidrome, Airsonic, Gonic, and Ampache server support.
Real-time MilkDrop visualizations powered by ProjectM.