Releases: spotiflacapp/SpotiFLAC-Mobile
Release list
SpotiFLAC-Mobile v4.8.5
New Features
- settings: Reveal nested search results
- settings: Search nested options
- metadata: Show current cover dimensions
- metadata: Add embedded cover resize options
- navigation: Add go to album actions
- player: Polish actions and synced lyrics
- settings: Polish search and navigation layout
- settings: Add searchable settings index
- collections: Unify selection-aware screens
- l10n: Localize settings search
- details: Add adaptive cover palettes
- theme: Add shared design tokens
- album: Batch download selected tracks
- metadata: Choose extension for online autofill
- library: Add quality label display modes
- library: Highlight high-bitrate quality badges
- library: Show a trailing fade on the filter chips row
- library: Playlists filter view and configurable default view
- player: Animate track changes and open queue with a swipe up
- tutorial: Fit pages on short viewports and fix page indicator visibility
- setup: Make language list scrollability obvious and center step content
- tablet: Cap wide-layout margins at 80dp so content uses the screen
- appearance: Manual toggle to force backdrop blur on lower device tiers
- queue: Long-press menu with move up/down for queued items
- metadata: Show average bitrate for lossless files in the track screen
- library: Add missing-ISRC metadata filter
- android: Home-screen download queue widget
- metadata: Manual MusicBrainz lookup in the tag editor
- player: Add repeat off/all/one modes
- queue: Offer one-tap retry when connectivity returns
- ux: Unify added-to-queue snackbars and add fetch retry
- library: ISRC duplicate detection beyond FLAC with review sheet
- track: Add Open on... platform links sheet
- l10n: Merge Crowdin updates, enable Korean at 98%
- library: M3U8 playlist import and export
- library: M3U8 playlist import and export
- player: Restore playback session after process death
- queue: Add download-next action on queued items
- extensions: Verify decentralized package integrity
- audio: Use VHQ settings for SoXR resampling
Bug Fixes
- ci: Align APK targets with supported ABIs
- search: Expose go to album for sparse tracks
- database: Make playback session migration idempotent
- metadata: Keep header details legible in light theme
- player: Refresh lyrics after automatic track changes
- metadata: Preserve WAV and AIFF tags
- analysis: Guard unsupported AC-4 codec
- lyrics: Reject empty embedded payloads
- metadata: Support extension custom search
- analysis: Detect full-band spectral cutoff
- ui: Refine track action spacing
- ui: Align track play button hitboxes
- player: Restore lyrics after cold start
- session: Enforce provider retry modes
- session: Block challenged session generations
- session: Honor canonical gateway error contracts
- session: Coordinate verification across parallel downloads
- selection: Keep modal sheets above selection bar
- player: Restore playback position reliably
- download: Make picker drag dismissal natural
- player: Preserve audio quality across track changes
- a11y: Improve compact control readability
- android: Stop forcing display mode at startup
- download: Suffix only colliding quality variants
- metadata: Fetch maximum cover for online autofill
- metadata: Verify maximum cover candidates
- storage: Recover from unwritable download folders
- ui: Sanitize user-facing errors
- analysis: Detect effective spectral cutoff
- library: Retain history during active downloads
- metadata: Dismiss autofill preview and surface feedback
- album: Overlay selection bar above navbar
- metadata: Align source picker with edit sheet
- analysis: Isolate metrics from active downloads
- download: Always alert for verification pauses
- download: Reject mismatched provider tracks
- download: Honor explicitly selected provider
- extensions: Serialize verification callbacks
- library: Retain cached rows across refresh
- library: Backfill local audio bitrates
- library: Keep rows visible during refresh
- library: Persist lossless bitrate metadata
- download: Swap local track variant actions
- home: Keep search visible during provider changes
- library: Retain records when deletion fails
- download: Complete quality variants reliably
- audio: Wait for complete analyzer metrics
- library: Keep track count readable next to filter actions
- store: Center add-repository state and keep submit button above keyboard
- download: Restore fast SQL-only duplicate check so huge playlists queue again
- queue: Keep cancelled downloads retryable across every cancel path and app restarts
- queue: Give completion-bridge cells swipe navigation into the library list
- extensions: Anchor URL handler patterns to the host
- extensions: Enforce minAppVersion and requiredRuntimeFeatures on load
- extensions: Isolate invalid registry checksums
- reenrich: Preserve release identity in batch actions
- verification: Recover signed-session bootstrap failures
- reenrich: Allow correcting stale release metadata
- download: Avoid unsafe automatic range resume
- config: Refresh announcements and remote content
- ci: Download pinned Gradle for native tests
- ci: Install Android 37 platform package
Performance
- metadata: Avoid SAF copies during quality probes
- android: Skip unused download widget work
- ui: Scope scan rebuilds, aspect-bound MediaQuery, lazy duplicate list
- history: Coalesce index bumps and batch per-row exists lookups
- metadata: Cache MusicBrainz ISRC lookups in the finalize path
- go: Cut redundant signed-session writes, progress-callback churn, tombstone growth
- assets: Instance GoogleSansFlex to the wght axis only
Refactoring
- ui: Standardize error and empty states
- extensions: Share extension rows
- settings: Unify settings components
- selection: Share bottom bar behavior
- library: Unify track cards
- ui: Standardize modal sheets
- ui: Unify sliver page headers
- metadata: Split cover cache, display helpers, and options menu into part files
- extensions: Split manifest models and provider-priority logic into part files
- library: Split row models and queue union SQL into part files
- analysis: Split models, info card, and spectrogram into part files
- android: Split replaygain journal, snapshots, and network policy out of DownloadService
- android: Split media, ffmpeg, and SAF publish helpers out of NativeDownloadFinalizer
- go: Split per-format scanners and incremental scan out of library_scan.go
- go: Split result/overlay helpers and output builders out of extension_fallback.go
- go: Split deezer models, cache upkeep, and browse endpoints out of deezer.go
- go: Split lyrics provider config, LRC codec, and search matching out of lyrics.go
- queue: Fold duplicated final-embed blocks into one helper
- queue: Decompose single-item god-method into _DownloadRun pipeline class
- queue: Move single-item download pipeline into a part file
- android: Split SAF scan and URI IO helpers out of MainActivity
- artist: Split section builders and dialogs into a part file
- go: Split package validation and VM lifecycle out of extension_manager.go
- history: Split models and startup maintenance into part files
- home: Split explore, recent, import, and search-results into part files
- queue: Split progress, verification, and connectivity into part files
- go: Split Ogg parsing and cover-art extraction out of audio_metadata.go
- go: Split M4A/MP4 tagging out of metadata.go
- Consolidate lyrics builders, cancel registries, and priority plumbing
- go: Consolidate duplicated track maps, selectors, and small helpers
- dart: Consolidate duplicated lookup, filename, and search-provider helpers
- ffmpeg: Remove dead conversion cluster and speculative decryption fields
- library: Drop unwired DB pagination providers
- Remove orphaned bridge, database, and queue helpers
- bridge: Remove dead cross-layer platform bridge methods
- ios: Isolate and test extension callbacks
- android: Extract native finalization policies
- dart: Extract queue search and media policies
Documentation
- release: Add 4.8.5 changelog
- extensions: Document the .sflx package suffix
- extensions: Document file download recovery options
- extensions: Add current development guide
Styling
- settings: Restore connected group layout
- dart: Apply repository formatting
- go: Apply Go 1.26 formatting
Testing
- ui: Cover search and player action consistency
- ui: Cover shared design system contracts
- go: Close output handle before cleanup
Dependencies
- deps: Update Flutter and Go dependencies
- deps: Update FFmpeg and notifications
Chores
- Update AltStore source to v4.8.0 by @github-actions[bot]
- release: Bump version to 4.8.5
- repo: Improve contributor experience
- release: Bump version to 4.8.1
- analysis: Enable unreachable_from_main lint
- about: Credit blackgold8282 (Korean) and BrandQc (French) as translators
- altstore: Describe extension-based providers instead of Amazon
Full Changelog: v4.8.0...v4.8.5
Downloads
Android
- arm64:
SpotiFLAC-v4.8.5-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v4.8.5-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v4.8.5-ios-unsigned.ipa(sideload required)
Installation
...
SpotiFLAC-Mobile v4.8.0
New Features
- ui: Smooth download progress updates
- download: Preserve quality variants
- convert: Optionally retain original files
- convert: Support same-format lossless re-encoding
- ui: Shimmer skeletons for the home feed artist/album sections
- player: ReplayGain/R128 volume normalization for the built-in player
- net: DoH fallback, uTLS pool flush on cleanup, retry hardening
- ui: Crossfade the app content on orientation and rail-breakpoint changes
- settings: Toggle to disable Hero animations
- tablet: Clamp remaining screens - settings, queue lists, wizard
- player: Swipe the mini player away to stop playback
- ui: Surface the audio-analysis cache in cache management
- tablet: Navigation rail, landscape now-playing, clamped track lists
- tablet: Clamp dialogs and sheets, adaptive selection-card columns
- ui: Real headers on extension loading screens so hero covers fly on open
- metadata: Album-style header with centered square cover
- player: Fade the sheet in place on close, letting only the cover travel
- ui: Crossfade skeleton into content on extension detail screens
- ui: Shared-element hero covers from search and recents to detail screens
- player: Expand transition from mini player with drag-to-dismiss
- ui: Fluid bouncing scroll physics on capable devices
- android: Request highest display refresh rate at current resolution
- download: Resume interrupted downloads via Range/If-Range
- update: Force update when 3+ stable releases behind
- artist: Shimmer skeleton for album and popular-track cover placeholders
- ui: Add shared widgets, utils, and models for deduplicated screens
- metadata: Route MP3, Ogg, and M4A edits to the native writers
- metadata: Add native Ogg/Opus vorbis comment editor
- metadata: Add native M4A ilst tag editor
- metadata: Add native MP3 ID3v2 tag editor
- ios: Run verification and OAuth through ASWebAuthenticationSession
- downloads: Support up to 3 concurrent downloads
- downloads: Detect lost SAF grant and offer folder re-selection
- metadata: Surface explicit content flag with [E] badge
- extensions: Complete signed-session grants from help dialog
Bug Fixes
- navigation: Open download queue from snackbar actions
- extensions: Preserve explicit track metadata
- lyrics: Reject mismatched search results
- native-worker: Harden background queue handling
- analysis: Render full-track spectrograms
- library: Persist records before download completion
- library: Preserve downloaded file records
- notifications: Restore verification alert sound
- android: Sanitize restored installation state
- queue: Clarify and coalesce verification progress
- download: Accelerate verified extension resumes
- download: Persist and reconcile history reliably
- convert: Simplify output names and harden writes
- metadata: Resolve audio format and local artwork
- queue: Bridge completed downloads into library
- ui: Honor disabled hero animations
- ui: Restore plain loading skeleton on extension album screen
- logging: Keep cursors valid after rollover
- extensions: Bound file reads
- extensions: Bound cookie runtime state
- download: Name variants by measured quality
- queue: Open completed batch track metadata
- reenrich: Always clean temporary artifacts
- player: Prevent stale playback and clean SAF temps
- extensions: Harden package and runtime lifecycle
- extensions: Surface swallowed signed-session verification in provider fallback
- metadata: Send Accept-Language on Deezer requests so names follow the app language
- download: Skip AC-4 repair for non-MP4 decrypt output
- ui: Fetch covers via the Go backend instead of raw HttpClient
- go: Build with Go 1.26.5 for aligned cgo frames, safe on arm32
- shell: Rail overflow on short viewports and tab reset on rotation
- player: Don't auto-resume after interruption while backgrounded
- reenrich: Keep release identity when the matched track is from another album
- extensions: Remove extension data dir on uninstall
- ui: Match loading-header placeholder heights to the loaded rows
- ui: Hero continuity for motion (Apple Music) headers
- ui: Defer loaded-screen swap until the push transition settles
- playlists: Keep imported playlist track order (#482)
- player: Pause motion header video when its screen is hidden
- player: Dissolve the sheet while it slides down on close
- artist: Drop blurBackground stretch mode on the header
- player: Fade Now Playing content with the expand transition
- network: Harden audit findings in transport, uTLS pool, and cover cache
- queue: Restore pre-refactor guarantees found by commit audit
- metadata: Shift stco/co64 chunk offsets when the ilst resizes
- finalizer: Stage conversion outputs and sync SAF streams
- download: Fsync staged downloads before the promote rename
- metadata: Write FLAC, M4A, and AC-4 tags atomically with fsync
- metadata: Stop the endless FLAC-write failures on misnamed files
- queue: Keep create-playlist label at natural size
- queue: Prevent header row overflow on narrow screens
- android: Stop double-destroying the shared audio_service engine
- renovate: Target main instead of nonexistent dev branch
- native-worker: Keep batches and retries intact across seam races
- downloads: Stage direct-mode outputs and serialize same-path writes
- saf: Stage all SAF downloads, serialize same-name writes, safe replace
- native-worker: Recover from dead runs and make queue replacement safe
- native-worker: Never delete a published download over bookkeeping failures
- extensions: Serialize storage/credential/salt file writes across runtimes
- queue: Keep just-completed tracks pinned while the batch is running
- downloads: Flush queue persistence when app is backgrounded
- downloads: Defer verification challenge until app is foregrounded
- extensions: Expire stale pending auth challenges
- metadata: Close FLAC file handles after parsing
- ios: Create security-scoped bookmark inside native folder picker session
- store: Harden extension repo registry handling
- download: Suffix batch filenames with track number when needed
- ui: Use State's context instead of stale parameter in CSV import (#460) (#460) by @A831ARD0
Performance
- go: Add runtime metrics and benchmarks
- dedupe: Batch isrc lookups under one lock
- library: Scan flac and m4a in one pass
- extensions: Invoke goja providers directly
- memory: Drop disposable caches on pressure
- cache: Defer cover cache maintenance
- queue: Persist and index incremental updates
- playback: Batch local playlist resolution
- shell: Gate backdrop blur by device capability
- startup: Bootstrap persisted app state
- library: Trim startup lookup index
- library: Streamline search and grouped counts
- player: Isolate high-frequency playback updates
- library: Lazy-load collections and dispose queries
- player: Narrow now-playing queue sheet to shuffle-mode selector
- embed: Native-first tag writes and overlapped fetches in finalization
- ui: Skip the shell backdrop blur on low-end devices
- db: Enable incremental auto-vacuum so cleared data shrinks the file
- android: Sweep stale cache files, relax scan poll, debounce worker snapshots
- disk: Byte-cap the cover disk cache with an init sweep
- net: Cache update-check and remote-config fetches with TTL and ETag
- net: Fetch embed covers once per release instead of per track
- analysis: Stream PCM from disk instead of buffering the whole track
- images: Decode completion-bridge cover precache at cell size
- scan: Stream SAF library scan results to a spill file
- memory: Release Go heap and decoded image caches on OS memory pressure
- lyrics: Bound the in-memory lyrics cache
- extensions: Reuse isolated goja download runtimes via per-extension pool
- ogg: Stream tag rewrites instead of buffering every page
- m4a: Stream tag rewrites instead of buffering the whole file
- Hoist per-call regex compiles to package level
- network: Enable gzip on the metadata transport
- tls: Enable session resumption on the stdlib transports
- network: Mobile stability and data-usage fixes from network audit
- native-worker: Stop shipping the full item payload on every poll
- dedupe: Make the ISRC index incremental, cover-free, and batch-stable
Refactoring
- library-scan: Reuse applyAudioMetadataToScan for M4A/MP3/APE
- settings: Share the provider-priority reorder page
- providers: Remove dead lookup/history APIs and dedup provider resolution
- search: Remove unreachable artist/album/playlist result path
- reenrich: Share the FFmpeg re-enrich apply flow
- backend: Drop dead exports/availability path and dedup Go tag writers
- library: Drop dead pre-pagination filter pipeline in queue tab
- Rename extension store bridge ABI to repo across all layers
- dart: Rename store provider and screen folder to repo
- go: Rename extension store files and internals to repo
- queue: Split download_queue_provider into concern part files
- queue: Extract shared payload, history, and polling helpers
- Unify extension call skeleton and download finalization paths
- screens: Migrate remaining screens to shared header and selection components
- screens: Share album-screen scaffolding and track flows
- ui: Consolidate duplicated sheets, rows, and cover widgets
- Extract shared helpers for repeated low-level patterns
- Remove dead code across Dart and Go l...
SpotiFLAC-Mobile v4.7.1
New Features
- extensions: Embed full metadata and cover after extension downloads
- audio: Add dither and resampler options for lossless conversion
- extensions: Manual verification help when browser launch fails
- settings: Add extension verification browser mode preference
Bug Fixes
- convert: Make convert bottom sheets draggable and scroll-controlled
- extensions: Default verification browser to in-app first
- download: Hand off native worker verification to interactive queue
- ac4: Reject truncated AC-4 sample entries safely
- extensions: Bootstrap and clear pending signed-session auth
Chores
- release: Bump version to 4.7.1+137
- Update AltStore source to v4.7.0 by @github-actions[bot]
L10n
- Add extension verification and lossless processing strings
Full Changelog: v4.7.0...v4.7.1
Downloads
Android
- arm64:
SpotiFLAC-v4.7.1-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v4.7.1-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v4.7.1-ios-unsigned.ipa(sideload required)
Installation
Android: Enable "Install from unknown sources" and install the APK
iOS: Use AltStore, Sideloadly, or similar tools to sideload the IPA
SpotiFLAC-Mobile v4.7.0
New Features
- extension-repo: Preserve package suffix from download URL
- extensions: Route Deezer metadata through enabled extension
- ui: Stabilize album and playlist header layouts
- extension-health: Lengthen cache TTL and honor per-check minimum
- Apply lossless conversion quality cap to album screen batch convert
- Reorderable up-next queue + playback stability
- Cap bit depth/sample rate on lossless conversion + WAV/AIFF
- ui: Hide audio quality badge on downloading queue items
- ui: Redesign local/downloaded album and folder screen headers
- Playback queue, preview exclusivity, player bug fixes
- Add new playback experience and media integration
- go: Verification early-abort in fallback + album metadata from tracks
- banner: HLS motion-artwork header banners and audio-quality badges
- preview: Play short track preview snippets in lists
- extension-health: Cache results, force refresh, treat lookup errors as transient
- ui: Polish album folder structure picker bottom sheet
- ui: Add Beta badge to Backup & Restore settings entry
- network: Add opt-in allow local/private network setting
- backup: Include installed extensions and settings in backup/restore
- settings: Add backup and restore for settings, history and library
- library: Add rename action to playlist folder screen
- download: Add {playlist_position} filename placeholder
- Handle extension verification and retry-after on download
- Extension runtime and provider improvements
- download: AC-4 passthrough support
- replaygain: Add Opus R128 gain tags
- queue: Tap a failed download to view its error details
Bug Fixes
- download: Track verification retries per service
- extensions: Scope signed session files by endpoint and app context
- lyrics: Sync provider priority to backend on save
- lyrics: Prefer workers.dev LyricsPlus mirror first
- banner: Allow motion artwork video to mix with other audio
- queue: Resolve local album tracks by album_key
- lyrics: Sync provider settings to backend before fetch
- go: Widen lyrics priority grace to 5s so priority provider wins
- Preview player lifecycle and minor safety cleanups
- go: Classify transient timeout/5xx in extension health as unknown (grey)
- ui: Prevent home search skeleton row from overflowing on narrow screens
- lyrics: Improve provider fallback and health handling
- deps: Keep file_picker on 12.x beta to stay win32 6 compatible
- download: Detect actual output format from audio codec on fallback
- Navigate to correct artist when tapping artist name
- metadata: Cap oversized cover art and support QuickTime/MP4 tags
- android: Disable Impeller on Sony audio players and Vivante GPUs
- metadata: Write M4A ISRC/label natively and read all edited fields from file
- download: Honor requested quality when fallback provider recognizes it
Performance
- Optimize queue/library pagination, counts, scan, and extension runtime
Refactoring
- Hoist lossless labels before async convert paths
- track-provider: Rework verification retry, parse preview/header video
- ui: Make backup/restore page consistent with other settings
Dependencies
- deps: Update Flutter and Go dependencies to latest stable
Chores
- player: Log internal pause and audio interruption events
- Bump version to 4.7.0+136
- Clean up redundant comments across Go backend and Flutter sources
- Move website to spotiflacapp/Website repo
- Update AltStore source to v4.6.0 by @github-actions[bot]
Build
- android: Bump Java to 25 and targetSdk to 37
- android: Bump compileSdk to 37 and pin file_picker to beta.5
L10n
- Localize settings, store, and metadata UI strings
- Localize audio conversion labels and confirmations
- Localize library settings and announcements
- Add localization keys for hardcoded UI strings
Full Changelog: v4.6.0...v4.7.0
Downloads
Android
- arm64:
SpotiFLAC-v4.7.0-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v4.7.0-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v4.7.0-ios-unsigned.ipa(sideload required)
Installation
Android: Enable "Install from unknown sources" and install the APK
iOS: Use AltStore, Sideloadly, or similar tools to sideload the IPA
SpotiFLAC v4.6.0
New Features
- playlist: Blurred backdrop with full cover in playlist header
- ui: Add bottom inset so scrollable content clears the transparent navbar
- library: Show active downloads inside the library grid
- ui: Reduce bottom navbar height
- ui: Frosted translucent bottom navbar
- lyrics: Show actual lyrics source in metadata
- audio: Add WAV and AIFF support + settings-style metadata menu
- lyrics,replaygain: Add LyricsPlus provider and ReplayGain batch scanning
- l10n: Enable French and German locales
Bug Fixes
- metadata: Use high-res cover in track metadata header
- download: Honor selected provider when it equals the track source
- download: Request fallback provider's own highest quality
- downloads/extensions: IOS background task, serialize extension mutations, safer batch convert sheet
- ui: Center modals on large screens, modernize edit-metadata + convert sheets, themed badges, fix artist skeleton and format-editor crash
- l10n: Remove redundant ICU plural categories causing gen-l10n warnings
- android: Override predictive-back page transition
- queue: Simplify queue header and rate-limit indicator layout
Refactoring
- Generalize Tidal-specific naming to legacy/DASH terminology
- download: Remove concurrent download option
Dependencies
- deps: Update Flutter and Go dependencies
Chores
- ios: Strip CRLF from ffmpeg plugin scripts before pod install
- Bump version to 4.6.0
- Trim redundant comments
- about: Credit Mickael81 as French translator
- Update AltStore source to v4.5.6 by @github-actions[bot]
fix
- l10n: Correct crowdin language mapping
Full Changelog: v4.5.6...v4.6.0
Downloads
Android
- arm64:
SpotiFLAC-v4.6.0-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v4.6.0-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v4.6.0-ios-unsigned.ipa(sideload required)
Installation
Android: Enable "Install from unknown sources" and install the APK
iOS: Use AltStore, Sideloadly, or similar tools to sideload the IPA
SpotiFLAC v4.5.6
New Features
- Polish search empty state and share caching
- Rebuild cross-extension sharing and queue controls
Bug Fixes
- Align ios deployment target for file picker
- Prevent queue header action clipping
- Align cross-service sharing and fallback routing
- Harden download errors and re-enrich sidecars
- Resolve album-only autofill and placeholder re-enrich regressions
- Stricter metadata matching, respect embedLyrics setting, improve Apple Music lyrics
Chores
- Update flutter and native dependencies
- Bump version to 4.5.6 (build 133)
- Update AltStore source to v4.5.5 by @github-actions[bot]
- Update AltStore source to v4.5.1 by @github-actions[bot]
Full Changelog: v4.5.5...v4.5.6
Downloads
Android
- arm64:
SpotiFLAC-v4.5.6-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v4.5.6-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v4.5.6-ios-unsigned.ipa(sideload required)
Installation
Android: Enable "Install from unknown sources" and install the APK
iOS: Use AltStore, Sideloadly, or similar tools to sideload the IPA
SpotiFLAC v4.5.5
New Features
- Expose audio codec in download result and skip lossy-to-lossless conversion
- Add 5 new lyrics providers
- Enhanced audio analysis with loudness, clipping, and spectral cutoff
- Audio analysis rescan and AAC conversion support
- Add AAC lossy target and toggle for Apple Music eLRC word sync
- Show remote-config launch announcement on app start
- Persist codec format and bitrate in download history
- Detect FLAC/ALAC/EAC3/AC3/AC4 codecs inside MP4 containers
- Allow re-running audio quality analysis after cached result
- Add library scroll-to-top and scroll-to-bottom quick buttons
Bug Fixes
- Native FLAC handling and extension API optimizations
- MP3 lyrics embedding via ID3v2.3 USLT frame
- Gate M4A to FLAC conversion on a codec probe in every branch
- Force native FLAC muxer when decrypting to .flac output
- Report zero bit depth for non-ALAC M4A containers
- Probe codec to avoid fake FLAC upscale from lossy sources
- native-worker: Preserve requested output container in finalizer
- saf: Use extension-agnostic .partial staged filename
Refactoring
- Extract download progress label formatting
- Use audio_conversion_utils in downloaded_album_screen
Chores
- Bump version to 4.5.5 (build 132)
- Housekeeping cleanup and code deduplication
Full Changelog: v4.5.1...v4.5.5
Downloads
Android
- arm64:
SpotiFLAC-v4.5.5-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v4.5.5-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v4.5.5-ios-unsigned.ipa(sideload required)
Installation
Android: Enable "Install from unknown sources" and install the APK
iOS: Use AltStore, Sideloadly, or similar tools to sideload the IPA
SpotiFLAC v4.5.1
Bug Fixes
- Avoid native worker binder payload limit
- Show missing extension state for returning users
- Preserve selected metadata and update credits
- Declare dataSync type when starting foreground download service
- Restore default quality settings
- Stabilize library search and bump version
- Prevent settings editor white screens
Documentation
- Update credits and trendshift badge
Chores
- Update AltStore source to v4.5.0 by @github-actions[bot]
Full Changelog: v4.5.0...v4.5.1
Downloads
Android
- arm64:
SpotiFLAC-v4.5.1-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v4.5.1-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v4.5.1-ios-unsigned.ipa(sideload required)
Installation
Android: Enable "Install from unknown sources" and install the APK
iOS: Use AltStore, Sideloadly, or similar tools to sideload the IPA
SpotiFLAC v4.5.0
New Features
- Improve library grid, image loading, and metadata filters
- Add experimental Android native download worker
- Show extension service health
- Add deduplicateDownloads setting & fix build errors by @Amonoman
- settings: Reorganize settings into focused pages by @Amonoman
- Add Favorite Artists collection
- Retire built-in download providers, add isolated extension runtimes, Google Sans Flex font, and monochrome icon support
- Improve extension metadata UI
- Expose audio duration in metadata API and fix home empty-state race
- Add generic extension provider resolution, progress phases, and instrumental lyrics heuristic
- Remove Tidal built-in provider, add extension download dedup/ISRC/Lyrics APIs, and expand l10n/a11y
- Add skip_fallback capability for extension availability results
- Propagate download cancellation through entire pipeline, add MusicBrainz album artist fallback, and allow disabling home feed
Bug Fixes
- Guard security scoped bookmark options on iOS
- Preserve source cover metadata embeds
- Show lossy audio bitrate in quality labels
- Distinguish preparing from downloading in native worker progress
- Sync NativeDownloadFinalizer history schema to v8
- Truncate SAF filenames and directory segments safely at UTF-8 boundaries
- Improve native worker metadata embedding and notification progress
- Sync download progress notification states
- Persist probed audio duration
- Constrain artist album covers
- Avoid disk resizing cover cache by default
- Clean up settings merge regressions
- Map missing Crowdin locale variants
- ios: Use security-scoped bookmarks for download directory persistence
- Fallback unsupported locales to English
Performance
- Unify queue tab with DB-backed pagination and cross-database queries
- Optimize native worker snapshot writes with delta mode
- Reduce library and queue update overhead
- Reduce bridge and UI churn
- Improve download queue resilience
Refactoring
- Migrate local library from in-memory list to database-backed pagination
- Remove built-in provider registry in favor of extensions
- settings: Split download/options into focused pages by @Amonoman
- Split large screen files into part files and DRY platform bridge
- Rename skipBuiltInFallback to stopProviderFallback, unify service/search provider grid layout, and retire useExtensionProviders toggle
- Remove Qobuz built-in provider and delete qobuz.go
- Remove Qobuz from built-in provider registry, add retired provider detection
- Abstract built-in providers into generic registry and unify platform bridge API
Testing
- Add comprehensive Go backend and Dart model test suites
Chores
- Remove dead code, fix error casing, and add lint rules
- Remove redundant comments and boilerplate across codebase
- Update default lyrics providers and about links
- Update app dependency versions
- Enable Ukrainian locale on main
- Import l10n updates from l10n_dev into main
- Update AltStore source to v4.3.1 by @github-actions[bot]
I18n
- Add missing optionsDefaultSearchTabAlbums/Tracks keys to all locales by @Amonoman
- Sync missing EN strings to all locales & fix DE consistency by @Amonoman
Revert
- Release.yml to normal by @Amonoman
Full Changelog: v4.3.1...v4.5.0
Downloads
Android
- arm64:
SpotiFLAC-v4.5.0-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v4.5.0-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v4.5.0-ios-unsigned.ipa(sideload required)
Installation
Android: Enable "Install from unknown sources" and install the APK
iOS: Use AltStore, Sideloadly, or similar tools to sideload the IPA
SpotiFLAC v4.3.1
New Features
- Carry extension download metadata through host pipeline and avoid FLAC-only genre/label pre-embed on non-FLAC files
- Improve Tidal metadata (copyright, album artist), remove Qobuz metadata search fallback, fix DATE/YAR tag sync
- Add preserveNativeOutputExtensions capability for extensions
- Convert M4A to FLAC when extension doesn't prefer native M4A output
Bug Fixes
- Handle .mp4 as alias for .m4a throughout download pipeline
- Show filter button in all/singles modes when tracks are empty but filters are active
- Ensure non-null search provider fallback and update default labels to Tidal
- Reset OutputExt on extension→extension fallback too
- Reset OutputExt on extension→built-in fallback
- Normalize extension codec for built-in fallback, remove dead Tidal ISRC
- Respect user provider choice over source extension priority
Chores
- Bump version to 4.3.1+126
- Reduce Gradle memory, add extension network timeout, fix tr locale
Full Changelog: v4.3.0...v4.3.1
Downloads
Android
- arm64:
SpotiFLAC-v4.3.1-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v4.3.1-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v4.3.1-ios-unsigned.ipa(sideload required)
Installation
Android: Enable "Install from unknown sources" and install the APK
iOS: Use AltStore, Sideloadly, or similar tools to sideload the IPA