Skip to content
CAI
Software that uses CAICheck a score

finamp-app/finamp

53.4

Weak · 5 August 2026

16.3k

lines of production code

Dart

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

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.