This report summarizes scanner evidence for crmne/spotifast. SynthScan examined 124,188 lines of code across 236 source files, recording 160 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 1.4 (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? 145 finding(s).
Are imports declared and package/API names verified? 12 finding(s).
Are wrappers, guards, and repeated structures necessary? 64 finding(s).
Which changes need focused human review? 160 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 160 distinct pattern matches across 6 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 | Cargo.toml | 41 | fastframe-fonts = { git = "https://github.com/crmne/fastframe", tag = "v0.15.2" } | COMMENT |
| LOW | Cargo.toml | 61 | fastframe-graphics = { git = "https://github.com/crmne/fastframe", tag = "v0.15.2" } | COMMENT |
| LOW | Cargo.toml | 81 | fastframe-audio = { git = "https://github.com/crmne/fastframe", tag = "v0.15.2" } | COMMENT |
| LOW | Cargo.toml | 101 | # to the few pages of each font that name it. fastframe-fonts uses both. | COMMENT |
| LOW | Cargo.toml | 121 | # eframe already pulls in, so they add no build. Only compiled with the | COMMENT |
| LOW | Cargo.toml | 141 | librespot-protocol = { version = "0.8", default-features = false } | COMMENT |
| LOW | Cargo.toml | 201 | # The packaged Dock artwork also identifies unbundled Cargo runs. | COMMENT |
| LOW | Cargo.toml | 281 | COMMENT | |
| LOW | Cargo.toml | 321 | # a background tray has already launched AppKit (winit#4770), and file drag and drop on | COMMENT |
| LOW | Cargo.toml | 341 | # compatibility fix. Drop this fork when a release includes both changes. | COMMENT |
| LOW | packaging/flatpak/rocks.spotifast.Spotifast.yml | 1 | # Spotifast as a Flatpak, built from source: the manifest Flathub builds | COMMENT |
| LOW | packaging/windows/update-leftovers.c | 21 | * action library; it never ships on its own. | COMMENT |
| LOW | packaging/windows/running-copy.c | 21 | * architecture and embeds it in the package; it never ships on its own. | COMMENT |
| LOW | examples/default_skin.rs | 1 | //! Draws Spotifast's built-in Winamp skin: the one the skinned window | COMMENT |
| LOW | .github/scripts/indexnow.rb | 1 | #!/usr/bin/env ruby | COMMENT |
| LOW | src/local_tags.rs | 1 | //! Cover art and lyrics from a local file's own tags. | COMMENT |
| LOW | src/eq.rs | 1 | //! Ten-band equalizer for local playback. | COMMENT |
| LOW | src/vis.rs | 41 | /// second on a timer of its own, so a fast or slow frame rate never | COMMENT |
| LOW | src/entrypoint.rs | 21 | #[arg(long)] | COMMENT |
| LOW | src/entrypoint.rs | 41 | demo_update_feed: Option<String>, | COMMENT |
| LOW | src/entrypoint.rs | 61 | #[cfg(feature = "demo")] | COMMENT |
| LOW | src/entrypoint.rs | 81 | #[arg(long, value_name = "MS", default_value_t = 6000)] | COMMENT |
| LOW | src/entrypoint.rs | 141 | Shuffle { state: Option<OnOff> }, | COMMENT |
| LOW | src/entrypoint.rs | 601 | // A start at login in the tray. A link asked to be seen, so it opens | COMMENT |
| LOW | src/entrypoint.rs | 1281 | } | COMMENT |
| LOW | src/emoji.rs | 1 | //! Colour emoji in every text, in the platform's own style. | COMMENT |
| LOW | src/sink.rs | 1 | //! Audio output for local playback. | COMMENT |
| LOW | src/sink.rs | 41 | /// Reported when the system has no audio output at all. The interface | COMMENT |
| LOW | src/sink.rs | 81 | /// Default Windows device buffer length in milliseconds. | COMMENT |
| LOW | src/sink.rs | 481 | envelope: Arc<Envelope>, | COMMENT |
| LOW | src/sink.rs | 901 | self.apply_volume(); | COMMENT |
| LOW | src/paths.rs | 1 | //! Where Spotifast keeps its files. | COMMENT |
| LOW | src/resample.rs | 1 | //! Sample rate conversion for an output that will not take 44.1 kHz. | COMMENT |
| LOW | src/auth.rs | 1 | //! Spotify sign-in with the Authorization Code + PKCE flow. | COMMENT |
| LOW | src/cast.rs | 1 | //! Google Cast speakers on the local network. | COMMENT |
| LOW | src/cast.rs | 61 | /// 10 s to launch. | COMMENT |
| LOW | src/cast.rs | 461 | } | COMMENT |
| LOW | src/mac_touchbar_crash_guard.rs | 1 | //! Guards against a known AppKit bug that turns closing the window into a | COMMENT |
| LOW | src/power.rs | 1 | //! The device's power, session and network state, and what the app may | COMMENT |
| LOW | src/bidi.rs | 1 | //! Right-to-left text support for egui. | COMMENT |
| LOW | src/limiter.rs | 1 | //! Look-ahead soft-knee limiter for final audio output. | COMMENT |
| LOW | src/milkdrop.rs | 1 | //! MilkDrop visualization through libprojectM. | COMMENT |
| LOW | src/images.rs | 21 | /// longer requests its source bytes. Visible images were therefore evicted and | COMMENT |
| LOW | src/images.rs | 261 | } | COMMENT |
| LOW | src/images.rs | 661 | }) | COMMENT |
| LOW | src/sonos.rs | 1 | //! Speakers Spotify will not let the Web API control, Sonos above all. | COMMENT |
| LOW | src/settings.rs | 261 | #[derive(Clone, PartialEq, Serialize, Deserialize)] | COMMENT |
| LOW | src/settings.rs | 361 | /// Show the interactive Now Playing widget when hovering over the MacBook notch. | COMMENT |
| LOW | src/settings.rs | 381 | /// Interface zoom, egui's zoom factor; Ctrl+plus/minus changes it. | COMMENT |
| LOW | src/settings.rs | 441 | /// Which proxy to use. Older files without this field stay on `system`. | COMMENT |
| LOW | src/settings.rs | 1841 | /// One-time player setup, including for installations upgraded from before Soloist. | COMMENT |
| LOW | src/settings.rs | 1861 | /// from `last_added_queue`; it does not enqueue this list. | COMMENT |
| LOW | src/settings.rs | 1881 | pub window_pos: Option<[f32; 2]>, | COMMENT |
| LOW | src/thumbbar.rs | 1 | //! The taskbar thumbnail toolbar: the transport buttons Windows draws | COMMENT |
| LOW | src/model.rs | 741 | /// The playlist list or Home is being read again behind what it shows. | COMMENT |
| LOW | src/model.rs | 861 | pub cache_write_pending: Option<PlaylistCachePending>, | COMMENT |
| LOW | src/player.rs | 181 | /// The librespot engine's Spotify session is alive. Connect device | COMMENT |
| LOW | src/zeroconf.rs | 1 | //! Spotify Connect receivers on the local network. | COMMENT |
| LOW | src/single_instance.rs | 1 | //! Single-instance guard and remote-control channel. | COMMENT |
| LOW | src/single_instance.rs | 21 | //! `play-uri`, `open-link`, and `transfer` validate their free-text arguments | COMMENT |
| 17 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packaging/test-release-names.py | 18 | def test_current_version_has_written_release_notes_before_tagging(self): | CODE |
| LOW | packaging/test-release-names.py | 25 | def test_checksums_cover_every_download_and_are_repeatable(self): | CODE |
| LOW | packaging/test-release-names.py | 52 | def test_appimages_and_their_zsync_files_are_checked_and_listed(self): | CODE |
| LOW | packaging/test-release-names.py | 69 | def test_a_wrong_or_missing_update_information_fails(self): | CODE |
| LOW | packaging/test-release-names.py | 82 | def test_every_appimage_needs_a_zsync_file_that_describes_it(self): | CODE |
| LOW | packaging/test-release-names.py | 95 | def test_a_stable_release_has_an_appimage_for_each_linux_archive(self): | CODE |
| LOW | packaging/test-launchers.py | 44 | def test_generated_aur_versions_start_at_the_requested_release(self): | CODE |
| LOW | packaging/test-launchers.py | 73 | def test_aur_payloads_install_the_launcher(self): | CODE |
| LOW | packaging/test-launchers.py | 92 | def test_flatpak_install_commands_keep_app_id_and_icon_aligned(self): | CODE |
| LOW | packaging/test-launchers.py | 106 | def test_native_manifest_installs_the_launcher_and_icon(self): | CODE |
| LOW | packaging/release-names.py | 48 | def embedded_update_information(path): | CODE |
| LOW⚡ | packaging/flatpak/test-metainfo.py | 31 | def test_keeps_the_release_details(self): | CODE |
| LOW⚡ | packaging/flatpak/test-metainfo.py | 40 | def test_checking_is_idempotent(self): | CODE |
| LOW⚡ | packaging/flatpak/test-metainfo.py | 44 | def test_rejects_another_version_or_application(self): | CODE |
| LOW⚡ | packaging/flatpak/test-metainfo.py | 50 | def test_reads_the_tag_when_the_checkout_owner_differs(self): | CODE |
| LOW⚡ | packaging/windows/test-msi.py | 362 | def test_installs_where_the_updater_says_and_uninstalls_cleanly(self): | CODE |
| LOW⚡ | packaging/windows/test-msi.py | 370 | def test_uninstall_removes_what_the_updater_staged(self): | CODE |
| LOW⚡ | packaging/windows/test-msi.py | 378 | def test_uninstall_removes_only_staging_folders_and_goes_on_past_a_held_file(self): | CODE |
| LOW | packaging/windows/test-msi.py | 397 | def test_update_keeps_what_the_updater_staged(self): | CODE |
| LOW⚡ | packaging/windows/test-msi.py | 415 | def test_uninstall_leaves_links_another_program_took_over(self): | CODE |
| LOW⚡ | packaging/windows/test-msi.py | 423 | def test_running_copy_stops_a_silent_uninstall_before_anything_goes(self): | CODE |
| LOW⚡ | packaging/windows/test-msi.py | 433 | def test_portable_copy_does_not_block_uninstall(self): | CODE |
| LOW⚡ | packaging/windows/test-msi.py | 440 | def test_missing_executable_does_not_block_uninstall(self): | CODE |
| LOW⚡ | packaging/windows/test-msi.py | 446 | def test_update_closes_only_the_installed_copy_and_keeps_choices(self): | CODE |
| LOW | packaging/windows/test-msi.py | 457 | def test_package_run_by_hand_updates_the_folder_in_use(self): | CODE |
| LOW | packaging/windows/test-msi.py | 462 | def test_older_package_does_not_replace_a_newer_one(self): | CODE |
| LOW | packaging/windows/test-msi.py | 481 | def test_updater_takes_over_an_inno_install(self): | CODE |
| LOW⚡ | packaging/windows/test-msi.py | 493 | def test_package_run_by_hand_takes_over_an_inno_install_where_it_is(self): | CODE |
| LOW⚡ | packaging/windows/test-msi.py | 500 | def test_takeover_removes_an_inno_desktop_shortcut_no_longer_wanted(self): | CODE |
| LOW⚡ | packaging/windows/test-msi.py | 506 | def test_running_inno_copy_is_closed_before_the_takeover(self): | CODE |
| LOW⚡ | packaging/windows/test-uninstall.py | 113 | def test_running_executable_preserves_the_whole_installation(self): | STRING |
| LOW⚡ | packaging/windows/test-uninstall.py | 121 | def test_other_copy_does_not_block_uninstall(self): | STRING |
| LOW⚡ | packaging/windows/test-uninstall.py | 127 | def test_close_terminates_only_the_installed_copy(self): | STRING |
| LOW⚡ | packaging/windows/test-uninstall.py | 135 | def test_missing_executable_does_not_block_cleanup(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 205 | def test_the_fields_of_each_settings_struct_are_found(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 211 | def test_an_unchanged_or_smaller_settings_struct_passes(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 216 | def test_a_new_field_is_found_with_its_struct(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 220 | def test_a_field_in_a_nested_settings_struct_counts(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 226 | def test_a_renamed_field_counts_and_session_state_does_not(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 235 | def test_an_interface_change_without_media_fails(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 240 | def test_media_in_the_description_or_an_author_comment_passes(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 244 | def test_changes_that_draw_nothing_pass(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 247 | def test_the_maintainer_label_passes_a_change_with_nothing_to_show(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 250 | def test_a_plain_link_is_not_media(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 255 | def test_a_pull_request_tests_on_linux_and_windows(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 258 | def test_main_and_the_label_test_everywhere(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 262 | def test_dependencies_and_ci_test_everywhere(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 266 | def test_macos_code_adds_macos(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 271 | def test_documentation_alone_tests_on_linux(self): | STRING |
| LOW⚡ | .github/scripts/test-policy-checks.py | 276 | def test_an_unreadable_change_runs_everything(self): | STRING |
| LOW | .github/scripts/test-policy-checks.py | 43 | def test_crates_io_and_crmne_repositories_pass(self): | STRING |
| LOW | .github/scripts/test-policy-checks.py | 58 | def test_a_contributor_fork_fails_in_the_manifest_and_the_lockfile(self): | STRING |
| LOW | .github/scripts/test-policy-checks.py | 65 | def test_lookalike_owners_and_paths_out_of_crmne_fail(self): | STRING |
| LOW | .github/scripts/test-policy-checks.py | 78 | def test_patches_from_a_path_or_another_registry_fail(self): | STRING |
| LOW | .github/scripts/test-policy-checks.py | 90 | def test_other_registries_and_source_replacement_fail(self): | STRING |
| LOW | .github/scripts/test-policy-checks.py | 114 | def test_files_the_documentation_uses_pass(self): | STRING |
| LOW | .github/scripts/test-policy-checks.py | 117 | def test_a_review_folder_fails_even_with_its_own_page(self): | STRING |
| LOW | .github/scripts/test-policy-checks.py | 138 | def test_code_and_ci_naming_an_asset_do_not_count_as_documentation(self): | STRING |
| LOW | .github/scripts/test-policy-checks.py | 150 | def test_a_capture_dumped_beside_the_site_fails(self): | STRING |
| LOW | .github/scripts/test-policy-checks.py | 154 | def test_review_named_media_fails_anywhere(self): | STRING |
| 1 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packaging/windows/test-msi.py | 184 | except FileNotFoundError: | CODE |
| HIGH | packaging/windows/test-msi.py | 192 | except FileNotFoundError: | CODE |
| HIGH | .github/scripts/ci-scope.py | 67 | except subprocess.CalledProcessError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/credentials.rs | 1440 | username: "dummy-user".into(), | CODE |
| LOW | src/session_reads.rs | 2125 | "dummy-user", | CODE |
| LOW | src/session_reads.rs | 2137 | assert_eq!(delta.info.user(), "dummy-user"); | CODE |
| LOW | src/http.rs | 359 | assert_eq!(username, b"dummy-user"); | CODE |
| LOW | src/http.rs | 391 | proxy_username: "dummy-user".into(), | CODE |
| LOW⚡ | src/settings.rs | 1604 | proxy_username: "dummy-user".into(), | CODE |
| LOW⚡ | src/settings.rs | 1614 | ("other.invalid", "8080", "dummy-user"), | CODE |
| LOW⚡ | src/settings.rs | 1615 | ("127.0.0.1", "8081", "dummy-user"), | CODE |
| LOW | src/zeroconf.rs | 862 | &librespot_core::authentication::Credentials::with_access_token("dummy-token") | CODE |
| LOW | src/ui/widgets.rs | 3620 | "dummy-user".into(), | CODE |
| LOW | src/soloist/mod.rs | 610 | value: "dummy-key".into() | CODE |
| LOW | src/soloist/mod.rs | 617 | value: "dummy-key".into() | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packaging/test-launchers.py | 73 | CODE | |
| LOW | packaging/windows/test-msi.py | 174 | CODE | |
| LOW | packaging/windows/build-msi.py | 94 | CODE | |
| LOW | .github/scripts/check-dependency-sources.py | 60 | CODE | |
| LOW | .github/scripts/check-new-settings.py | 29 | CODE | |
| LOW | .github/scripts/check-new-settings.py | 42 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packaging/macos/bundle.sh | 6 | # Set CODESIGN_IDENTITY to sign with a Developer ID; the default is an ad-hoc | COMMENT |