All notable changes to Musly will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
-
Material 3 Dynamic Theme Color (Material You / Pixel OS / OneUI)
- Added support for dynamic wallpaper-based accent colors on Android 12+ / Pixel / OneUI devices via Material 3 /
dynamic_color. - Added interactive dynamic color option with dedicated Material 3 palette indicator in Display Settings (
_AccentColorPicker). - Extended
AccentColorenum withdynamicColor('dynamic') and fallback mechanism for platforms without system dynamic schemes.
- Added support for dynamic wallpaper-based accent colors on Android 12+ / Pixel / OneUI devices via Material 3 /
-
Language Selector & Community Translation Progress
- Resolved an issue where selecting "System Default" would erroneously display "English" regardless of the device's actual system language; it now resolves and displays the active system language name (e.g.
System Default (Italiano)). - Added Crowdin community translation attribution in the language picker header and dynamic completion percentage tags (
%) for each supported language.
- Resolved an issue where selecting "System Default" would erroneously display "English" regardless of the device's actual system language; it now resolves and displays the active system language name (e.g.
-
Now Playing Star Ratings & Direct Favorite Button
- Added interactive 5-star rating bar (
NowPlayingStarRating) in the fullscreen Now Playing screen (in both portrait and landscape layouts) that dynamically respects the "Show Star Ratings" toggle and syncs directly to Subsonic/Navidrome servers. - Added dedicated Heart/Favorite toggle button in the Now Playing metadata row for instant 1-tap favoriting alongside the Add to Playlist button.
- Added interactive 5-star rating bar (
-
Search Radio Queue Generation & Continuous Auto-Refill
- When playing a song directly from search results, Musly dynamically creates a radio queue populated with similar songs (matching genre, artist top tracks, and recommendations) instead of playing consecutive unrelated search query results.
- Added continuous automatic queue replenishment: when an automatic queue or AutoDJ queue is nearing the end (<= 3 songs remaining) or finishes, Musly automatically discovers and appends more similar tracks to the queue and audio source so continuous playback never stops.
-
Desktop UI/UX Redesign (Musly Desktop Parity)
- Redesigned the entire Desktop layout, navigation, and player components to match
Musly-Desktop1:1:- Left Navigation Sidebar (
DesktopNavigationSidebar): 240px wide sleek black sidebar (#000000) with rounded app logo, Home, Search, Library, Settings,YOUR LIBRARYsection with Playlists, Liked Songs, Radio, playlist creation modal, and bottom Disconnect action. - Bottom Player Bar (
DesktopPlayerBar): 90px dark bar (#181818) with 56x56 rounded artwork, title/artist info, 1-tap heart favorite button, centered playback controls (shuffle, previous, white 40x40 circle play/pause with hover scale, next, repeat), clean custom progress slider, volume controls, connect button, and toggle buttons for Queue and Lyrics panels. - Desktop Queue Panel (
RightSidebar): 320px slide-over queue panel with Now Playing highlight card (#FA243Ctint) and Next Up track list with hover play and remove actions. - Desktop Lyrics Panel (
DesktopLyricsPanel): 380px slide-over Spicy Lyrics panel with blurred artwork backdrop, smooth active line auto-scrolling and centering, dynamic font sizing and opacity transitions, seek-on-tap, and real-timeSYNCbadge.
- Left Navigation Sidebar (
- Redesigned the entire Desktop layout, navigation, and player components to match
-
Musly Wrapped & Year in Review Redesign & Localization
- Completely revamped Musly Wrapped UI with high-end glassmorphic cards (
BackdropFilter), glowing radial aura meshes, and interactive floating particles. - Added hero centerpiece cards for #1 Top Song with real-time animated equalizer bars (
_EqualizerBars) and #1 Top Artist with glowing circular avatars. - Added formatted number statistics (e.g.
12,450mins) and long-press story pause feedback indicator. - Fully localized all user interface texts, story slides (Intro, Minutes, Chronotypes, Genre Galaxy, Top Songs & Countdown, Top Artists, and Personality Archetypes), metrics, badges, and home banners into English, Italian, and all supported languages via
AppLocalizations.
- Completely revamped Musly Wrapped UI with high-end glassmorphic cards (
-
Now Playing Cover Art Alignment & Spacing Balance (Issue #237)
- Grouped the album artwork and the live lyric pill together inside the vertically centered
Expandedcontainer, ensuring the entire unit is centered symmetrically between the top header buttons and the song title metadata. - Resolved the issue where the space below the cover art was significantly larger than the space above it, and prevented active live lyric pills from pushing the cover art upwards against the top header buttons.
- Refined title/artist vertical padding for clean and balanced spacing across all portrait phone screen dimensions.
- Grouped the album artwork and the live lyric pill together inside the vertically centered
-
Now Playing Landscape System Status Bar & Cutout Overlap (Issue #238)
- Wrapped Now Playing persistent header (dismiss arrow and three-dot options menu) and top drag handle in
SafeArea(bottom: false), completely preventing the Android system status bar (battery icon, clock, notification icons, control panel drag area) and camera cutouts from overlapping the three-dot menu in landscape mode. - Wrapped Queue and Lyrics view bodies in
SafeAreato ensure consistent landscape safe insets across all pages. - Added responsive
FittedBoxdown-scaling for details and playback controls in landscape orientation, preventing vertical overflow across all screen aspect ratios.
- Wrapped Now Playing persistent header (dismiss arrow and three-dot options menu) and top drag handle in
-
Library Scrolling Performance & Viewport Virtualization
- Replaced unvirtualized
SliverToBoxAdaptercontaining fullColumn/Wrapwith lazySliverList.builderandSliverGrid.builder, eliminating scroll stutter and jank by rendering only visible items. - Added
RepaintBoundarywrappers to individual library list and grid item tiles to prevent unneeded full-screen repainting while scrolling. - Tuned
CustomScrollView.cacheExtentto600.0withAlwaysScrollableScrollPhysicsfor silky-smooth 60/120 FPS scrolling across both list and grid view modes.
- Replaced unvirtualized
-
UPnP / DLNA & Google Cast Playback Controls & Track Skipping
- Fixed pausing and seeking from the phone when connected to a UPnP / DLNA or Google Cast device by immediately updating local playback and position state and eliminating race-condition jitter. Added automatic fallback to
Stopwhen a UPnP renderer does not support thePauseSOAP action. - Fixed skipping to next/previous songs from both the phone and the UPnP device:
- Bypassed the local
ConcatenatingAudioSourcecheck when rendering remotely so queue skips stream the new track to the remote renderer. - Implemented
SetNextAVTransportURIsupport inUpnpServiceto pre-queue upcoming tracks on UPnP renderers. - Handled track progression when skipped directly from the UPnP renderer (supporting
STOPPED,NO_MEDIA_PRESENT, and renderer automaticTrackURItransitions).
- Bypassed the local
- Fixed pausing and seeking from the phone when connected to a UPnP / DLNA or Google Cast device by immediately updating local playback and position state and eliminating race-condition jitter. Added automatic fallback to
-
Live Lyrics Under Artwork Multiline Wrapping
- Removed single-line truncation (
maxLines: 1,TextOverflow.ellipsis) in the live lyric pill under the Now Playing album artwork, allowing long lyric lines to wrap naturally across multiple lines without being cut off by ellipses.
- Removed single-line truncation (
-
Settings ListTile Ink Splash & Material Hierarchy
- Replaced intermediate
Container(decoration: BoxDecoration(...))withMaterial(color: ..., borderRadius: ..., clipBehavior: Clip.antiAlias)inSettingsSectionCardandServerSwitcherSheet, resolving the Flutter framework assertion regarding hidden ink splashes and tile background effects.
- Replaced intermediate
-
Now Playing Queue Reordering & Song Options Menu (#236)
- Replaced static
ListViewinQueueViewwith interactiveReorderableListView.builderallowing users to drag and drop songs to reorder the upcoming queue. - Connected queue drag-and-drop to
PlayerProvider.reorderQueue(), properly updating playback order, active playback index, and persistent queue state. - Added dedicated 3-dot options button (
Icons.more_vert_rounded) and long-press gesture handling on each queue song to openSongOptionsModal(add to playlist, play next, view album/artist, download, etc.).
- Replaced static
-
UI Theme Color Consistency Across Components
- Standardized UI elements (play buttons, chips, sliders, floating play controls, active indicators, badges, and checkboxes) across the entire app to dynamically follow the user-selected Accent Color / Theme Color instead of hardcoded colors.
- Updated
MediaPlayButton,MediaFloatingPlayButton,SongTile,SwipeableSongTile,MiniPlayer,DesktopPlayerBar,CastButton,RightSidebar,TopResultCard,QuickAccessTile,LibraryScreen,SearchScreen,HomeScreen,MainScreen,ConnectDevicesModal,JukeboxScreen,RadioScreen,PlaylistsScreen,DownloadPlaylistStatusScreen,PlaylistScreen,AlbumScreen, andLoginScreen.
-
Google Cast Playback & Session State Management (#235)
- Fixed an issue on Android where connecting to a Google Cast device immediately stopped playback and prevented tracks from playing on the cast device.
- Resolved an infinite reload loop in
PlayerProviderby properly tracking Cast connection transitions (_castWasConnected), preventing position and status ticks from resetting playback. - Added synchronized position and duration streaming, volume control, and natural track completion detection (
GoogleCastMediaIdleReason.finished) to automatically advance through the queue. - Implemented seamless playback handover passing the current track position (
playPosition) when connecting to a Cast device. - Improved media loading resilience with enhanced MIME type resolution supporting query parameters (e.g. Subsonic/Navidrome stream URLs) and safe cover art URL validation.
-
Multi-Language Support & Internationalization (i18n / l10n)
- Integrated official Flutter internationalization framework (
flutter_localizationswith ARB resource bundles). - Multi-language catalog supporting 27 languages with automatic system locale matching and fallback mechanisms.
- In-app Language Selector in Display Settings for seamless runtime language switching without restarting the app.
- Added automated Crowdin synchronization workflows (
crowdin-sync.ymlandcrowdin.yml) to keep community translations continuously updated.
- Integrated official Flutter internationalization framework (
-
Complete UI String Localization & Hardcoded Text Elimination
- Systematic audit and extraction of all hardcoded strings across the entire codebase into
.arbcatalogs. - Fully localized onboarding walkthrough, feature cards, navigation controls, and slide transitions.
- Fully localized modals and dialogs: Milestone Celebration dialog, Privacy Policy dialog, Server Switcher menu actions, and Sleep Timer selector.
- Fully localized media collection screens (All Songs, Albums, Playlists, Favorites, Radio Stations, Downloads) including sorting menus, empty states, and batch download confirmations.
- Fully localized Desktop UI components: Player bar controls, playback device picker, and right queue sidebar.
- Fully localized search view (input placeholders, query suggestions, recent searches) and server authentication / connection forms.
- Complete Italian (
it) translation coverage for all existing and newly added localization keys.
- Systematic audit and extraction of all hardcoded strings across the entire codebase into
-
Now Playing Screen Landscape Layout (#234)
- Resolved layout distortion and RenderFlex overflow on Android and mobile devices when rotating the Now Playing view into landscape mode.
- Implemented responsive 2-column landscape presentation with album artwork and live lyrics on the left, and metadata, seek slider, playback controls, volume slider, and bottom actions on the right.
- Made Now Playing sheet constraints, drag handle, lyrics header, and queue list padding adapt smoothly to landscape orientation.
-
Album Screen Cover Art Alignment (#233)
- Fixed visual misalignment and app bar overlap where album artwork in the Album detail screen clashed with navigation and action icons.
- Replaced unpinned expanded stack with a pinned dynamic
LayoutBuilderflexible space that centers the artwork cleanly below the toolbar and provides smooth scaling and fade transitions on scroll.
- Musly Connect (Local Network Device Remote & Playback Transfer) (Temporarely Unavailable)
- Zero-config LAN P2P UDP discovery and embedded WebSocket control server.
- Discover nearby Musly devices running on the same server or streaming mode to control playback (Play, Pause, Next, Prev, Seek, Volume) and transfer the active queue and track position with 1 tap.
-
Spotify-style Swipe to Queue
- Smooth horizontal swipe-right gesture on song rows across all lists (Albums, Playlists, Search, Library) to instantly add songs to the playback queue with tactile haptic feedback and an animated queue confirmation pill.
-
Smart Track Crossfade & Transitions
- Configurable 0s to 12s seamless crossfade in Playback Settings with automated volume attenuation curves between tracks.
-
Musly Playback (Year-in-Review Retrospective)
- 100% on-device, private interactive retrospective story with animated ambient auras.
- Automatically unlocks during the seasonal window (late November to mid-January) with a prominent
#MuslyPlaybackhero banner on the Home feed. - Insights include: total minutes listened, top 5 songs, top 5 artists, musical personality trait, top genre, aesthetic recap card, and one-tap "Play Your Top Songs" button.
- Developer/tester preview toggle in Settings > About.
-
Live Lyric under Artwork in Fullscreen Player
- Optional setting in Display Settings (disabled by default) that displays a sleek frosted pill with the currently singing synced lyric line directly below the album artwork.
- Tapping the live lyric snippet instantly opens the full lyrics screen.
- Automatically hides and preserves standard player layout if the song has no synced lyrics.
-
Smart Audio Focus & Auto-Resume with Fade Out
- Smooth volume fade-out and auto-pause when external media apps request audio focus (e.g. YouTube, Instagram, TikTok video playback).
- Progressive volume fade-in and immediate volume restoration when exiting external apps, with full manual playback override support.
-
High-Fidelity 3-Color Album Palette Extraction
- Upgraded palette extraction using
PaletteGeneratorto extract the true 3 primary colors (dominant, vibrant, deep accent) from album artwork for the fullscreen player ambient mesh background.
- Upgraded palette extraction using
-
Web Stream (Online Music Streaming & Search)
- Stream music directly from the web without requiring an active Subsonic or Jellyfin server.
- Search global songs, albums, and artists with high-resolution artwork, gapless playback, and synchronized lyrics support.
- Dynamic local caching in SQLite for fast replay and offline readiness.
- Generates personalized mixes ("Made For You", "Listen Again", "Your Top Hits") based on web stream listening habits.
- Seamlessly switch between Subsonic, Jellyfin, Local Music, and Web Stream from the server switcher.
-
Smart Recommendations & Taste-Learning Engine (Home & Web Stream)
- Algorithmic music taste profiling learning from play counts, ratings, skips, and completion rates with exponential recency decay.
- Dynamically generated mixes: "Made For You", "Listen Again", "Your Top Hits", Artist Mixes, and Genre Mixes.
- Intelligent discovery search querying correlated songs based on user affinities.
- Full local SQLite persistence for stream caching and smart recommendation candidate pools.
-
Custom Download Folder & SD Card Storage (#193)
- Select custom storage directories (internal memory or external SD cards) for offline music downloads from Storage Settings.
-
Automatic Octo-Fiesta Integration (#216)
- Seamless auto-detection and support for Octo-Fiesta extensions inside Subsonic and Jellyfin servers without creating separate source profiles.
-
Offline Downloader & Dedicated Downloads Section (#226)
- Dedicated Downloads screen in the Library.
- "Download All" Favorites (#209) — One-tap download of all starred/favorite songs for offline playback.
- "Download All" Artist Tracks (#225) — Batch download all songs from an artist directly from the artist screen.
- Durable playlist download state machine with auto-resume, progress indicators, and outline-check badges.
- Downloaded badges on songs, albums, and playlists (#224).
- Validation using server
/downloadendpoint and file size verification.
-
Dual WAN / LAN Server Support (#187)
- Configure separate Local LAN and Remote WAN server URLs with automatic ping latency check and seamless fallback.
-
Multi-Server Profiles (#185, #196)
- Store and switch between multiple Subsonic / Jellyfin server accounts and credentials without overwriting previous profiles.
-
Windows System Media Transport Controls (SMTC)
- Full native Windows SMTC integration with timeline progress synchronization, cover artwork, and hardware media keys (Play, Pause, Next, Previous, Stop).
- Set explicit
AppUserModelIDto "Musly" ensuring the OS media overlay displays "Musly" instead of "App sconosciuta".
-
Discord Rich Presence
- Live Discord status integration showing song title, artist, album, and precise elapsed/remaining playback timestamps.
- Configurable subtitle style (Artist, Song title, App name).
- State-change caching debounce to eliminate log noise and avoid Discord rate limits.
-
A-Z Alphabetical Index Sidebar (#204)
- Fast-scroll alphabet navigation bar on album collection screens with haptic feedback and instant letter jump.
-
Synced Lyrics Customization (#184)
- Customization options for the time-synced lyrics view including background blur toggle, text alignment, and active lyric glow.
-
Android 13+ Material You Dynamic Themed Icons
- Full support for Android 13+ dynamic themed icons (
<monochrome>adaptive icon mask) adapting automatically to system color palettes on Google Pixel, Samsung One UI, Xiaomi, and other modern Android launchers.
- Full support for Android 13+ dynamic themed icons (
-
Dolby Atmos Audio Stream Support (#188)
- Audio stream badge and playback detection for Dolby Atmos content.
-
Artist Biography & Album Actions (#221, #222, #214)
- Detailed artist biography lookup from Subsonic API.
- Like/favorite button on Album screens.
- Direct navigation to Album details from Favorite Albums list.
-
Immersive Onboarding Tour Experience
- High-end introductory welcome tour featuring dynamic ambient gradient auras, fluid slide transitions, and sleek typography.
- Highlights core Musly capabilities: Lossless self-hosted audio streaming (Subsonic, Jellyfin, Local files), Algorithmic Smart Mixes, and 100% telemetry-free privacy.
- Replay onboarding anytime from Settings -> About -> Welcome Tour with safe modal return that preserves your active login session.
-
Linux & Desktop Window Controls (#208)
- Option in settings to toggle native window titlebars and client-side window decorations on Linux.
-
Desktop UI & Window Experience
- Enforced minimum window dimensions (
$800\times 560$ ) across Windows, macOS, and Linux to prevent extreme window narrowing and layout deformation. - Added responsive scaling (
FittedBox) and compact density to the desktop player bar right actions, eliminatingRenderFlexlayout overflows on narrow desktop viewports. - Closeable Queue right sidebar accessible via close button and toggleable from the desktop player bar.
- Volume mute/unmute now accurately restores previous volume level instead of resetting.
- Safe global spacebar shortcut: typing spaces in search and text fields is preserved without toggling Play/Pause.
- Route deduplication: prevents opening identical screens or windows repeatedly on top of each other.
- Hidden mobile-only "Circular Design" toggle on desktop platforms.
- Enforced minimum window dimensions (
-
Small-Screen Responsiveness & Accessibility (iPhone SE / Compact Android)
- Dynamic scaling of vertical paddings, font sizes, live lyric pill, and album cover constraints in the Fullscreen Player for screens under 720px/620px height.
- Scrollable fallbacks for all static Musly Playback story slides ensuring complete button and metric accessibility on compact devices.
-
Audio Playback & Scrobbling Quality of Life
- Now Playing Gesture Conflict Fix (#201): Restricted horizontal swipe-to-skip strictly to album art, avoiding accidental skips during Android edge-back navigation.
- Volume Slider Customization (#200): Configurable setting to show or hide the volume slider on the Now Playing screen.
- Long Press Consistency (#192): Long pressing playlist tracks consistently opens song options menu.
- Scrobble on Shuffle (#207): Only scrobbles to server after passing the minimum threshold (50% or 4 minutes) to prevent false scrobbles on skip.
- Now Playing Notification (#210): Sends "Now Playing" status to server on gapless automatic track advance.
-
Transcoding Settings & URL Parameters (#198, #194): Added dedicated options for WiFi vs Mobile streaming and verified
format/maxBitRatestream parameters. - Immediate play/pause UI icon synchronization with safe audio fade transitions.
- Rounded corners and dynamic ambient shadow support for non-1:1 aspect ratio artwork (#206).
- Sort bottom sheet padding adjusted to remain fully visible above the mini player (#230).
- Duplicate song prevention warning when adding tracks to an existing playlist (#211).
-
Unified Login & Provider Selection Grid
- "Local Files" integrated directly alongside Subsonic, Jellyfin, and Web Stream as a first-class music source.
- Uniform 2-column grid button layout ensuring identical dimensions across all provider options.
- Context-aware settings visibility: hides Legacy Authentication for Jellyfin; hides server URL/credentials, Legacy Auth, Self-Signed Certs, and Advanced Options when selecting Local Files or Web Stream.
- Replaced legacy bottom "Use Local Files" button with clean, inline scanning and access card.
-
iOS Platform Guard & App Store Sandbox Compliance
- Completely disabled and concealed Web Stream on iOS across login screens, server switcher sheets, storage profiles, and streaming handlers to strictly comply with iOS guidelines.
-
Privacy-First Architecture
- Completely removed Countly SDK, analytics trackers, and remote telemetry. Musly is 100% private with no background telemetry.
-
Localization & Translations
- Corrected ICU plural syntax warnings across French, Spanish, Italian, Portuguese, and Russian.
- Adjusted Italian action button labels to eliminate text truncation and RenderFlex overflows.
- Added Azerbaijani and Polish translations, localized audio focus denial, and fade in/out notifications.
- Excessive Cover Art Requests (#199): Normalized cover art
cacheKeyinAlbumArtworkand disk cache to eliminate redundant duplicate network requests across sessions. - Local Music Library Scan UI Freezes (#195): Added asynchronous batch micro-yielding and robust error recovery to eliminate UI isolate freezes and Android ANR errors during large local music folder scans.
- Mini-Player Navigation Visibility (#197): Modal bottom sheet now closes before navigating to artists from Now Playing, preserving mini-player visibility.
- Emby & Jellyfin Library Selection (#188): Added
ParentIdand view filtering to prevent audiobooks and non-music collections from mixing with music library. - Android TV Remote Navigation (#183): Fixed D-Pad focus traversal and dedicated Android TV interface layout.
- Interactive Login Error Reporting: Fixed an issue where failed login attempts would reset the screen without displaying the error, now keeping the form mounted and showing categorized diagnostic cards with troubleshooting hints.
- Desktop Onboarding Navigation: Fixed
PageControllerassertions on desktop and added full keyboard navigation shortcuts (Arrow keys,Space,Enter,Escape). - mTLS Crash on Connect (#218): Handled mutual TLS handshake exceptions gracefully without crashing.
- Artist Blank Screen (#186): Multi-layer fallback lookup strategy for artists with missing ID or metadata.
- Android Auto Compatibility: Enhanced Android Auto service metadata resolution, browse tree loading, and focus request timeout handling.
- Codebase Modernization: Consolidated file structure, cleaned deprecated Flutter API usages, and eliminated all linter diagnostics.
-
Now Playing Custom Themes — Complete theme system for personalizing the Now Playing screen
- Theme manager screen with create, edit, duplicate, export/import, and delete
- 5 editor tabs: Background, Artwork, Text, Controls, Animations
- Background types: Solid color, Gradient, Blur, Mesh gradient, Custom Flutter code (with safe mode)
- Artwork shapes: Circle, Rounded Rectangle (fixed Musly default 12 px radius), Square (configurable corner radius 0–50 px)
- Shadow intensity, rotation, and size factor controls
- Cover rotation animation with configurable speed (3–60 seconds per full turn)
- Pulse effect animation for artwork
- Text styling for title, artist, album, and duration (font family, color, size, weight)
- Control styling (color, size, spacing) and progress bar styling (color, height, shape)
- Real-time animated preview in theme cards
- All themes persisted to disk and survive app restarts
-
Gapless Playback — Seamless track-to-track transitions via
ConcatenatingAudioSource- Toggle in Playback settings to enable/disable
- Preloads next track for instant switching
-
LRCLIB Lyrics Fallback — Automatic lyrics lookup from LRCLIB when the Subsonic server has no lyrics
- Toggle in Playback settings
- Searches by song title and artist name
- Playback Resume After App Restart — Correctly restores playback position and prepares the audio source after cold start (#171)
- Seek with Transcoding — Fixed broken seeking when using transcoding via
LockCachingAudioSource(#170) - Jukebox Mode UI — Jukebox controls now properly integrated into the main playback controls (#173)
- Cache Memory Optimization — Replaced JSON bulk cache with SQLite to prevent OOM crashes on libraries with 100 000+ items
- iOS Deployment Target — Lowered minimum iOS version from 16.1 back to 15.0 (removes Live Activities dependency on iOS)
- Theme Editor Overflow — Fixed all
RenderFlexoverflow errors inThemePreviewCardandThemeEditorScreen - Theme Editor Layout — Removed unwanted leading whitespace from
TabBarinThemeEditorScreen - Duplicate Theme Dialog — Fixed
_dependents.isEmptyassertion crash when cancelling or swiping away the duplicate dialog - Export Theme on Mobile —
FilePicker.saveFilenow correctly passesbyteson Android & iOS, resolving "invalid argument(s): Bytes are required" - Rotation Animation State — Cover rotation animation now pauses when playback stops and resumes when it starts
- Library Cache Backend — JSON bulk cache replaced by SQLite for significantly lower memory usage on large libraries
- Theme Strings — All hardcoded UI strings in the theme editor and preview card moved to ARB localization keys
- PlayerProvider Lifecycle — Debounce timer for queue persistence is now cancelled in
dispose()to avoid timer leaks in tests
- Persistent Queue Across Restarts (#156)
- Queue state (songs, current index, current song ID) saved to SharedPreferences
- Automatically restores queue on app launch without auto-playing
- Validates local file paths exist before restoring
- Debounced save (200ms) to avoid excessive writes
- Clears persisted data on explicit queue clear
- Shuffle Persistence — Shuffled queue order is now persisted alongside the queue, so reopening the app restores the correct shuffled sequence when shuffle mode is enabled
- Artist Play Enhancement (#151)
- "Play" button on artist screens now appends rest of artist's songs to their top songs
- Provides fuller artist experience when pressing play
- Collapsible Playlist Cover Art —
PlaylistScreennow uses aSliverAppBarwithFlexibleSpaceBar, matching the collapsible behavior ofAlbumScreen - All Songs Entry Restored — "All Songs" tile added back to Library → Faves tab for quick access to the full song list
- Comprehensive Test Suite — Unit, widget, integration, security, and memory-leak tests with configurable Navidrome server support via
test_server_config.json - Android Audio Session Configuration — Explicit
AudioSessionsetup for music playback on Android, ensuring proper audio focus and routing on car head units - Lyrics Wake Lock — Screen stays on while lyrics view is visible to prevent display timeout during active listening
- modern desktop Desktop UX Redesign — Complete overhaul of desktop interface emulating Musly's design system
- 3-Column Layout: Fixed left sidebar (280px), expandable center content area, optional right sidebar (320px) for queue
- modern Dark Mode: Deep black backgrounds (#000000, #121212, #181818) with consistent color palette
- Right Sidebar Queue: Dedicated sidebar showing current playback queue with song artwork and metadata
- Enhanced Player Bar: Improved 90px fixed bottom bar with Musly color scheme (#181818) and border (#282828)
- Micro-Interactions: Smooth hover effects on all cards (1.04x scale, 16px elevation shadow, 200ms animations)
- Green Play Button: signature green (#1DB954) circular play button appears on hover for albums and artists
- Quick Access Grid: modern desktop quick access tiles with hover states and background transitions
- Gradient Header Widget: Dynamic gradient headers that extract dominant colors from album artwork
- Updated Navigation Sidebar: 280px width (expanded) with improved modern colors and hover states
- New Widgets:
MuslyLikeCard,RightSidebar,QuickAccessGrid,GradientHeaderfor reusable modern desktop components
- History Screen Loading - Improved history loading and listener management
- Library Refresh (#152)
- Refresh button now forces full re-sync by bypassing 6-hour cooldown
- Fixes stale library content after user clicks refresh
- Accent Color Consistency (#158)
- Play/Shuffle buttons now use theme accent color instead of hardcoded red
- Applied to album, artist, and playlist screens
- Emby/Jellyfin Library Sync (#160)
- Added
getAllSongs()to JellyfinService for O(1) API call - SubsonicService proxy for Jellyfin compatibility
- Fixed albumId and artistId fallbacks in item parsing
- Fixed pagination loop early-break issue
- Added
- Play/Shuffle Button Design (#157)
- Consistent pill-shaped design across artist, album, and playlist screens
- Play/Shuffle row added below artist header
- Now Playing Screen
- Replaced AnimatedMeshGradient with reliable radial gradient blobs
- Fixed lyrics scroll-to-current when ListView items are unbuilt
- Added lyrics slide-up/fade transition
- Fixed ReorderableListView null crash with drag handle
- Fixed syntax error causing build failure in
_buildRadioPlayer - Status-bar icons now forced to white on dark background so they remain visible
- modern and elegant Sliders — Progress and volume bars redesigned with Musly aesthetics
- Invisible thumb on mobile that grows to 28px with smooth animation when dragged
- Track height animates from 3px to 5px during interaction with white glow effect
- Desktop: thinner 3px tracks, smaller 5px thumbs, darker inactive track (#3A3A3A)
- All transitions use 150ms easeOut curves for fluid micro-interactions
- Android Audio Focus — Playback now requests audio focus before starting, resolving no-sound issues on Android car head units and during remote playback
- Android Playback Fix — Resolved conflict between custom
AndroidSystemPluginandaudio_sessionplugin that caused songs to start then immediately pause on Android devices - Windows Progress Bar — Added fallback position polling timer for Windows desktop where
just_audio_windowsposition stream does not emit reliably; progress bar and SMTC now update correctly during playback - Queue Layout — Prevented queue list from sliding under the navigation bar on devices with gesture navigation
- All Songs Screen — Deferred
_loadCachedDatato post-frame callback, eliminatingsetState during buildexception - Native Service Resilience —
AuthProvider.logout(),PlayerProvider.dispose(),DiscordRpcService,WindowsSystemService, and Android system services now gracefully handle missing native plugins in test environments - Local Files UX
- Folder cover art fallback
- Smart sorting with genre/year filters
- Added Radio Stations to mobile Library screen
- Localization - Updated l10n keys for empty states and scan actions
- Android Build - Bumped version to 1.0.12+1 for update support (#148)
- MusicService - Cleaned up comments and streamlined code
- Artwork Loading - Optimized loading and metadata updates in MusicService
- Recommendation Service - Enhanced with improved data handling and caching
- Pitch Control & Speed Adjustment (#145)
- Independent pitch slider (0.5× – 2.0×) in the speed bottom sheet
- "Preserve pitch" toggle: keeps original pitch when changing playback speed (time-stretching)
- When disabled, pitch follows speed like a vinyl record
- Native ExoPlayer bridge on Android via reflection for real pitch control
- iOS stub ready for future AVAudioEngine integration
- iPhone SE / Small Screen Compatibility
- Responsive layouts for 375×667 pt screens (iPhone SE, iPhone 8)
- Reduced padding, font sizes, and control sizes across Now Playing, Login, Album, and Mini Player
ScreenHelperutility for adaptive sizing based on screen width
- Listening History Blank (#146)
- History screen was empty when recommendations were disabled
trackSongPlay,trackSkip,trackSongRating, andtrackStarrednow always record listening data regardless of recommendation toggle
- Emulator Detection (Pixel 9+)
- Replaced
device_info_plusstring-matching withsafe_device: ^1.3.10 - Pixel 9+ devices were falsely blocked as emulators due to "google"/"generic" strings in device info
- Replaced
- Speed/Pitch Race Condition
- Fixed bug where changing playback speed reset pitch to 1.0
- Unified
setPlaybackParameters(speed, pitch)call applied atomically to ExoPlayer - Eliminates race between
just_audio.setSpeed()and custom pitch reflection
- CI/CD: Android release builds now produce a universal APK instead of split-per-ABI
- Fixes issue where installing a new APK over an old one required uninstalling first
- Live Activities / Lyrics on Lock Screen (iOS 16.1+ & Android)
- Replaced custom
iOSLyricsPluginwithlive_activities: ^2.4.9package - iOS: Native Live Activity with Dynamic Island showing current lyrics line
- Android: Live Activity-style notification via RemoteViews
- Unified API for both platforms in
LockScreenLyricsService
- Replaced custom
- Multiple Server Profiles: Switch between different Subsonic/Navidrome servers
- Local Music Libraries: Play music files stored on device with auto-scanning
- Parallel Downloads: Download multiple songs simultaneously in library
- Heart/Repeat/Shuffle in Mini Player: Quick action buttons in collapsed player
- Android Auto Improvements: Enhanced UI, animations, and Navidrome content support
- SMTC Windows Lyrics & Bluetooth Lyrics: Show lyrics in Windows notification and Bluetooth devices
- Emulator Detection: Block app on emulators for mobile builds
- Arabic & Dutch Language Support
- iOS Minimum Version: Bumped to 16.1 for ActivityKit support
- audio_service: Updated to ^0.18.18 for better iOS Now Playing artwork
- Donation Popup Timing: Reduced from 25 min to 8 min usage
- Playing Next Section: Improved styling and tap-to-collapse behavior
- Library Page Reorganization: Better layout and filtering
- iOS Build Error: "Cannot find iOSLyricsPlugin" resolved by updating deployment target
- iOS Audio Stopping: Song no longer stops when closing fullscreen player
- iOS Now Playing Artwork: High-quality 1200px artwork from server
- Self-Signed Certificates: Eliminated UI freeze during TLS setup (async file reads)
- Image Decompression Crash: Fixed on Android low-memory devices
- Background Download: GrapheneOS compatibility fixes
- Android Auto Artwork: Proper loading and display
- Logout Null Check: Error when logging out from settings
- Support Dialog: Usability fixes on small screens
- Album Screen Navigation: Fixed from now-playing flow above artist page
- CI/CD Auto-Release: Fully automated GitHub Actions workflow
- Automated builds and releases for Android, iOS, Windows, Linux, and macOS
- Windows NSIS installer (
musly-setup.exe) automatically generated - Fixed ALSA dependency for Linux builds
- Automatic artifact upload and GitHub Release creation
- Privacy Policy Dialog: Implemented dialog for privacy policy acceptance
- Multi-Artist Support: Support for multiple artists from Navidrome
- Correct display of multiple artists for single songs
- Multi-artist picker in song context menu
- Album Download Button: Button to download entire album from album screen
- Swipe Gesture: Swipe gesture to change songs in player
- Carousel animation with haptic feedback
- Forward/backward swipe navigation between tracks
- Artist to Queue: Added "Add artist to queue" button on artist screens
- Tap Cover for Lyrics: Tap album cover in player to show lyrics
- Analytics: Countly Analytics and crash reports (https://musly.devid.lol/privacy)
- Flutter 3.41.7: Updated Flutter to version 3.41.7
- Dart SDK Constraint: Updated constraint to
>=3.0.0 <4.0.0 - Code Quality: Refactored duplicate
_variables in callbacks for Dart 3 compatibility - iOS Cleanup: Removed unnecessary iOS example files
- UPnP Volume Overlay: Fixed UPnP hardware volume jump
- UPnP Auto-Disconnect: Automatic renderer disconnection after 30s of connection loss
- Shuffle History: Back button tracks playback history with shuffle active
- UPnP Remote Playback: Fixed UPnP remote playback state management and UI routing
- Recently Added Sort: Fixed "Recently Added" sorting by server creation date
- Download Library Bug: Fixed partially persisted library bug during refresh
- Context Menu: Fixed stale context and scrollable artists sheet
- Playlist Creation: Library refresh after playlist creation from "now playing" menu
- Translations: Crowdin translation updates (more languages supported)
- Smart Transcoding: New automatic quality mode that switches bitrate in real time based on active network
- Detects WiFi vs mobile data via
connectivity_plus - Configure separate bitrates for WiFi and mobile; the app picks the right one automatically
- Live connection badge (WiFi / Mobile pill) in Settings → Playback while smart mode is active
- Smart mode toggle persists across restarts
- Detects WiFi vs mobile data via
- Dynamic & Custom Accent Colors: The accent color now propagates everywhere in the app
- On Android 12+ the wallpaper-derived Material You palette is used automatically (via
dynamic_color) - On all other platforms any color picked in Settings → Display is applied to every widget
- Eliminated all hardcoded
AppTheme.appleMusicRedreferences in settings tabs, mini player, song tiles, cast button, and album artwork shadow
- On Android 12+ the wallpaper-derived Material You palette is used automatically (via
- iOS Control Center player: Fixed the player widget shown in the iOS Control Center and Lock Screen
- Disabled the podcast-style ±15 s skip buttons that were hiding the standard ⏮ ▶/⏸ ⏭ controls
- Added
MPNowPlayingInfoPropertyMediaType = .audioandMPNowPlayingInfoPropertyDefaultPlaybackRatefor correct system content categorization - Fixed an artwork caching race condition: concurrent 1-second position updates no longer restart artwork downloads already in progress
- Server connection retry:
AuthProvider._verifyConnection()now retries the ping up to 3 times (2 s backoff) before declaring the server unreachable — handles slow mobile network initialization on launch - Retry button on the server-unreachable screen: A "Retry" button lets users re-attempt the connection without restarting the app (
AuthProvider.retryConnection()) - Localization — Settings strings: All hardcoded strings in the five Settings tabs are now in
app_en.arb(~100 new keys covering Playback, Storage, About, Display, and Server sections)
- Loading screen: The app no longer flashes the login screen while checking the server on startup;
AuthState.authenticatingnow shows a centeredCircularProgressIndicatoron a black background - Home screen desktop layout: Improved density and alignment for macOS/Windows/Linux
- Wider horizontal padding (32 px), larger section headers and album cards (180 px)
- Song lists render as a compact table (
_DesktopSongRow) instead of fullSongTilecards - Recent albums (6) and playlists (3) shown instead of 4 and 2
- Error messages: Improved error string formatting in
AuthProvider._formatError()— stripsException:,Network error:, and verbose library boilerplate for cleaner display - Connection timeout: Server ping timeout increased from 6 s to 10 s
- Now Playing screen: Matrix transforms updated to Flutter 3.41-compatible
scaleByDouble/translateByDoublesignatures;.withOpacity()replaced with.withValues(alpha:)throughout
seekForward/seekBackwardevents from iOS Control Center: AddedonSeekForward/onSeekBackwardcallbacks toAndroidSystemServiceand registered handlers inPlayerProvider(clamping backward seeks toDuration.zero)- Settings tab indicator color hardcoded:
indicatorColorandlabelColorinsettings_screen.dartnow useTheme.of(context).colorScheme.primary DjMixerServiceremoved: Deleted unuseddj_mixer_service.dartthat was included by mistake;services.dartbarrel still intact
- Added
connectivity_plus: ^7.0.0— network type detection for Smart Transcoding - Added
dynamic_color: ^1.7.0— Material You wallpaper color extraction on Android 12+ - Added
path: ^1.9.0
- modern desktop Desktop UX: Complete redesign of the PC layout
- New collapsible sidebar (
DesktopNavigationSidebar) with 260 px expanded / 72 px collapsed states - Sidebar sections: Home, Search, Your Library (scrollable playlist list with Liked Songs shortcut), Settings, Collapse/Expand toggle
- Settings navigation item restored directly in the sidebar
- All sidebar strings localised via ARB (
expand,createPlaylist)
- New collapsible sidebar (
- Artwork Style Editor: Full custom editor in Settings → Display → Artwork Style
- Shape: Rounded rectangle, Circle, or Square
- Corner Radius: slider (0–24 px), only visible when shape is Rounded
- Shadow intensity: None, Soft, Medium, Strong
- Shadow color: Black or Accent (Musly red)
- Live 108 px animated preview updates in real-time
- All options persisted to
SharedPreferencesand restored on next launch (awaited beforerunApp)
- No-artwork placeholder in mobile player: Songs without cover art now show a clean dark gradient tile with a music note icon and localised "No artwork" label instead of an infinite shimmer loader. Shimmer is still used while the image is actually fetching.
- Desktop player bar accent colors: All active-state indicators (shuffle, repeat, progress slider, volume slider, favorite heart, lyrics button) now use Musly red
- Update dialog colors: Header gradient and download button changed from purple/blue (
#6C5CE7 → #00B4D8) to Musly red/pink (appleMusicRed → appleMusicPink) - Desktop lyrics: Lyrics view now uses
rootNavigator: trueso it covers the full window (sidebar + content + player bar); close button pops from the root navigator correctly - React marketing website: Version number and release date in Hero and Download sections are now fetched live from the GitHub public API (
/repos/dddevid/Musly/releases/latest) with a 10-minute session cache — no auth token required
- Library list alignment: Album/artist tiles in the Library screen now use an explicit
InkWell → Padding → Rowlayout so artwork and text align with section headers on all platforms - Artwork settings not persisting:
PlayerUiSettingsService.initialize()is nowawait-ed beforerunApp, guaranteeing saved values are loaded into notifiers before any widget builds
- Jukebox Mode (#41): Server-side audio playback via the Subsonic jukebox API
- New
JukeboxServicewrapping all jukebox API calls (get,start,stop,skip,set,add,clear,shuffle,remove,setGain) - Dedicated
JukeboxScreenremote-control UI with now-playing artwork, playback controls, volume slider, and queue list - Toggle in Settings → Server to enable/disable jukebox mode
- "Play on Jukebox" and "Add to Jukebox Queue" options in the song long-press context menu (shown only when jukebox is enabled)
- Auto-refresh on screen open + 5-second polling to stay in sync with current server state
- Friendly error screen when the server returns 501 (jukebox not enabled), with setup instructions
- New
- Genre Support: Enhanced genre browsing
- Genres screen now shows song count per genre and a tooltip
- Genre screen rebuilt with two tabs: Songs and Albums
- #29 Offline Playlists: Playlists are now correctly restored from local cache when the server is unreachable
- #37 Music Folder Selection: Fixed the music folder selection dialog in Server settings
- #44 Album Art Aspect Ratio: Album artwork now preserves its original aspect ratio (
BoxFit.contain) instead of stretching
- Localizations: Removed duplicate keys from
app_en.arb; cleaned non-English ARB files of orphaned section markers and English fallback strings
- Internationalization (i18n): Full app translation support via Flutter's
flutter_localizations- 24 languages: Bengali, Danish, German, Greek, Spanish, Finnish, French, Irish, Hindi, Indonesian, Italian, Norwegian, Polish, Portuguese, Romanian, Russian, Albanian, Swedish, Telugu, Turkish, Ukrainian, Vietnamese, Chinese (Simplified), and English as base
- Crowdin integration for community-driven translations with GitHub Actions auto-sync
- Added
TRANSLATIONS.mdguide for contributors - Added
LocaleServicefor runtime language switching
- Google Cast / Chromecast Support: Stream music to Cast-compatible devices
- New
CastServicemanaging session lifecycle and media loading - New
CastButtonwidget displayed in the player and mini-player - Album art shown on the TV/receiver as a video-style visualization (1280×720)
- Integrated
flutter_chrome_castpackage (bundled underpackages/) - UPnP device discovery via new
UPnPServiceas a fallback discovery layer
- New
- mTLS Client Certificate Authentication: Secure mutual TLS for self-hosted servers
- Certificate file picker on the login screen (
.p12/.pfx) - Optional password field for password-protected certificates
ServerConfigmodel extended withclientCertPathandclientCertPasswordfieldsSubsonicServicenow configures the HTTP client with the chosen certificate
- Certificate file picker on the login screen (
- Discord Rich Presence: Show currently playing song in Discord status
- New
DiscordRpcServicewired into the player pipeline
- New
- Auto-Update Service: New
UpdateServicethat checks GitHub Releases for newer versions and prompts the user - Windows NSIS Installer: Packaged installer (
installer.nsi) with dynamic version injection via/Dflag from the CI pipeline - Linux Platform Support: Full Linux desktop build configuration added
- Star Rating Widget: Visual 1–5 star picker widget used in the song options menu
- React Marketing Website: Added under
react-website/, deployed to GitHub Pages via Actions workflow
- Google Cast Display: Receiver now shows album art like Musly
- Switched from raw audio streaming to a video-style Cast session with artwork
- Uses
GenericMediaMetadatafor broader Cast receiver compatibility
- Support Dialog: Streamlined post-login dialog
- Removed 5-second wait timer; close button is immediately available
- Added "Don't show again" checkbox
- Removed BuyMeACoffee and donation links
- Build System: Upgraded to Gradle 8.0 for Java 21 compatibility
flutter_chrome_castuses Gradle 8.0.2 and Kotlin 1.9.0compileSdkbumped to 34, Java compatibility set toVERSION_11- Resolves "Unsupported class file major version 65" build error
- CI/CD Pipeline: Overhauled GitHub Actions release workflow
- Flutter dependency caching enabled to speed up builds
- Updated all action versions to current releases
- Removed hardcoded Flutter version pin for better forward compatibility
- Removed AAB (Android App Bundle) artifact from release builds
- Code Quality: Cleaned up Dart lint warnings across the codebase
- Removed unused imports, variables, and dead code
- Fixed impossible null checks
- Replaced deprecated API usages
- Android Boot Crash: Removed
AutoStartReceiverthat caused crashes on device startup- App no longer requests
RECEIVE_BOOT_COMPLETEDpermission
- App no longer requests
- Android 16 / Media3 Playback Bug: Implemented workaround for a Media3 regression introduced in Android 16 that prevented playback from starting correctly
- Low Power Device Crashes: Optimized image caching and rendering pipeline to avoid OOM crashes on constrained hardware
- Flutter 3.41.1 Compatibility: Hid
RepeatModere-export fromcupertino.dartto resolve a symbol conflict introduced in Flutter 3.41.1 - Cast Service Resource Leaks: Added proper
dispose()anddisconnect()methods;loadMedia()now returns a success/failure boolean - installer.nsi not tracked: Removed
installer.nsifrom.gitignoreso the Windows installer script is included in the repository
- Donation popup: Support dialog no longer shows BuyMeACoffee or cryptocurrency donation options
AutoStartReceiver: Android boot-start receiver removed entirelyDOCUMENTATION.md: Replaced by inline code documentation and README improvements
- Support Dialog After Login: Shows after each successful login
- Discord community invite link (optional)
- Donation options: Buy Me a Coffee, Bitcoin, Solana
- 5-second timer before close button enables
- Copy buttons for cryptocurrency addresses
- Discord Integration in Settings: Added Discord community link to Settings → About → LINKS
- Discord Community Section in README: Added dedicated section with Discord badge and invite link
- Landscape Lyrics Display: Significantly improved lyrics viewing in landscape mode
- Lyrics now occupy right 60% of screen while album art stays on left 40%
- Created
CompactLyricsViewwidget specifically optimized for landscape - Portrait mode keeps fullscreen lyrics overlay
- Fixed overflow issues in lyrics dialog
- Playlist Duration Calculation: Enhanced playlist screen with accurate total duration
- Total duration now calculated from actual song lengths
- Displays formatted duration (e.g., "12 songs • 1 hr 23 min")
- Homepage Loading Issue on Windows: Fixed infinite skeleton loading
- Added 5-second timeout to server initialization calls in
LibraryProvider - App now continues in local mode if server doesn't respond
- Improved error handling for missing server configuration
- Added 5-second timeout to server initialization calls in
- Windows SMTC Error Handling: Improved error messages for RustLib initialization
- App continues normally even if SMTC (Windows System Media Transport Controls) fails to initialize
- Added informative debug messages explaining SMTC will be disabled
-
#27 Star Rating System: Added 1-5 star rating support for songs
- Rate songs via the song options menu (three-dot menu)
- Rating dialog with visual star picker
- Shows current rating in menu title
- Uses Subsonic
setRatingAPI endpoint - Added
userRatingfield to Song model
-
Landscape Mode for Full Player: New horizontal layout when device is rotated
- Album artwork displayed on the left (40% width)
- Song info and controls on the right (60% width)
- Lyrics toggle replaces controls with synced lyrics on right side
- Automatic layout switch based on screen orientation
- Created
CompactLyricsViewwidget optimized for landscape mode
- Playlist & Album Screens: Enhanced with calculated total duration
- Playlist screen now shows total duration calculated from songs (e.g., "12 songs • 1 hr 23 min")
- More accurate duration display based on actual song lengths
- Performance Optimizations: Migrated synced lyrics view to
flutter_lyricpackage (v3.0.2)- Reduced blur effects from sigma 80 to 40 for better GPU performance
- Added
RepaintBoundaryaround animated backgrounds - Implemented position update throttling (100ms intervals)
- Reduced image cache sizes for lower memory usage
- Widget Optimization: Replaced
ConsumerandProvider.ofwithSelectorpatternSongTile: Now only rebuilds when current song changesDesktopPlayerBar: Optimized controls, progress bar, and volume slider- Reduced unnecessary widget rebuilds across the app
- Synced lyrics assertion error:
selectionAutoResumeDurationmust be less thanactiveAutoResumeDuration - Library "Local" filter removed: Cleaned up unused local music filter from library screen
- Storage permissions for Android 13+: Added
READ_MEDIA_AUDIOandREAD_MEDIA_IMAGESpermissions - Server not configured errors: LibraryProvider now gracefully handles local-only mode without server errors
- Premium Equalizer: 10-band EQ with presets (Rock, Pop, Jazz, Classical, Bass Boost, Treble Boost, Vocal, Electronic, Hip Hop) and custom preset saving
- Settings Categories: Reorganized settings into 5 tabs (Playback, Storage, Server, Display, About)
- Local File Support: Play music files stored on device with automatic library scanning
- Transcoding/Streaming Quality: Configure WiFi and Mobile bitrate settings with format selection (MP3, Opus, AAC)
- Offline Mode: Automatic fallback to downloaded music when server is unreachable
- Offline Playback Indicator: Orange banner shows when in offline mode
-
Synced Lyrics Display:
- Added blur effect for non-active lines (distance-based)
- Added glow shadow for active line
- Improved scale animations (1.15x-1.18x for active)
- Enhanced line spacing and visual hierarchy
- Applied to mobile, desktop, and fullscreen views
-
Shuffle Functionality: Now properly shuffles playlist regardless of current playback state
-
Artists Tab: Now correctly displays artists when "Artists" filter is selected
-
Homepage Empty State: Added fallback message and refresh button when no content
-
#26: Transcoding/streaming quality settings
- Added WiFi and Mobile bitrate configuration in Server settings
- Support for format selection (MP3, Opus, AAC)
- Bitrate options from 64kbps to 320kbps or original quality
-
#25: Library search now works on all items, not just playlists
- Implemented
LibrarySearchDelegatethat searches across playlists, albums, and artists
- Implemented
-
#24: Artists tab now displays content
- Fixed
_getFilteredItemsto properly filter and return artists list
- Fixed
-
#22: Homepage shows fallback when no content available
- Added empty state widget with refresh button when no albums/songs loaded
-
#20: Shuffle button now always shuffles instead of acting as play/pause
- Modified shuffle logic to always shuffle the playlist, even when already playing
-
#19: Download button in playlist now downloads all songs
- Implemented batch download functionality in playlist screen
-
#18: Play/Pause state now correctly shows only for the active playlist
- Fixed playlist header to compare current playing context
-
#17: Lyrics scroll now uses smooth animations without line-break changes
- Used fixed font size for all lines to prevent layout shifts
-
#16: Library search button now works
- Connected search icon to
LibrarySearchDelegate
- Connected search icon to
-
#15: Swipe down to minimize player implemented
- Added gesture detector for vertical swipe to dismiss full player
-
#14: Option to hide volume bar from player
- Added toggle in Display settings to show/hide volume slider
-
#13: Click on album/artist name navigates to respective screen
- Made album and artist names tappable in now playing screen
-
#12: Internet radio station support
- Added
RadioScreenwith server radio stations - Support for streaming internet radio URLs
- Added
-
#11: All Songs view with sort options and playback
- Added
AllSongsScreenwith play/shuffle buttons
- Added
-
#10: Auto-DJ feature for queue
- Implemented smart queue that adds similar songs when queue ends
-
#9: ReplayGain support
- Added ReplayGain toggle in Playback settings
-
#8: Progress bar freezes on rewind
- Fixed position stream subscription to properly update on seek
-
#7: Custom TLS/SSL certificates
- Added option to allow self-signed certificates in login
- Added custom certificate file picker in Advanced Options
-
#5: Lyrics text stability
- Fixed line break changes during playback by using consistent font sizing
-
#4: Music Folders support
- Added music folder selection in Server settings
-
#3: Error messages for incorrect URL
- Added proper error handling and snackbar messages for connection failures
-
#1: Miniplayer persists
- Implemented nested navigator architecture to maintain miniplayer state