A Beautiful and Feature-rich Music & Video Player with Youtube Support, Built in Flutter
This report summarizes scanner evidence for namidaco/namida, a Dart project with 6,756 GitHub stars. SynthScan examined 314,154 lines of code across 857 source files, recording 275 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 1.5 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 253 finding(s).
Are imports declared and package/API names verified? 15 finding(s).
Are wrappers, guards, and repeated structures necessary? 10 finding(s).
Which changes need focused human review? 275 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 275 distinct pattern matches across 12 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | analysis_options.yaml | 41 | # Instead of disabling a lint rule for the entire project in the | COMMENT |
| LOW | linux/packaging/flatpak/app.namida.Namida.yml | 1 | # Flatpak manifest for Namida. | COMMENT |
| LOW | scripts/splash.dart | 21 | // if (icon == _IconDetails.defaultIcon) { | COMMENT |
| LOW | scripts/splash.dart | 41 | void _renameAndroidFiles(String suffix) { | COMMENT |
| LOW | scripts/make_appimage.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/.obsolete/tr.dart | 1 | // ignore_for_file: avoid_print | COMMENT |
| LOW | scripts/.obsolete/tr.dart | 81 | String _getKey(String key) => languageMap[key] ?? languageMapDefault[key] ?? ''; | COMMENT |
| LOW | scripts/.obsolete/tr.dart | 101 | // await for (final fileSystem in Directory(_languagesDirectoryPath).list()) { | COMMENT |
| LOW | scripts/.obsolete/tr.dart | 141 | // final lastPiece = langController.split(splitterTwo).last; | COMMENT |
| LOW | .github/workflows/release_beta.yml | 1 | # This workflow uses actions that are not certified by GitHub. | COMMENT |
| LOW | lib/ui/pages/sync_manager_page.dart | 1161 | required this.onSync, | COMMENT |
| LOW | lib/ui/pages/sync_manager_page.dart | 1181 | // ), | COMMENT |
| LOW | lib/ui/pages/playlists_page.dart | 461 | padding: const EdgeInsets.symmetric(horizontal: 12.0), | COMMENT |
| LOW | lib/ui/pages/playlists_page.dart | 481 | text: lang.add, | COMMENT |
| LOW | lib/ui/pages/subpages/most_played_subpage.dart | 201 | dateCustom: _rangeCenteredOnDay(dates.first, daysRadiusRx.value), | COMMENT |
| LOW | lib/ui/pages/subpages/most_played_subpage.dart | 581 | ], | COMMENT |
| LOW | lib/ui/pages/subpages/most_played_subpage.dart | 601 | // newest: DateTime.fromMillisecondsSinceEpoch(rangeStartMS + intervalMS), | COMMENT |
| LOW | lib/ui/pages/subpages/most_played_subpage.dart | 621 | // color: isActive ? CurrentColor.inst.currentColorScheme.withOpacityExt(0.63) : theme.cardColor | COMMENT |
| LOW | lib/ui/pages/subpages/most_played_subpage.dart | 641 | // bgColor: theme.cardColor.withOpacityExt(0.2), | COMMENT |
| LOW | lib/ui/widgets/stats.dart | 181 | ); | COMMENT |
| LOW | lib/ui/widgets/stats.dart | 201 | // super.initState(); | COMMENT |
| LOW | lib/ui/widgets/stats.dart | 221 | // // -- only the peak gets a label, anything more turns the line into a wall of text. | COMMENT |
| LOW | lib/ui/widgets/stats.dart | 241 | // child: CAKineticPathReveal( | COMMENT |
| LOW | lib/ui/widgets/custom_widgets.dart | 6801 | // builder: (context, shuffleReflectInQueue) => NamidaTooltip( | COMMENT |
| LOW | lib/ui/widgets/jellyfish.dart | 261 | COMMENT | |
| LOW | lib/ui/widgets/jellyfish.dart | 781 | /// | COMMENT |
| LOW | lib/ui/widgets/jellyfish.dart | 801 | // void _swapArt() { | COMMENT |
| LOW | lib/ui/widgets/jellyfish.dart | 821 | // seed: 11, | COMMENT |
| LOW | lib/ui/widgets/jellyfish.dart | 841 | // child: Image.asset( | COMMENT |
| LOW | lib/ui/widgets/jellyfish.dart | 861 | // ), | COMMENT |
| LOW | lib/ui/widgets/jellyfish.dart | 961 | /// The full artwork, drifting slowly behind whatever sits on top of it. | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 21 | /// A callback used by [ReorderableList] to report that a list item has moved | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 41 | /// newIndex -= 1; | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 61 | /// | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 81 | /// the start of an item drag and then start the reorder by calling | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 141 | /// The [IndexedWidgetBuilder] index parameter indicates the item's | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 161 | /// of the items. | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 181 | final void Function(int index)? onReorderStart; | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 261 | /// | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 301 | } | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 321 | COMMENT | |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 341 | /// // ... | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 421 | /// It is up to the application to wrap each child (or an internal part of the | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 501 | final Widget? prototypeItem; | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 561 | /// | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 581 | /// GlobalKey<SliverReorderableListState> listKey = GlobalKey<SliverReorderableListState>(); | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 661 | void dispose() { | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 1201 | /// wrapped item to a new location in a reorderable list. | COMMENT |
| LOW | lib/ui/widgets/custom_reorderable_list.dart | 1261 | index: index, | COMMENT |
| LOW | lib/ui/widgets/custom_tooltip.dart | 21 | /// | COMMENT |
| LOW | lib/ui/widgets/custom_tooltip.dart | 81 | COMMENT | |
| LOW | lib/ui/widgets/custom_tooltip.dart | 101 | /// the child that Tooltip wraps is hovered over on web or desktop. On mobile, | COMMENT |
| LOW | lib/ui/widgets/custom_tooltip.dart | 121 | /// `height` has been used to set a specific height of the Tooltip. | COMMENT |
| LOW | lib/ui/widgets/custom_tooltip.dart | 141 | /// {@end-tool} | COMMENT |
| LOW | lib/ui/widgets/custom_tooltip.dart | 201 | /// The text to display in the tooltip. | COMMENT |
| LOW | lib/ui/widgets/custom_tooltip.dart | 221 | /// while for mobile platforms the default value is `BoxConstraints(minHeight: 32.0)`. | COMMENT |
| LOW | lib/ui/widgets/custom_tooltip.dart | 241 | final EdgeInsetsGeometry? margin; | COMMENT |
| LOW | lib/ui/widgets/custom_tooltip.dart | 261 | /// Applying [TooltipThemeData.preferBelow]: `false` for the entire app | COMMENT |
| LOW | lib/ui/widgets/custom_tooltip.dart | 281 | /// The tooltip shape defaults to a rounded rectangle with a border radius of | COMMENT |
| LOW | lib/ui/widgets/custom_tooltip.dart | 301 | /// [TextAlign.start]. | COMMENT |
| 167 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | lib/ui/pages/queues_page.dart | 38 | final queuesKeys = QueueController.inst.queuesMap.valueR.keys.toFixedList(); | CODE |
| CRITICAL | lib/ui/pages/home_page.dart | 705 | List<Track> getFavouritesSample(int count) => PlaylistController.inst.favouritesPlaylist.value.tracks.getRandomSample( | CODE |
| CRITICAL | lib/ui/pages/home_page.dart | 1096 | List<String> getFavouritesSample(int count) => YoutubePlaylistController.inst.favouritesPlaylist.value.tracks.getRando | CODE |
| CRITICAL | lib/ui/pages/playlists_page.dart | 574 | text: HistoryController.inst.topTracksMapListens.valueR.length.formatDecimal | CODE |
| CRITICAL | lib/ui/pages/subpages/playlist_tracks_subpage.dart | 73 | return _searchableTracks = HistoryController.inst.topTracksMapListens.value.keysSortedByValue.toFixedList(); | CODE |
| CRITICAL⚡ | lib/ui/widgets/stats.dart | 121 | StatsMiniTile(icon: MediaType.album.toIcon(), label: lang.albums, value: Indexer.inst.mainMapAlbums.valu | CODE |
| CRITICAL⚡ | lib/ui/widgets/stats.dart | 122 | StatsMiniTile(icon: MediaType.artist.toIcon(), label: lang.artists, value: Indexer.inst.mainMapArtists.v | CODE |
| CRITICAL⚡ | lib/ui/widgets/stats.dart | 123 | StatsMiniTile(icon: MediaType.genre.toIcon(), label: lang.genres, value: Indexer.inst.mainMapGenres.valu | CODE |
| CRITICAL | lib/ui/widgets/selected_tracks_preview.dart | 213 | List<Track> getSelectedTracks() => SelectedTracksController.inst.selectedTracks.value.tracks.toList(); | CODE |
| CRITICAL | lib/ui/widgets/selected_tracks_preview.dart | 304 | tracksWithDates: SelectedTracksController.inst.selectedTracks.value.tracksWithDates.toList(), | CODE |
| CRITICAL | lib/ui/widgets/settings/playback_settings.dart | 1504 | final _localNames = PlaylistController.inst.playlistsMap.value.keys.toFixedList(); | CODE |
| CRITICAL | lib/ui/widgets/settings/playback_settings.dart | 1505 | final _ytNames = YoutubePlaylistController.inst.playlistsMap.value.keys.toFixedList(); | CODE |
| CRITICAL | lib/controller/eggs_controller.dart | 256 | final days = HistoryController.inst.historyMap.value.values.toFixedList(); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …roid/app/src/main/kotlin/com/msob7y/namida/SafUtils.kt | 16 | * Generated by claude code. | COMMENT |
| HIGH | scripts/install_linux_tar.sh | 3 | # Namida Installation Script, Generated by claude.ai | COMMENT |
| HIGH | scripts/gen_downloads_table.sh | 3 | # Generated by claude.ai | COMMENT |
| HIGH | lib/ui/widgets/lyrics_karaoke_text.dart | 13 | /// Generated by claude.ai | COMMENT |
| HIGH | lib/ui/widgets/lyrics_karaoke_text.dart | 396 | /// Generated by claude.ai | COMMENT |
| HIGH | lib/controller/music_web_server/jellyfin_api.dart | 1 | /// This file is generated by claude.ai | COMMENT |
| HIGH | lib/packages/lyrics_lrc_parsed_view.dart | 1577 | /// Generated by claude.ai | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/gen_app_icons.py | 95 | CODE | |
| LOW | scripts/unpushed_deps.py | 113 | CODE | |
| LOW | scripts/chlog.py | 196 | CODE | |
| LOW | scripts/chlog.py | 377 | CODE | |
| LOW | scripts/chlog.py | 552 | CODE | |
| LOW | scripts/chlog.py | 958 | CODE | |
| LOW | scripts/chlog.py | 1209 | CODE | |
| LOW | scripts/chlog.py | 1521 | CODE | |
| LOW | scripts/chlog.py | 1602 | CODE | |
| LOW | scripts/screenshots/compose.py | 375 | CODE | |
| LOW | scripts/screenshots/seed.py | 555 | CODE | |
| LOW | scripts/screenshots/seed_youtube.py | 231 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | scripts/bundle.dart | 68 | print('Error occured while building for linux.. aborting. (err code $buildExitCode)'); | CODE |
| MEDIUM | scripts/.obsolete/tr_refine.dart | 15 | print('Error parsing the map $e'); | CODE |
| MEDIUM | scripts/.obsolete/tr_refine.dart | 25 | print('Error parsing the main map, aborting...'); | CODE |
| MEDIUM | scripts/.obsolete/tr_refine.dart | 37 | print('Error parsing the json of $fileSystem, skipping...'); | CODE |
| MEDIUM | scripts/.obsolete/tr.dart | 115 | print('Error Adding: $e\nRemoving Keys...'); | CODE |
| MEDIUM | scripts/.obsolete/tr.dart | 164 | print('Error Removing: $e'); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/chlog.py | 1093 | except FileNotFoundError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | linux/packaging/flatpak/app.namida.Namida.yml | 14 | # This file is copied as-is to Flathub, only `namida-source.json` differs there (release url + sha256). | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/screenshots/compose.py | 453 | def write_metainfo_screenshots(): | CODE |
| LOW | scripts/screenshots/seed.py | 835 | def read_youtube_listens_per_day(data_dir: Path) -> dict: | CODE |
| LOW | .github/scripts/issue_triage.js | 547 | function isAuthorDuplicateCandidate(item, criteria) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | lib/ui/widgets/custom_reorderable_list.dart | 1474 | // won't pick up the scaffold's padding in the overlay. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/chlog.py | 17 | CODE | |
| LOW | scripts/chlog.py | 26 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/install_linux_tar.sh | 17 | # Check if running as root | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/make_appimage.sh | 13 | # Usage: | COMMENT |