finamp-app/finamp
53.4
Weak · 5 August 2026
16.3k
lines of production code
Dart
primary language
4
measurements over time
What this system is
This system is a mobile music player application, likely for Jellyfin servers, that manages audio playback, downloads, and library browsing. It provides extensive user customization for audio settings, layout, and appearance, alongside robust offline and background playback capabilities. The app supports multi-language localization and local data persistence, while explicitly excluding web and desktop platforms.
How it got here
2020 — Mobile platform modernization
12 changes.
The project focused on modernizing the Android and iOS build configurations, raising minimum OS requirements, and updating dependencies to support newer tooling. Simultaneously, the web application entry point was removed, and the codebase was restructured to support background audio, localization, and new download management features.
2022–2023 — UI overhaul and service layer introduction
20 changes.
This period focused on a comprehensive UI overhaul, introducing new components for the player, settings, and navigation while establishing a dedicated services layer for audio, downloads, and API interactions. The app gained significant functionality including offline support, tabbed browsing, and localized settings, supported by new Hive-based persistence for user data and preferences.
Features
Add artist playback and download controls
The ArtistScreen now includes dedicated buttons for playing an artist's music, shuffling their tracks, and managing downloads. Users can now play or shuffle all songs by an artist directly from the artist page, with support for both online streaming and offline playback. Additionally, a download button allows users to download all of an artist's albums, with a confirmation dialog to delete existing downloads.
lib/components/ArtistScreen · high confidence
Add dedicated components for transcoding settings
The TranscodingSettingsScreen now uses new, separate components for the bitrate selector and the transcoding toggle. Users can now adjust the transcode bitrate via a slider (64–320 kbps) and enable/disable transcoding through an adaptive switch, with all labels and subtitles localized via AppLocalizations.
lib/components/TranscodingSettingsScreen · high confidence
Add language selection screen with system locale support
A new language selection interface has been introduced, allowing users to choose their preferred language from a list. The implementation includes a 'System' option that correctly reflects the device's current system language, and displays the language name in the user's currently selected language (e.g., showing 'English' for the English locale when the app is set to English).
lib/components/LanguageSelectionScreen · high confidence
Add no-music-libraries message component
A new NoMusicLibrariesMessage widget has been added to display a user-facing message when no music libraries are present, including a title, body text, and a refresh button.
lib/components/ViewSelector · high confidence
Add private user sign-in component
A new PrivateUserSignIn widget has been introduced in the UserSelector component, providing a form for users to enter their server URL, username, and password. This component handles the initial authentication flow by validating the URL format and submitting credentials to the Jellyfin API helper, ultimately navigating to the view selector upon successful login.
lib/components/UserSelector · high confidence
Complete UI overhaul with new settings, player, and navigation screens
The app's user interface has been significantly restructured. A new settings system has been introduced, including dedicated screens for layout, interactions, audio service, transcoding, and download locations. The player screen now features a blurred background, swipe gestures for skipping tracks, and a sleep timer. Navigation has been updated with a new splash screen, user selector, and view selector. Additionally, the app now supports language selection and localizes all screens.
lib/screens · high confidence
Introduce Hive serialization for app settings and user data
The app now uses Hive to persist user preferences and account details locally. New models for FinampSettings and FinampUser have been added with corresponding generated adapters, enabling offline storage of settings such as sort order, buffer size, and UI toggles. Additionally, custom adapters for Locale and ThemeMode have been introduced to support these new storage capabilities.
lib/models · high confidence
Introduce new service layer for audio playback, downloads, and API interactions
The app introduces a new \lib/services\ directory containing a suite of helper classes that manage core app functionality. \AudioServiceHelper\ handles the audio queue and playback state, while \AlbumImageProvider\ manages image loading and precaching. Download management is handled by \DownloadsHelper\ and \DownloadUpdateStream\, and the \JellyfinApi\ (with its generated \jellyfin\_api.chopper.dart\ file) standardizes network requests. Additional services include \FinampUserHelper\ for user state, \FinampLogsHelper\ for sanitizing and sharing logs, and \CaseInsensitivePattern\/\CensoredLog\ for secure logging. This refactors and consolidates these capabilities into a dedicated services layer.
lib/services · high confidence
Introduces download location management and interaction settings
Adds new UI components for managing download locations and configuring interaction preferences. Users can now view, list, and delete custom download locations via the new DownloadLocationSettingsScreen. Additionally, the app introduces settings to control fast scrolling, disable gestures, and enable swiping songs into the queue as the next item.
lib · high confidence
New DownloadsErrorScreen components for failed downloads
The DownloadsErrorScreen now uses new, localized components (DownloadErrorList and DownloadErrorListTile) to display failed downloads. Users will see a list of failed download tasks with album art, song name, and artist, or a message indicating no errors if the list is empty. This replaces the previous implementation with a more structured, localized UI for error states.
lib/components/DownloadsErrorScreen · high confidence
New album image and artist display components
The app introduces a new \AlbumImage\ widget that handles fetching, caching, and displaying album art with a consistent 1:1 aspect ratio and border radius, supporting image precaching and callbacks. A new \ArtistsTextSpans\ component renders clickable artist names that navigate to the artist screen. Additionally, a reusable \ConfirmationPromptDialog\ for user confirmations and an \errorSnackbar\ for error reporting are added to the component library.
lib/components · high confidence
New audio and playback settings controls
The Audio Service Settings screen now includes dedicated UI components for configuring the audio buffer duration, the number of songs in the shuffle queue, and the behavior of the app when pausing playback. Users can now enter a custom buffer duration in seconds, set the count for shuffled songs, and toggle whether the app enters a low-priority state when paused.
lib/components/AudioServiceSettingsScreen · high confidence
New layout and appearance settings
The LayoutSettingsScreen now includes dedicated controls for customizing the app's visual presentation. Users can adjust the grid view's cross-axis count for portrait and landscape orientations, toggle the display of song artists on the album screen, and configure the content view type. Additional options allow users to hide song artists if they match the album artists, show the album cover as the player background, and display text on the grid view. The screen also provides a dropdown to select the application theme (system, light, or dark).
lib/components/LayoutSettingsScreen · high confidence
New logs screen with copy, share, and censored log viewing
The app now includes a dedicated Logs screen that displays a list of log entries. Users can copy individual log messages to the clipboard or share the full logs file. The interface includes a copy button, a share button, and an expandable list of logs where sensitive login information is automatically censored to protect user privacy. Each log entry shows the timestamp, logger name, and message, with distinct colors and icons for different log levels (info, warning, error).
lib/components/LogsScreen · high confidence
New screens for managing download locations and user logout
Added new UI components for configuring download paths and logging out. The AddDownloadLocationScreen now includes AppDirectoryLocationForm and CustomDownloadLocationForm, allowing users to select internal or custom directories for downloads. Additionally, a dedicated LogoutListTile component was added to the SettingsScreen, providing a styled logout option that handles audio playback stopping and navigation back to the splash screen.
lib/components/AddDownloadLocationScreen · high confidence
Redesign of the Player Screen with new controls and queue management
The Player Screen has been restructured with new components for playback controls, a progress slider, and queue management. Users can now access a bottom-sheet queue list with drag-and-drop reordering and swipe-to-remove functionality. Playback controls include shuffle, skip, play/pause, and repeat modes, while the progress slider supports seeking and displays buffering. A new sleep timer feature allows users to set a countdown to stop playback. The song title and artist information are now displayed with clickable links to artist and album screens.
lib/components/PlayerScreen · high confidence
Redesign of the album and playlist screen with new components
The album and playlist screen has been completely refactored into a new set of components including \AlbumScreenContent\, \SongListTile\, and \ItemInfo\. This change introduces a more structured layout for displaying album/playlist headers, song lists, and metadata (artists, duration, song count). It also adds new functionality for managing playlists, such as adding items to playlists, creating new playlists, and editing playlist names. The download and sync states are now handled by dedicated widgets (\DownloadedIndicator\, \SyncAlbumOrPlaylistButton\), and the UI for deleting downloads is now a separate \DeleteButton\ component.
lib/components/AlbumScreen · high confidence
Redesigned Music Screen with Tabbed Navigation and Offline Support
The Music screen has been restructured into a tabbed interface, allowing users to browse Albums, Artists, Genres, and Playlists in separate views. This update introduces an offline mode toggle in the drawer, enabling access to locally downloaded content. Users can now manage their favorites and mix lists directly from long-press menus on album and artist items, and sorting preferences (sort by, sort order) are now applied per tab rather than globally.
lib/components/MusicScreen · high confidence
Architecture
Project infrastructure and documentation overhaul
This change introduces several foundational updates to the project's infrastructure and documentation. It adds a Flutter wrapper script (\flutterw\) and a \.gitmodules\ file to manage the Flutter SDK as a git submodule, ensuring consistent build environments. The \.gitignore\ file is significantly expanded to exclude more build artifacts and IDE-specific files. Additionally, the repository gains new documentation files including \LICENSE\ (MPL-2.0), \PRIVACY.md\, \l10n.yaml\ for localization configuration, and \downwards\_plan.md\ outlining a major upcoming rewrite of the download system. The \analysis\_options.yaml\ is updated to use \flutter\_lints\ for code analysis.
(repo-wide) · high confidence
Behavioural changes
Android app package, permissions, and UI updates
The Android app's package name has been changed from com.example.finamp to com.unicornsonlsd.finamp. To support media playback and background audio, new permissions including FOREGound\_SERVICE, MEDIA playback, and internet access have been added to the manifest. The UI has been updated with a black navigation bar, a black splash screen background, and an adaptive app icon. Additionally, the app now declares the APP\_MUSIC intent category and registers audio service components to enable background audio features.
android/app · medium confidence
Downloads screen refactored into modular components
The Downloads screen has been refactored into separate, reusable components including a current downloads list, a list of downloaded albums and songs, and an overview card. This change introduces confirmation dialogs for deleting downloads, adds a sync button for playlists, and displays file sizes for downloaded content.
lib/components/DownloadsScreen · medium confidence
Expanded and updated translations for the app's user interface
The \lib/l10n\ directory has been updated with new and revised translations for multiple languages, including Arabic, Bulgarian, Catalan, Czech, Danish, German, Greek, English, Spanish, Estonian, and others. These updates ensure that UI elements, error messages, and settings labels are accurately localized for users speaking these languages. The changes reflect ongoing localization efforts via Weblate, improving the experience for non-English speakers by providing complete and correct translations for features like download management, library selection, and playback controls.
lib/l10n · high confidence
Extracted tab visibility toggle into dedicated component
The tab visibility toggle for the settings screen has been extracted into a new, dedicated \HideTabToggle\ widget. This component now encapsulates the logic for displaying and updating the state of individual tabs using an adaptive \SwitchListTile\, improving code modularity and maintainability within the tabs settings interface.
lib/components/TabsSettingsScreen · high confidence
Removed web application entry point and PWA configuration
The web version of the application has been removed. Specifically, the main HTML entry point (index.html) and the Progressive Web App manifest (manifest.json) have been deleted from the web directory. Users will no longer be able to access the application via a web browser or install it as a PWA.
web · high confidence
Updated Gradle wrapper to version 7.6
The Android build system now uses Gradle 7.6 (previously 5.6.2) to improve build performance and compatibility with newer Android tooling.
android/gradle · high confidence
Updated Xcode project scheme configuration
The iOS build scheme was updated to Xcode version 1510 (from 1020), and the scheme configuration was reorganized by moving the empty \<Testables\> and \<AdditionalOptions\> elements to their correct locations within the TestAction and LaunchAction sections.
ios/Runner.xcodeproj/xcshareddata · medium confidence
Updated iOS minimum deployment target and build configuration
The iOS minimum deployment target has been raised from 8.0 to 12.0, requiring devices running iOS 12 or later. Additionally, the iOS build configuration has been updated to include the Pods support files for both Debug and Release modes, and the workspace has been updated to reference the Pods project, ensuring proper integration of CocoaPods dependencies.
ios/Flutter · high confidence
Updated iOS project configuration and localization support
The iOS project file (project.pbxproj) has been updated to object version 54 and Xcode last upgrade check 1510, reflecting modernization of the build system. The configuration now includes separate Info.plist files for Debug, Profile, and Release build variants, and integrates CocoaPods support with specific build phases for checking the Pods manifest, embedding pods, and copying pod resources. Additionally, the list of supported languages for localization has been expanded to include German, Spanish, Dutch, Polish, Swedish, Arabic, French, Italian, Czech, Hungarian, Norwegian, and others, ensuring the app can properly display translated strings for these regions.
ios/Runner.xcodeproj · high confidence
Updated iOS workspace file reference
The iOS project workspace configuration was updated to correct the file reference for the Runner project, changing the location from 'group:Runner.xcodeproj' to 'self:', ensuring the workspace properly references the project within the current directory structure.
ios/Runner.xcodeproj/project.xcworkspace · medium confidence
iOS configuration and localization updates
The iOS build configuration has been updated to support background audio, downloads, and file sharing. Specifically, Info-Profile.plist and Info-Release.plist were added to define permissions and capabilities, while Info.plist was renamed to Info-Debug.plist and updated with new keys including NSPhotoLibraryUsageDescription, NSAppleMusicUsageDescription, UIFileSharingEnabled, and LSSupportsOpeningDocumentsInPlace. Additionally, empty localization string files (LaunchScreen.strings and Main.strings) were added for multiple languages (Arabic, Bulgarian, Catalan, Czech, Danish, German, Greek, Spanish, Estonian, French, Croatian, Hungarian, Italian, Japanese, Norwegian, Dutch, Polish, Portuguese, Russian, Swedish, Silesian, Thai, Turkish, Ukrainian, Vietnamese, and Chinese variants) to support future translation work.
ios/Runner · high confidence
Test coverage
Removed obsolete Flutter widget test
The default Flutter counter widget test (widget\_test.dart) has been removed from the test suite.
test · high confidence
Dependencies
Updated Android and iOS build configurations and dependencies
The Android build configuration has been updated to target SDK 34 and updated to use the modern Gradle plugin management syntax, while the iOS configuration now specifies a minimum deployment target of iOS 12.0. The project's Dart dependencies have been upgraded to support Dart 3.3 and include updated versions of key libraries such as just\_audio, audio\_service, and chopper, alongside the addition of new packages like android\_id and mini\_music\_visualizer.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 54 → 53 (-0.5)
- Rubric changed (rubric-2026.08.18 → rubric-2026.08.19) — scores are not directly comparable.
Lenses
- Code Health 96 → 96 (+0.0)
- Architecture 99 → 99 (+0.0)
- Maturity 49 → 47 (-2.1)
- Readiness 41 → 41 (+0.0)
- Security 66 → 67 (+0.5)
- Domain Modelling 87 → 87 (+0.0)
Resolved (1)
- Medium: security finding (details withheld)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
finamp-app/finamp was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 5 August 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 47f11677611381c95dc30002e21060e0d5082318 — the exact code this score is about.
- Scored under rubric-2026.08.19 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer latest.