elias8/last_fm
67.8
Adequate · 21 September 2026
2.4k
lines of production code
Dart
primary language
4
measurements over time
What this system is
This system is a Flutter-based mobile application, likely for music or media consumption, featuring artist and album search capabilities. It has been refactored to use the BLoC pattern for state management and the networkx library for standardized network error handling. The codebase also includes platform-specific configurations for Android and iOS, along with an updated test suite reflecting these architectural and dependency changes.
Behavioural changes
Migrated artist search to BLoC pattern and improved error handling
The artist search feature was refactored from a Cubit to a BLoC, introducing a debounced text-change event that automatically triggers the search as the user types, removing the need for a separate search button. The implementation now uses the \networkx\ library for network errors, replacing the previous \NetworkException\ with \NetworkError\, and the UI was updated to handle explicit success and failure states rather than folding a response object. Additionally, the album feature adopted the same \networkx\ error handling, updated state names (e.g., \AlbumDetailLoaded\ to \AlbumDetailSuccess\), and made the track duration field nullable to handle missing data gracefully.
lib/features/album · high confidence
Refactors dependency injection and routing configuration
The dependency injection setup in lib/config/dependency\_injection/dependency\_injection.dart and its generated file have been refactored to use an extension method on GetIt, and the AppRouter's redirect logic now accepts the BuildContext and explicitly returns null for unhandled states. Additionally, the global bloc observer in lib/config/bloc/app\_bloc\_observer.dart is simplified by removing the wrapper function, and the app's localization file adds an 'unhandled' case for network error messages.
lib/config · high confidence
Replaced custom exception classes with the \`networkx\` library
The \lib/core\ module has removed its internal exception hierarchy, deleting \AppException\, \NetworkException\, and related helper classes. These have been replaced by the \networkx\ package, as seen in \dio\_extension.dart\ where \NetworkException\ is now imported from \package:networkx/networkx.dart\. Consequently, code that previously threw or caught internal exceptions now interacts with the \NetworkError\ types provided by the external library.
lib/core · high confidence
Updated Android manifest and Gradle configuration alongside modernized URL launching
The Android application manifest now explicitly sets the main activity as exported, which may affect how the app is discovered by other apps. The Android build system has been upgraded from Gradle 6.7 to 6.7.1. In the shared feature module, the URL launching mechanism has been updated to use the modern \launchUrl\ API instead of the legacy \launch\ function, ensuring compatibility with current platform standards.
android, lib/features/shared · medium confidence
iOS minimum deployment target raised and Flutter app initialization updated
The iOS minimum deployment target has been increased from 9.0 to 11.0, requiring devices running iOS 11 or later. Additionally, the app's initialization logic was refactored: the custom BLoC observer is now set via \Bloc.observer\ instead of a separate \setBlocObserver\ call, and the \AppRouter.setUrlPathStrategy\ call has been removed from the main entry point.
ios, lib · high confidence
Test coverage
Migrate artist search from Cubit to Bloc; Updated album feature tests to use new network error types; Updated tests to reflect migration from Cubit to Bloc and new error types.
Dependencies
Updated project dependencies and build configurations
The project has updated its dependencies and build configurations to improve compatibility and stability. In the Dart/Flutter layer, the SDK constraint was raised to require at least version 2.18.0, and several packages were upgraded, including bloc (7.2.1 to 8.1.0), dio (4.0.1 to 4.0.6), go\_router (2.2.1 to 6.0.0), and flutter\_bloc (7.3.2 to 8.1.1). On the Android side, the compileSdk and targetSdk versions were updated to 33, and the Kotlin version was upgraded from 1.3.50 to 1.7.20. For iOS, the minimum supported iOS version was raised to 11.0, and the CocoaPods lock file was updated to version 1.11.3.
(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 66 → 68 (+1.6)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 100 → 100 (-0.3)
- Architecture 100 → 89 (-10.8)
- Maturity 56 → 61 (+4.6)
- Readiness 57 → 57 (+0.0)
- Security 82 → 92 (+9.5)
- Domain Modelling 100 → 100 (+0.0)
Resolved (15)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- High CVE: [GHSA redacted] (pubspec.lock)
- High CVE: [GHSA redacted] (pubspec.lock)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- No exposed public API
- Test reliability not included
- The Getting Started section instructs readers to issue a link [here][lastfm_auth_link] for an API key without showing how the auth flow actually proceeds or what happens after the key is obtained. (README.md)
- The Running Tests section lists commands like flutter test --coverage but does not explain what coverage means or how to interpret the generated report. (README.md)
- complexity unreadable for .dart, .kt, .swift — churn × complexity hotspots could not be measured
- early-stage repository — too little history to judge knowledge freshness
- git history depth insufficient
- single-maintainer — knowledge-concentration (bus factor) risk
New (16)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- Documentation: no contributor guidance (README.md)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (12 lines × 2) (lib/features/album/presentation/detail/widgets/album_detail_error.dart)
- Duplicated block (5 lines × 2) (lib/features/album/data/repositories/album_repository_impl.dart)
- High CVE: [GHSA redacted] (pubspec.lock)
- High CVE: [GHSA redacted] (pubspec.lock)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- Medium: security finding (details withheld)
- No ADRs found
- No dependency advisory monitoring
- Workflow token permissions not restricted
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
elias8/last_fm 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 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 2b64706b41454473ec1ef5c078598a2dbbd178eb — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-fa71c66cabd8.