A beautiful, powerful, self-hosted ROM manager and player.
This report presents the forensic synthetic code analysis of rommapp/romm, a Python project with 12,345 GitHub stars. SynthScan v2.0 examined 367,261 lines of code across 1775 source files, recording 3550 pattern matches distributed across 18 syntactic categories. The overall adjusted score of 12.3 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 3550 distinct pattern matches across 18 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/vite.config.js | 79 | function cssTargetsFromBrowserslist() { | CODE |
| LOW | frontend/src/stores/soundtrackPlayer.ts | 60 | export function resolveSoundtrackGameArtwork( | CODE |
| LOW | frontend/src/utils/index.ts | 610 | export function areThreadsRequiredForEJSCore(core: string): boolean { | CODE |
| LOW | frontend/src/utils/index.ts | 667 | export function getControlSchemeForPlatform( | CODE |
| LOW | frontend/src/utils/index.ts | 683 | export function isRuffleEmulationSupported( | CODE |
| LOW | frontend/src/utils/indexdb-monitor.ts | 37 | export default async function createIndexedDBDiffMonitor({ | CODE |
| LOW | …end/src/v2/composables/useOverlayRouteDismiss/index.ts | 23 | export function installOverlayRouteDismiss(router: Router): () => void { | CODE |
| LOW | frontend/src/v2/composables/useCan/index.ts | 26 | export function installPermissionsHydration() { | CODE |
| LOW | frontend/src/v2/composables/useRomSync/index.ts | 129 | function refreshAfterUserStateChange() { | CODE |
| LOW | frontend/src/v2/composables/useBreakpoint/index.ts | 94 | export function installBreakpointAttribute(): void { | CODE |
| LOW | …ontend/src/v2/composables/usePlatformPlayable/index.ts | 80 | export function usePlatformPlayableChecker(): { | CODE |
| LOW | …ontend/src/v2/composables/useGalleryFilterUrl/index.ts | 337 | function setOrDelete(key: string, value: string | null) { | CODE |
| LOW | frontend/src/v2/composables/useGameActions/index.ts | 427 | async function removeFromContinuePlaying() { | CODE |
| LOW | frontend/src/v2/utils/smartCollectionCriteria.ts | 231 | export function hasAnySmartFilterCriteria(c: SmartFilterCriteria): boolean { | CODE |
| LOW | frontend/src/v2/utils/smartCollectionCriteria.ts | 536 | export function summarizeSmartFilterCriteria( | CODE |
| LOW | frontend/src/v2/utils/playerBezel.ts | 42 | export function resolveStoredBezelVisible(stored: string | null): boolean { | CODE |
| LOW | frontend/src/v2/components/GameDetails/ManualSubtab.vue | 135 | async function confirmFolderConversionIfNeeded(): Promise<boolean> { | CODE |
| LOW | …nd/src/v2/components/GameDetails/WalkthroughSubtab.vue | 119 | async function confirmFolderConversionIfNeeded(): Promise<boolean> { | CODE |
| LOW | frontend/src/v2/components/GameDetails/MediaTab.vue | 120 | async function confirmFolderConversionIfNeeded(): Promise<boolean> { | CODE |
| LOW | …nd/src/v2/components/GameDetails/ScreenshotsSubtab.vue | 73 | async function confirmFolderConversionIfNeeded(): Promise<boolean> { | CODE |
| LOW | frontend/src/v2/components/Dialogs/EditRomDialog.vue | 286 | function handleRomUpdateFromMetadata(updatedRom: UpdateRom) { | CODE |
| LOW | frontend/src/v2/views/Settings/UserInterface.vue | 198 | function onVirtualCollectionTypeChange(value: unknown) { | CODE |
| LOW | …ibraryManagement/Config/Dialog/CreateFolderMapping.vue | 190 | function getMappingTypeDescription(type: "alias" | "variant"): string { | CODE |
| LOW | frontend/src/components/Home/ContinuePlaying.vue | 24 | function toggleGridContinuePlaying() { | CODE |
| LOW | …nts/common/Collection/Dialog/CreateSmartCollection.vue | 109 | function toggleCollectionVisibility() { | CODE |
| LOW | frontend/src/components/common/Game/Dialog/EditRom.vue | 366 | function handleRomUpdateFromMetadata(updatedRom: UpdateRom) { | CODE |
| LOW | frontend/src/components/common/Dialog/SearchCover.vue | 29 | function handleShowSearchCoverDialog({ term }: { term: string }) { | CODE |
| LOW | frontend/src/views/Settings/MetadataSources.vue | 119 | function getConnectionStatusTooltip(source: { | CODE |
| LOW | …ntend/src/views/Gallery/Collection/SmartCollection.vue | 15 | function setCurrentSmartCollection(collection: CollectionType) { | CODE |
| LOW | …end/src/views/Gallery/Collection/VirtualCollection.vue | 15 | function setCurrentVirtualCollection(collection: CollectionType) { | CODE |
| LOW | frontend/src/views/Player/EmulatorJS/utils.ts | 157 | export function invalidateEmulatorJSRomCacheIfRenamed(rom: { | CODE |
| LOW | frontend/src/views/Player/EmulatorJS/utils.ts | 179 | function installDefaultOptionsFallback(emulator: any) { | CODE |
| LOW | frontend/src/views/Player/EmulatorJS/utils.ts | 239 | export function installEJSDefaultOptionsTrap() { | CODE |
| LOW | frontend/src/views/Player/EmulatorJS/utils.ts | 266 | function isIOSFullscreenShimRequired() { | CODE |
| LOW | frontend/src/views/Player/EmulatorJS/utils.ts | 389 | export function createExitEmulationButton(): HTMLButtonElement { | CODE |
| LOW | frontend/src/services/api/play-session.ts | 24 | function ingestPlaySessionsKeepalive({ | CODE |
| LOW | frontend/src/services/api/config.ts | 41 | async function deletePlatformVersionConfig({ fsSlug }: { fsSlug: string }) { | CODE |
| LOW | backend/startup.py | 57 | def _enqueue_recompute_save_hashes_if_needed() -> None: | CODE |
| LOW | backend/startup.py | 104 | def _enqueue_convert_images_to_webp() -> None: | CODE |
| LOW | backend/sync_watcher.py | 46 | def _extract_device_and_platform(path: str) -> tuple[str, str, str] | None: | CODE |
| LOW | backend/handler/scan_handler.py | 134 | def get_main_platform_igdb_id(platform: Platform): | CODE |
| LOW | backend/handler/scan_handler.py | 152 | def get_priority_ordered_metadata_sources( | CODE |
| LOW | backend/handler/scan_handler.py | 519 | async def fetch_playmatch_hash_match() -> PlaymatchRomMatch: | CODE |
| LOW | backend/handler/scan_handler.py | 548 | async def fetch_hasheous_hash_match() -> tuple[HasheousRom, bool]: | CODE |
| LOW | backend/handler/rom_conversion.py | 12 | async def promote_single_file_to_folder(rom: Rom) -> Rom: | CODE |
| LOW | backend/handler/database/devices_handler.py | 37 | def get_device_by_fingerprint( | CODE |
| LOW | backend/handler/database/devices_handler.py | 81 | def get_device_by_client_identifier( | CODE |
| LOW | backend/handler/database/devices_handler.py | 108 | def get_all_devices_by_sync_mode( | CODE |
| LOW | backend/handler/database/devices_handler.py | 149 | def update_last_seen_debounced( | CODE |
| LOW | backend/handler/database/roms_handler.py | 283 | def _filter_values_cache_version() -> str: | CODE |
| LOW | backend/handler/database/roms_handler.py | 287 | def _filter_values_cache_keys_key(version: str) -> str: | CODE |
| LOW | backend/handler/database/roms_handler.py | 668 | def _filter_by_virtual_collection_id( | CODE |
| LOW | backend/handler/database/roms_handler.py | 681 | def _filter_by_smart_collection_id( | CODE |
| LOW | backend/handler/database/roms_handler.py | 717 | def get_smart_collection_matches( | CODE |
| LOW | backend/handler/database/roms_handler.py | 744 | def _build_fulltext_boolean_query(self, term: str) -> str | None: | CODE |
| LOW | backend/handler/database/roms_handler.py | 750 | def _build_fulltext_relevance(self, search_term: str) -> str | None: | CODE |
| LOW | backend/handler/database/roms_handler.py | 939 | def _filter_by_missing_from_fs(self, query: Query, value: bool) -> Query: | CODE |
| LOW | backend/handler/database/roms_handler.py | 1166 | def _filter_by_metadata_providers( | CODE |
| LOW | backend/handler/database/roms_handler.py | 2336 | def get_rom_files_by_category( | CODE |
| LOW | backend/handler/database/roms_handler.py | 3050 | def invalidate_filter_values_cache(self) -> None: | CODE |
| 2426 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | frontend/src/stores/streaming.ts | 23 | // ── Store ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/stores/streaming.ts | 33 | // ── Actions ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …end/src/v2/composables/useGalleryVirtualItems/index.ts | 258 | // ── Structural sharing across re-packs ──────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/composables/useCoverAnimation/index.ts | 127 | // ── CD spin (+ launch drop) ─────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/composables/useCoverAnimation/index.ts | 201 | // ── Cartridge slot-in ───────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/composables/useCoverAnimation/index.ts | 213 | // ── Launch flourish (player view) ───────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/composables/useCoverAnimation/index.ts | 232 | // ── Hover video ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/composables/useCoverAnimation/index.ts | 277 | // ── Motion preference flips off mid-flight ──────────────────────── | COMMENT |
| MEDIUM | …ontend/src/v2/composables/useGalleryFilterUrl/index.ts | 145 | // ── URL → store ────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ontend/src/v2/composables/useGalleryFilterUrl/index.ts | 331 | // ── Store → URL ────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Settings/SettingsSection.vue | 7 | // ├─────────────────────────────────────────────────────┤ | COMMENT |
| MEDIUM | frontend/src/v2/components/Settings/SettingsSection.vue | 10 | // └─────────────────────────────────────────────────────┘ | COMMENT |
| MEDIUM | …ontend/src/v2/components/Settings/ScanPriorityList.vue | 80 | // ── Free-text entry (allow-custom only) ───────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Auth/SetupStepAdmin.vue | 58 | // ── Avatar picker ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Auth/SetupStepPlatforms.vue | 58 | // ── Detected platforms ───────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Auth/SetupStepPlatforms.vue | 110 | // ── Detected-pane filter ─────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Auth/SetupStepPlatforms.vue | 162 | // ── Supported (selectable) platforms ─────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Auth/SetupStepPlatforms.vue | 205 | // ── Search ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Auth/SetupStepPlatforms.vue | 225 | // ── Selection helpers ────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Auth/SetupStepPlatforms.vue | 304 | // ── Structure banner copy ────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/SettingsTab.vue | 46 | // ── Details edit form ────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/SettingsTab.vue | 131 | // ── Details (read-only) ──────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/FilterDrawer.vue | 124 | // ── Tri-state mapping helpers ────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/FilterDrawer.vue | 278 | // ── Multi-select sections ────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/FilterDrawer.vue | 427 | // ── Platform multi-select ────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/FilterDrawer.vue | 438 | // ── Active-filter count (footer badge) ──────────────────────── | COMMENT |
| MEDIUM | …nd/src/v2/components/Gallery/CollectionSettingsTab.vue | 78 | // ── Edit form state ───────────────────────────────────────────── | COMMENT |
| MEDIUM | …nd/src/v2/components/Gallery/CollectionSettingsTab.vue | 165 | // ── Cover preview ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nd/src/v2/components/Gallery/CollectionSettingsTab.vue | 204 | // ── Cover actions ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nd/src/v2/components/Gallery/CollectionSettingsTab.vue | 240 | // ── Save ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/GalleryShell.vue | 405 | // ── Toolbar two-layer state ───────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/GalleryShell.vue | 497 | // ── Viewport range / AlphaStrip / dwell prefetch ──────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/GalleryShell.vue | 527 | // ── Debug overlay bridge ──────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/GalleryShell.vue | 696 | // ── Search filter (debounced) ─────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/GalleryShell.vue | 715 | // ── List-mode sort ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/GalleryShell.vue | 742 | // ── Scroll restoration ───────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/GalleryShell.vue | 834 | // ── Slot helpers ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Gallery/FirmwareTab.vue | 88 | // ── Inline upload (no dialog — the dropzone lives in the tab) ────── | COMMENT |
| MEDIUM | frontend/src/v2/components/GameCard/GameCard.vue | 200 | // ── Cover hover / focus ───────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/shared/AssetList.stories.ts | 6 | // ── Mock builders ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/shared/AssetList.stories.ts | 69 | // ── Stories ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/shared/AssetStrip.stories.ts | 9 | // ── Mock builders ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/shared/AssetStrip.stories.ts | 94 | // ── Meta ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/shared/AssetStrip.stories.ts | 120 | // ── Stories ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/shared/IndexShell.vue | 56 | // ── Two-layer toolbar state ───────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/GameDetails/NotesTab.vue | 78 | // ── Selection (URL-synced via ?note=<id>) ──────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/GameDetails/NotesTab.vue | 143 | // ── Edit form ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Dialogs/EditRomDialog.vue | 108 | // ── Tabbed editing surface ─────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Player/AssetCard.stories.ts | 76 | // ── Save (no screenshot) ──────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Player/AssetCard.stories.ts | 90 | // ── Save without emulator chip ───────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Player/AssetCard.stories.ts | 105 | // ── State (with screenshot) ───────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Player/AssetCard.stories.ts | 119 | // ── State without a screenshot (placeholder pattern) ──────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Player/AssetCard.stories.ts | 139 | // ── Long filename — ellipsis path ────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/components/Player/AssetCard.stories.ts | 160 | // ── Grid layout (real picker context) ────────────────────────── | COMMENT |
| MEDIUM | …ontend/src/v2/components/Player/ResumePanel.stories.ts | 15 | // ── Fixture builders ───────────────────────────────────────────── | COMMENT |
| MEDIUM | …ontend/src/v2/components/Player/ResumePanel.stories.ts | 117 | // ── Meta ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ontend/src/v2/components/Player/ResumePanel.stories.ts | 295 | // ── Stories ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/lib/forms/RSlider/RSlider.stories.ts | 44 | // ── Defaults ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/lib/forms/RSlider/RSlider.stories.ts | 48 | // ── Value badges ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/v2/lib/forms/RSlider/RSlider.stories.ts | 65 | // ── Steps + ticks ────────────────────────────────────────────────── | COMMENT |
| 329 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/playwright.config.ts | 41 | }, | COMMENT |
| LOW | frontend/e2e/game-media-files.spec.ts | 1 | import { expect, type Locator, type Page, test } from "@playwright/test"; | COMMENT |
| LOW | …end/src/v2/composables/useGalleryVirtualItems/types.ts | 1 | // Discriminated union describing every kind of row that can live inside a | COMMENT |
| LOW | …end/src/v2/composables/useGalleryVirtualItems/index.ts | 1 | // useGalleryVirtualItems — turns the gallery's structural state (mode, | COMMENT |
| LOW | …end/src/v2/composables/useGalleryVirtualItems/index.ts | 21 | // * Structural sharing — unchanged item objects are reused from the previous | COMMENT |
| LOW | frontend/src/v2/composables/useWrapGridNav/index.ts | 1 | // useWrapGridNav | COMMENT |
| LOW | frontend/src/v2/composables/useSnackbar/index.ts | 1 | // useSnackbar — typed convenience wrapper around the global `snackbarShow` | COMMENT |
| LOW | frontend/src/v2/composables/useConfirm/index.ts | 1 | // useConfirm — open the global ConfirmDialog and await the user's choice. | COMMENT |
| LOW | frontend/src/v2/composables/useCoverAnimation/index.ts | 1 | // useCoverAnimation — the "juicy" motion layer for alt-art game covers. | COMMENT |
| LOW | …tend/src/v2/composables/useVirtualScrollDebug/index.ts | 1 | // useVirtualScrollDebug — shared diagnostics bridge from the active | COMMENT |
| LOW | frontend/src/v2/composables/useGamepad/index.ts | 1 | // useGamepad | COMMENT |
| LOW | frontend/src/v2/composables/useGamepad/index.ts | 21 | // Action buttons (A/B/Back/Start/LB/RB) fire once per press — no repeat — | COMMENT |
| LOW | frontend/src/v2/composables/useGamepad/index.ts | 181 | // `data-user-menu-trigger` so we can find it regardless of which view | COMMENT |
| LOW | …tend/src/v2/composables/useGalleryCoverRatios/index.ts | 1 | // useGalleryCoverRatios — the gallery's measured natural cover ratios. | COMMENT |
| LOW | …tend/src/v2/composables/useGalleryCoverRatios/index.ts | 21 | COMMENT | |
| LOW | …end/src/v2/composables/useOverlayRouteDismiss/index.ts | 1 | // useOverlayRouteDismiss: a route change takes the open overlays with it. | COMMENT |
| LOW | frontend/src/v2/composables/useReducedMotion/index.ts | 1 | // useReducedMotion — the single "reduce motion / effects" control. | COMMENT |
| LOW | frontend/src/v2/composables/useCan/index.ts | 1 | // useCan — reactive permission check against the v2 permissions store. | COMMENT |
| LOW | frontend/src/v2/composables/useGlobalHotkeys/index.ts | 1 | // useGlobalHotkeys — app-wide keyboard shortcuts. Kept intentionally | COMMENT |
| LOW | frontend/src/v2/composables/useCoverArt/index.ts | 1 | // useCoverArt — single source of truth for what image a game cover shows | COMMENT |
| LOW | frontend/src/v2/composables/useBoxFaces/index.ts | 1 | // useBoxFaces — resolves the three flat scans an interactive 3D box needs | COMMENT |
| LOW | …ontend/src/v2/composables/useServerConnection/index.ts | 1 | // useServerConnection — single orchestrator for backend reachability in v2. | COMMENT |
| LOW | frontend/src/v2/composables/useBreakpoint/index.ts | 1 | // useBreakpoint — reactive responsive breakpoints with the same names | COMMENT |
| LOW | frontend/src/v2/composables/useTileSearchUrl/index.ts | 1 | // useTileSearchUrl — bookmarkable per-view tile search backed by the | COMMENT |
| LOW | …ntend/src/v2/composables/useGalleryProvenance/index.ts | 1 | // useGalleryProvenance: did the user reach the details view by clicking | COMMENT |
| LOW | frontend/src/v2/composables/useCanPlay/index.ts | 1 | // useCanPlay — reactive "is this ROM playable in-browser?" check, shared | COMMENT |
| LOW | …ontend/src/v2/composables/usePlatformPlayable/index.ts | 1 | // usePlatformPlayable — reactive "can any ROM on this platform run | COMMENT |
| LOW | frontend/src/v2/composables/useSocketEvent/index.ts | 1 | // useSocketEvent — typed wrapper around the shared Socket.IO instance with | COMMENT |
| LOW | …ontend/src/v2/composables/useRightStickScroll/index.ts | 1 | // useRightStickScroll | COMMENT |
| LOW | frontend/src/v2/composables/useScanLifecycle/index.ts | 1 | // useScanLifecycle — global wire-up between the scan socket events and the | COMMENT |
| LOW | frontend/src/v2/composables/useGridNav/index.ts | 1 | // useGridNav | COMMENT |
| LOW | frontend/src/v2/composables/useGridNav/index.ts | 21 | // | COMMENT |
| LOW | …ontend/src/v2/composables/useGalleryFilterUrl/index.ts | 1 | // useGalleryFilterUrl — bookmarkable gallery filters via URL query | COMMENT |
| LOW | …ontend/src/v2/composables/useGalleryFilterUrl/index.ts | 21 | // ?filterSaves=true|false | COMMENT |
| LOW | frontend/src/v2/composables/useGameActions/index.ts | 1 | // useGameActions — shared action handlers for a ROM. One place for | COMMENT |
| LOW | frontend/src/v2/composables/useGalleryMode/index.ts | 1 | // useGalleryMode — global gallery-view preferences backed by localStorage. | COMMENT |
| LOW | frontend/src/v2/composables/useCrtMode/index.ts | 1 | // useCrtMode — singleton toggle for the cosmetic "CRT mode" shader. | COMMENT |
| LOW | frontend/src/v2/composables/usePlaySession/index.ts | 1 | // usePlaySession — records a single play session's wall-clock and ingests it | COMMENT |
| LOW | frontend/src/v2/composables/useWebpSupport/index.ts | 1 | // useWebpSupport — single-source resolution of whether the backend serves | COMMENT |
| LOW | frontend/src/v2/composables/useViewTransition/index.ts | 1 | // useViewTransition — tiny wrapper around the browser View Transitions API | COMMENT |
| LOW | frontend/src/v2/composables/useViewTransition/index.ts | 21 | // Graceful degradation: | COMMENT |
| LOW | frontend/src/v2/composables/useViewTransition/index.ts | 121 | return null; | COMMENT |
| LOW | …tend/src/v2/composables/useGalleryViewModeUrl/index.ts | 1 | // useGalleryViewModeUrl — bookmarkable view-mode (groupBy + layout) via | COMMENT |
| LOW | frontend/src/v2/composables/useScanProviders/index.ts | 1 | // useScanProviders: the provider + hash-matcher model shared by every | COMMENT |
| LOW | frontend/src/v2/composables/useCoverFilters/index.ts | 1 | // useCoverFilters — client-side filtering + sorting over the SGDB cover | COMMENT |
| LOW | …d/src/v2/composables/useGallerySelectionInput/index.ts | 1 | // useGallerySelectionInput — shared input plumbing that turns | COMMENT |
| LOW | …ntend/src/v2/composables/usePlatformIconCache/index.ts | 1 | // Singleton in-memory cache of platform icon SVGs as blob URLs. | COMMENT |
| LOW | frontend/src/v2/composables/useThemeMode/index.ts | 1 | // useThemeMode — reactive `isLight` / `isDark` driven by the same source | COMMENT |
| LOW | frontend/src/v2/stores/galleryRoms.ts | 1 | // galleryRoms (v2) — windowed/sparse store for the active gallery list. | COMMENT |
| LOW | frontend/src/v2/stores/galleryRoms.ts | 61 | // fewer requests but each one downloads more. | COMMENT |
| LOW | frontend/src/v2/stores/galleryRoms.ts | 121 | } | COMMENT |
| LOW | frontend/src/v2/stores/galleryRoms.ts | 521 | const params = this._buildRequestParams(galleryFilter, offset); | COMMENT |
| LOW | frontend/src/v2/stores/galleryRoms.ts | 561 | // aggregations (a window reached before the bootstrap resolved). | COMMENT |
| LOW | frontend/src/v2/stores/focusRestoration.ts | 1 | // focusRestoration (v2) — remembers each route's last focused tile so | COMMENT |
| LOW | frontend/src/v2/stores/scrollRestoration.ts | 1 | // scrollRestoration (v2) — remembers each route's last scrollTop on the | COMMENT |
| LOW | frontend/src/v2/stores/gallerySelection.ts | 1 | // v2GallerySelection — multi-select state for the gallery views | COMMENT |
| LOW | frontend/src/v2/stores/gallerySelection.ts | 21 | // "selection mode" is implicit (no separate flag) — first toggle | COMMENT |
| LOW | frontend/src/v2/utils/validation.ts | 1 | // Validation helpers for v2 forms. Each export returns a Vuetify-compatible | COMMENT |
| LOW | frontend/src/v2/utils/autofocus.ts | 1 | // Whether a search field should grab focus as soon as it appears (a dropdown | COMMENT |
| LOW | frontend/src/v2/utils/covers.ts | 1 | // Procedural "no cover" artwork — v2 port of v1's `utils/covers`. | COMMENT |
| 176 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/tests/handler/metadata/test_igdb_handler.py | 0 | a serial in the first two characters of the filename must still hit the serial index. regression: re.ignorecase was pass | STRING |
| HIGH | backend/tests/handler/metadata/test_moby_handler.py | 0 | a serial in the first two characters of the filename must still hit the serial index. regression: re.ignorecase was pass | STRING |
| HIGH | backend/tests/handler/metadata/test_ss_handler.py | 0 | a serial in the first two characters of the filename must still hit the serial index. regression: re.ignorecase was pass | STRING |
| HIGH | backend/tests/adapters/services/test_mobygames.py | 0 | test that the request reserves a rate-limiter slot before sending. | STRING |
| HIGH | …ckend/tests/adapters/services/test_retroachivements.py | 0 | test that the request reserves a rate-limiter slot before sending. | STRING |
| HIGH | backend/tests/adapters/services/test_igdb.py | 0 | test that the request reserves a rate-limiter slot before sending. | STRING |
| HIGH | backend/tests/adapters/services/test_mobygames.py | 0 | integration tests with real api calls using vcr cassettes. | STRING |
| HIGH | backend/tests/adapters/services/test_steamgriddb.py | 0 | integration tests with real api calls using vcr cassettes. | STRING |
| HIGH | backend/tests/adapters/services/test_screenscraper.py | 0 | integration tests with real api calls using vcr cassettes. | STRING |
| HIGH | backend/alembic/versions/0045_roms_metadata_update.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( (r.ma | STRING |
| HIGH | backend/alembic/versions/0074_fix_empty_json_arrays.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( (r.ma | STRING |
| HIGH | …kend/alembic/versions/0052_roms_metadata_flashpoint.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( (r.ma | STRING |
| HIGH | …nd/alembic/versions/0063_roms_metadata_player_count.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( (r.ma | STRING |
| HIGH | …nd/alembic/versions/0098_generated_metadata_columns.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( (r.ma | STRING |
| HIGH | backend/alembic/versions/0061_manual_metadata.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( (r.ma | STRING |
| HIGH | backend/alembic/versions/0070_ss_age_ratings.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( (r.ma | STRING |
| HIGH | …ckend/alembic/versions/0058_roms_metadata_launchbox.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( (r.ma | STRING |
| HIGH | backend/alembic/versions/0045_roms_metadata_update.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( json_ | STRING |
| HIGH | backend/alembic/versions/0074_fix_empty_json_arrays.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( json_ | STRING |
| HIGH | …kend/alembic/versions/0052_roms_metadata_flashpoint.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( json_ | STRING |
| HIGH | …nd/alembic/versions/0063_roms_metadata_player_count.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( json_ | STRING |
| HIGH | …nd/alembic/versions/0098_generated_metadata_columns.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( json_ | STRING |
| HIGH | backend/alembic/versions/0061_manual_metadata.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( json_ | STRING |
| HIGH | backend/alembic/versions/0070_ss_age_ratings.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( json_ | STRING |
| HIGH | …ckend/alembic/versions/0058_roms_metadata_launchbox.py | 0 | create or replace view roms_metadata as select r.id as rom_id, now() as created_at, now() as updated_at, coalesce( json_ | STRING |
| HIGH | …nd/alembic/versions/0073_sibling_roms_metadata_only.py | 0 | create or replace view sibling_roms as select r1.id as rom_id, r2.id as sibling_rom_id, r1.platform_id as platform_id, n | STRING |
| HIGH | backend/alembic/versions/0048_sibling_roms_more_ids.py | 0 | create or replace view sibling_roms as select r1.id as rom_id, r2.id as sibling_rom_id, r1.platform_id as platform_id, n | STRING |
| HIGH | backend/alembic/versions/0069_sibling_roms_fs_name.py | 0 | create or replace view sibling_roms as select r1.id as rom_id, r2.id as sibling_rom_id, r1.platform_id as platform_id, n | STRING |
| HIGH | backend/alembic/versions/0071_sibling_roms_fs_name.py | 0 | create or replace view sibling_roms as select r1.id as rom_id, r2.id as sibling_rom_id, r1.platform_id as platform_id, n | STRING |
| HIGH | …kend/alembic/versions/0038_add_ssid_to_sibling_roms.py | 0 | create view sibling_roms as select r1.id as rom_id, r2.id as sibling_rom_id, r1.platform_id as platform_id, now() as cre | STRING |
| HIGH | backend/alembic/versions/0024_sibling_roms_db_view.py | 0 | create view sibling_roms as select r1.id as rom_id, r2.id as sibling_rom_id, r1.platform_id as platform_id, now() as cre | STRING |
| HIGH | backend/alembic/versions/0048_sibling_roms_more_ids.py | 0 | create view sibling_roms as select r1.id as rom_id, r2.id as sibling_rom_id, r1.platform_id as platform_id, now() as cre | STRING |
| HIGH | …ckend/alembic/versions/0101_virtual_collection_roms.py | 0 | create or replace view virtual_collections as with base as ( select r.id as rom_id, r.path_cover_s as path_cover_s, r.pa | STRING |
| HIGH | …ckend/alembic/versions/0096_fix_virtual_collections.py | 0 | create or replace view virtual_collections as with base as ( select r.id as rom_id, r.path_cover_s as path_cover_s, r.pa | STRING |
| HIGH | …nd/alembic/versions/0095_virtual_collections_source.py | 0 | create or replace view virtual_collections as with base as ( select r.id as rom_id, r.path_cover_s as path_cover_s, r.pa | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/startup.py | 66 | except Exception: | CODE |
| LOW | backend/startup.py | 98 | except Exception: | CODE |
| LOW | backend/startup.py | 130 | except Exception: | CODE |
| LOW | backend/sync_watcher.py | 167 | except Exception: | CODE |
| LOW | backend/handler/rom_conversion.py | 63 | except Exception: | CODE |
| LOW | backend/handler/rom_conversion.py | 66 | except Exception: | CODE |
| LOW | backend/handler/walkthrough/gamefaqs.py | 172 | except Exception as exc: | CODE |
| LOW | backend/handler/walkthrough/gamefaqs.py | 194 | except Exception as exc: | CODE |
| LOW | backend/handler/filesystem/assets_handler.py | 169 | except Exception as e: | CODE |
| LOW | backend/handler/filesystem/resources_handler.py | 200 | except Exception as exc: | CODE |
| LOW | backend/handler/filesystem/resources_handler.py | 430 | except Exception as exc: | CODE |
| LOW | backend/handler/filesystem/resources_handler.py | 552 | except Exception as exc: | CODE |
| LOW | backend/handler/filesystem/resources_handler.py | 706 | except Exception as exc: | CODE |
| LOW | backend/handler/metadata/flashpoint_handler.py | 164 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/flashpoint_handler.py | 219 | except Exception as exc: | CODE |
| LOW | backend/handler/metadata/flashpoint_handler.py | 414 | except Exception as exc: | CODE |
| LOW | backend/handler/metadata/upc_handler.py | 63 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/hltb_handler.py | 332 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/hltb_handler.py | 358 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/hltb_handler.py | 371 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/hltb_handler.py | 537 | except Exception as exc: | CODE |
| LOW | backend/handler/metadata/hltb_handler.py | 824 | except Exception as exc: | CODE |
| LOW | backend/handler/metadata/ra_handler.py | 147 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/ss_handler.py | 752 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/moby_handler.py | 90 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/sgdb_handler.py | 51 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/sgdb_handler.py | 85 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/sgdb_handler.py | 167 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/libretro_handler.py | 81 | except Exception as exc: | CODE |
| MEDIUM | backend/handler/metadata/libretro_handler.py | 78 | def heartbeat(self) -> bool: | CODE |
| LOW | backend/handler/metadata/hasheous_handler.py | 160 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/hasheous_handler.py | 315 | except Exception as exc: | CODE |
| LOW | backend/handler/metadata/gamelist_handler.py | 506 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/playmatch_handler.py | 147 | except Exception as e: | CODE |
| LOW | backend/handler/metadata/playmatch_handler.py | 257 | except Exception as exc: | CODE |
| LOW | backend/handler/metadata/playmatch_handler.py | 347 | except Exception: | CODE |
| LOW | backend/handler/metadata/igdb_handler.py | 726 | except Exception as e: | CODE |
| LOW | backend/tasks/tasks.py | 31 | except Exception as e: | CODE |
| LOW | backend/tasks/sync_push_pull_task.py | 107 | except Exception as e: | CODE |
| LOW | backend/tasks/sync_push_pull_task.py | 161 | except Exception: | CODE |
| LOW | backend/tasks/sync_push_pull_task.py | 183 | except Exception as e: | CODE |
| LOW | backend/tasks/sync_push_pull_task.py | 409 | except Exception: | CODE |
| LOW | backend/tasks/manual/cleanup_missing_roms.py | 72 | except Exception as e: | CODE |
| LOW | backend/tasks/manual/recompute_save_content_hashes.py | 94 | except Exception as e: | CODE |
| LOW | backend/tasks/manual/recompute_save_content_hashes.py | 120 | except Exception as e: | CODE |
| LOW | backend/tasks/scheduled/convert_images_to_webp.py | 83 | except Exception as exc: | CODE |
| LOW | backend/tasks/scheduled/convert_images_to_webp.py | 181 | except Exception as exc: | CODE |
| LOW | backend/tasks/scheduled/cleanup_orphaned_resources.py | 174 | except Exception as e: | CODE |
| LOW | backend/tasks/scheduled/cleanup_orphaned_resources.py | 194 | except Exception as e: | CODE |
| LOW | …end/tasks/scheduled/sync_retroachievements_progress.py | 129 | except Exception as e: | CODE |
| LOW | backend/tools/generate_test_data.py | 773 | except Exception: | CODE |
| LOW⚡ | backend/tools/xml_diagnostics.py | 57 | except Exception as e: | CODE |
| MEDIUM⚡ | backend/tools/xml_diagnostics.py | 58 | print(f"Error reading file: {e}") | CODE |
| LOW⚡ | backend/tools/xml_diagnostics.py | 68 | except Exception as e: | CODE |
| LOW | backend/tools/xml_diagnostics.py | 88 | except Exception as context_error: | CODE |
| LOW | backend/endpoints/auth.py | 97 | except Exception: | CODE |
| LOW | backend/endpoints/tasks.py | 350 | except Exception as e: | CODE |
| LOW | backend/endpoints/firmware.py | 315 | except Exception as e: | CODE |
| LOW | backend/endpoints/device.py | 127 | except Exception: | CODE |
| LOW | backend/endpoints/activity.py | 121 | except Exception as e: # noqa: BLE001 | CODE |
| 55 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | entrypoint.sh | 22 | # Define a signal handler to propagate termination signals | COMMENT |
| MEDIUM | backend/sync_watcher.py | 137 | # Create a sync session | COMMENT |
| MEDIUM | backend/handler/database/roms_handler.py | 1420 | # Create a subquery that identifies the primary ROM in each group. | COMMENT |
| MEDIUM | backend/handler/metadata/gamelist_handler.py | 268 | # Create a copy of the metadata to avoid modifying the cached version | COMMENT |
| MEDIUM | backend/endpoints/sync.py | 156 | # Create a new sync session | COMMENT |
| MEDIUM | backend/endpoints/sync.py | 462 | # Create a session and enqueue the job | COMMENT |
| MEDIUM | backend/tests/handler/auth/test_session_middleware.py | 198 | # Create a session | COMMENT |
| MEDIUM | backend/tests/handler/auth/test_session_middleware.py | 328 | # Create a session | COMMENT |
| MEDIUM⚡ | backend/tests/handler/filesystem/test_base_handler.py | 239 | # Create a file first | COMMENT |
| MEDIUM | backend/tests/handler/filesystem/test_base_handler.py | 254 | # Create a file (should not be listed) | COMMENT |
| MEDIUM | backend/tests/handler/filesystem/test_roms_handler.py | 455 | # Create the test file | COMMENT |
| MEDIUM | backend/tests/handler/filesystem/test_roms_handler.py | 676 | # Create a test file to rename | COMMENT |
| MEDIUM | backend/tests/handler/filesystem/test_roms_handler.py | 836 | # Create a test file with known content for hash verification | COMMENT |
| MEDIUM | backend/tests/handler/filesystem/test_roms_handler.py | 934 | # Create a mock CHD v5 file in a temporary directory | COMMENT |
| MEDIUM | backend/tests/handler/filesystem/test_roms_handler.py | 950 | # Create a new handler instance with temp base path | COMMENT |
| MEDIUM | backend/tests/handler/filesystem/test_roms_handler.py | 1266 | # Create a CHD v4 file (should not use internal hash logic) | COMMENT |
| MEDIUM | …end/tests/handler/filesystem/test_resources_handler.py | 228 | # Create a mock image with high resolution | COMMENT |
| MEDIUM | …end/tests/handler/filesystem/test_resources_handler.py | 246 | # Create a mock image with low resolution | COMMENT |
| MEDIUM | backend/tests/tasks/test_update_switch_titledb.py | 150 | # Create a large dataset to test batching | COMMENT |
| MEDIUM | backend/tests/tasks/test_tasks.py | 282 | # Create a proper HTTPStatusError | COMMENT |
| MEDIUM | backend/tests/tasks/test_update_launchbox_metadata.py | 138 | # Create a mock pipeline with async context manager support | COMMENT |
| MEDIUM | backend/tests/tasks/test_update_launchbox_metadata.py | 234 | # Create a mock pipeline with async context manager support | COMMENT |
| MEDIUM | backend/tests/tasks/test_update_launchbox_metadata.py | 273 | # Create a mock pipeline with async context manager support | COMMENT |
| MEDIUM | backend/tests/tasks/test_update_launchbox_metadata.py | 324 | # Create a mock pipeline with async context manager support | COMMENT |
| MEDIUM | backend/tests/tasks/test_sync_push_pull.py | 157 | # Create an additional archival (null-slot) save with the same filename | COMMENT |
| MEDIUM⚡ | backend/tests/endpoints/test_tasks.py | 193 | # Create a token without TASKS_RUN scope | COMMENT |
| MEDIUM | backend/tests/adapters/services/test_mobygames.py | 28 | # Create a real request-like object | COMMENT |
| MEDIUM | backend/tests/adapters/services/test_steamgriddb.py | 30 | # Create a real request-like object | COMMENT |
| MEDIUM | …ckend/tests/adapters/services/test_retroachivements.py | 23 | # Create a real request-like object | COMMENT |
| MEDIUM | backend/tests/adapters/services/test_screenscraper.py | 87 | # Create a real request-like object | COMMENT |
| MEDIUM | backend/models/rom.py | 842 | # Create a deep copy to avoid mutating the original metadata | COMMENT |
| MEDIUM | backend/models/collection.py | 156 | # Create a reversible encoded ID | COMMENT |
| MEDIUM⚡ | backend/alembic/versions/0022_collections_.py | 36 | # Define the path for the new folder | COMMENT |
| MEDIUM⚡ | backend/alembic/versions/0022_collections_.py | 39 | # Create the new folder if it doesn't exist | COMMENT |
| MEDIUM | backend/alembic/versions/0057_multi_notes.py | 23 | # Create the new rom_notes table | COMMENT |
| MEDIUM | backend/alembic/versions/0047_smart_collections.py | 24 | # Create the smart collections table | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/main.py | 16 | CODE | |
| LOW | backend/main.py | 17 | CODE | |
| LOW | backend/main.py | 18 | CODE | |
| LOW | backend/main.py | 19 | CODE | |
| LOW | backend/main.py | 20 | CODE | |
| LOW | backend/handler/activity_handler.py | 9 | CODE | |
| LOW | backend/handler/database/stats_handler.py | 1 | CODE | |
| LOW | backend/handler/auth/permissions_map.py | 19 | CODE | |
| LOW | backend/handler/auth/permissions.py | 12 | CODE | |
| LOW | backend/handler/auth/dependencies.py | 16 | CODE | |
| LOW | backend/handler/walkthrough/gamefaqs.py | 10 | CODE | |
| LOW | backend/handler/walkthrough/__init__.py | 1 | CODE | |
| LOW | backend/handler/walkthrough/__init__.py | 1 | CODE | |
| LOW | backend/handler/walkthrough/__init__.py | 1 | CODE | |
| LOW | backend/handler/walkthrough/__init__.py | 1 | CODE | |
| LOW | backend/handler/walkthrough/__init__.py | 1 | CODE | |
| LOW | backend/handler/filesystem/__init__.py | 3 | CODE | |
| LOW | backend/handler/filesystem/__init__.py | 3 | CODE | |
| LOW | backend/handler/filesystem/__init__.py | 7 | CODE | |
| LOW | backend/handler/filesystem/__init__.py | 7 | CODE | |
| LOW | backend/handler/sync/comparison.py | 1 | CODE | |
| LOW | backend/handler/sync/ssh_handler.py | 12 | CODE | |
| LOW | backend/handler/metadata/launchbox_handler/media.py | 12 | CODE | |
| LOW | backend/handler/metadata/launchbox_handler/__init__.py | 1 | CODE | |
| LOW | backend/tools/generate_test_data.py | 18 | CODE | |
| LOW | backend/tools/generate_test_data.py | 35 | CODE | |
| LOW | backend/endpoints/sockets/activity.py | 17 | CODE | |
| LOW | backend/endpoints/sockets/scan.py | 1 | CODE | |
| LOW | backend/endpoints/responses/rom.py | 1 | CODE | |
| LOW | backend/endpoints/responses/permission.py | 12 | CODE | |
| LOW | backend/endpoints/responses/music.py | 1 | CODE | |
| LOW | backend/endpoints/responses/collection.py | 6 | CODE | |
| LOW | backend/endpoints/responses/collection.py | 6 | CODE | |
| LOW | backend/utils/zip_cache.py | 1 | CODE | |
| LOW | backend/utils/archives.py | 19 | CODE | |
| LOW | backend/utils/m3u.py | 1 | CODE | |
| LOW | backend/utils/media_types.py | 1 | CODE | |
| LOW | backend/utils/json_module.py | 11 | CODE | |
| LOW | backend/utils/ssrf.py | 25 | CODE | |
| LOW | backend/utils/audio_tags.py | 1 | CODE | |
| LOW | backend/utils/rom_patcher/__init__.py | 1 | CODE | |
| LOW | backend/utils/rom_patcher/__init__.py | 1 | CODE | |
| LOW | backend/utils/rom_patcher/__init__.py | 1 | CODE | |
| LOW | backend/utils/rom_patcher/__init__.py | 1 | CODE | |
| LOW | backend/models/rom.py | 1 | CODE | |
| LOW | backend/models/user.py | 1 | CODE | |
| LOW | backend/models/user.py | 18 | CODE | |
| LOW | backend/models/user.py | 19 | CODE | |
| LOW | backend/models/user.py | 20 | CODE | |
| LOW | backend/models/user.py | 21 | CODE | |
| LOW | backend/models/user.py | 22 | CODE | |
| LOW | backend/models/permission.py | 1 | CODE | |
| LOW | backend/models/firmware.py | 1 | CODE | |
| LOW | backend/models/device.py | 1 | CODE | |
| LOW | backend/models/play_session.py | 1 | CODE | |
| LOW | backend/models/platform.py | 1 | CODE | |
| LOW | backend/models/music.py | 1 | CODE | |
| LOW | backend/models/music.py | 11 | CODE | |
| LOW | backend/models/assets.py | 1 | CODE | |
| LOW | backend/models/client_token.py | 1 | CODE | |
| 20 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/src/locales/check_i18n_sorted.py | 31 | CODE | |
| LOW | backend/sync_watcher.py | 206 | CODE | |
| LOW | backend/handler/scan_handler.py | 226 | CODE | |
| LOW | backend/handler/scan_handler.py | 432 | CODE | |
| LOW | backend/handler/database/roms_handler.py | 1078 | CODE | |
| LOW | backend/handler/database/roms_handler.py | 1572 | CODE | |
| LOW | backend/handler/database/collections_handler.py | 171 | CODE | |
| LOW | backend/handler/auth/hybrid_auth.py | 21 | CODE | |
| LOW | …nd/handler/auth/middleware/redis_session_middleware.py | 39 | CODE | |
| LOW | …nd/handler/auth/middleware/redis_session_middleware.py | 61 | CODE | |
| LOW | backend/handler/filesystem/resources_handler.py | 178 | CODE | |
| LOW | backend/handler/filesystem/resources_handler.py | 410 | CODE | |
| LOW | backend/handler/filesystem/resources_handler.py | 538 | CODE | |
| LOW | backend/handler/filesystem/resources_handler.py | 686 | CODE | |
| LOW | backend/handler/filesystem/roms_handler.py | 336 | CODE | |
| LOW | backend/handler/filesystem/roms_handler.py | 628 | CODE | |
| LOW | backend/handler/filesystem/base_handler.py | 248 | CODE | |
| LOW | backend/handler/filesystem/base_handler.py | 427 | CODE | |
| LOW | backend/handler/sync/ssh_handler.py | 128 | CODE | |
| LOW | backend/handler/metadata/hltb_handler.py | 377 | CODE | |
| LOW | backend/handler/metadata/ra_handler.py | 312 | CODE | |
| LOW | backend/handler/metadata/ss_handler.py | 354 | CODE | |
| LOW | backend/handler/metadata/sgdb_handler.py | 113 | CODE | |
| LOW | backend/handler/metadata/hasheous_handler.py | 249 | CODE | |
| LOW | backend/handler/metadata/launchbox_handler/media.py | 185 | CODE | |
| LOW | backend/handler/metadata/launchbox_handler/media.py | 269 | CODE | |
| LOW | backend/handler/metadata/launchbox_handler/media.py | 328 | CODE | |
| LOW | backend/handler/metadata/launchbox_handler/media.py | 370 | CODE | |
| LOW | backend/handler/metadata/launchbox_handler/media.py | 431 | CODE | |
| LOW | backend/handler/metadata/launchbox_handler/media.py | 218 | CODE | |
| LOW | backend/handler/metadata/launchbox_handler/handler.py | 72 | CODE | |
| LOW | …end/handler/metadata/launchbox_handler/local_source.py | 17 | CODE | |
| LOW | backend/tasks/sync_push_pull_task.py | 66 | CODE | |
| LOW | backend/tasks/sync_push_pull_task.py | 342 | CODE | |
| LOW | backend/tasks/scheduled/update_launchbox_metadata.py | 118 | CODE | |
| LOW | backend/tasks/scheduled/cleanup_orphaned_resources.py | 99 | CODE | |
| LOW | backend/tools/generate_test_data.py | 676 | CODE | |
| LOW | backend/tools/xml_diagnostics.py | 38 | CODE | |
| LOW | backend/endpoints/firmware.py | 263 | CODE | |
| LOW | backend/endpoints/feeds.py | 201 | CODE | |
| LOW | backend/endpoints/feeds.py | 222 | CODE | |
| LOW | backend/endpoints/collections.py | 431 | CODE | |
| LOW | backend/endpoints/saves.py | 161 | CODE | |
| LOW | backend/endpoints/heartbeat.py | 189 | CODE | |
| LOW | backend/endpoints/sockets/logs.py | 80 | CODE | |
| LOW | backend/endpoints/sockets/scan.py | 201 | CODE | |
| LOW | backend/endpoints/sockets/scan.py | 709 | CODE | |
| LOW | backend/endpoints/sockets/scan.py | 928 | CODE | |
| LOW | backend/endpoints/roms/upload.py | 248 | CODE | |
| LOW | backend/endpoints/roms/__init__.py | 1474 | CODE | |
| LOW | backend/endpoints/roms/__init__.py | 2271 | CODE | |
| LOW | backend/config/config_manager.py | 578 | CODE | |
| LOW | backend/tests/conftest.py | 43 | CODE | |
| LOW | backend/tests/utils/test_pegasus_exporter.py | 45 | CODE | |
| LOW | backend/tests/utils/test_rvz_hasher.py | 353 | CODE | |
| LOW | backend/tests/adapters/services/test_screenscraper.py | 996 | CODE | |
| LOW | backend/utils/psp_hasher.py | 65 | CODE | |
| LOW | backend/utils/gamelist_exporter.py | 113 | CODE | |
| LOW | backend/utils/archives.py | 95 | CODE | |
| LOW | backend/utils/archives.py | 109 | CODE | |
| 12 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/handler/filesystem/base_handler.py | 379 | List all directories in a given path. Args: path: Relative path within base directory | STRING |
| HIGH | backend/handler/filesystem/base_handler.py | 482 | Write file to filesystem using a streamed approach. The stream lands in a temporary file that is renam | STRING |
| HIGH | backend/handler/filesystem/base_handler.py | 523 | Read file from filesystem. Args: file_path: Relative path to the file Returns: | STRING |
| HIGH | backend/handler/filesystem/base_handler.py | 551 | Stream file from filesystem. Args: file_path: Relative path to the file Returns: | STRING |
| HIGH | backend/handler/filesystem/base_handler.py | 680 | List all files in a directory. Args: directory: Relative path to the directory Re | STRING |
| HIGH | backend/handler/filesystem/base_handler.py | 749 | Get the size of a file. Args: file_path: Relative path to the file Returns: | STRING |
| HIGH | backend/endpoints/auth.py | 111 | OAuth2 token endpoint Args: form_data (Annotated[OAuth2RequestForm, Depends): Form Data with OAuth2 info | STRING |
| HIGH | backend/endpoints/auth.py | 245 | OIDC login endpoint Args: request (Request): Fastapi Request object Raises: OIDCDisabledExcept | STRING |
| HIGH | backend/endpoints/auth.py | 269 | OIDC callback endpoint Args: request (Request): Fastapi Request object Raises: OIDCDisabledExc | STRING |
| HIGH | backend/endpoints/user.py | 343 | Update user endpoint Args: request (Request): Fastapi Requests object user_id (int): User internal | STRING |
| HIGH | backend/endpoints/firmware.py | 39 | Upload firmware files endpoint Args: request (Request): Fastapi Request object platform_slug (str): | STRING |
| HIGH | backend/utils/filesystem.py | 95 | Replace invalid characters in the filename to make it valid across common filesystems and prevent path-traversa | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/handler/scan_handler.py | 462 | # Check if files have been parsed and hashed | COMMENT |
| LOW⚡ | backend/handler/auth/hybrid_auth.py | 24 | # Check if session key already stored in cache | COMMENT |
| LOW⚡ | backend/handler/auth/hybrid_auth.py | 30 | # Check if Authorization header exists | COMMENT |
| LOW⚡ | backend/handler/auth/hybrid_auth.py | 38 | # Check if basic auth header is valid | COMMENT |
| LOW | backend/handler/auth/hybrid_auth.py | 53 | # Check if bearer auth header is valid | COMMENT |
| LOW | backend/handler/auth/hybrid_auth.py | 104 | # Check if we're in KIOSK_MODE | COMMENT |
| LOW | backend/handler/filesystem/resources_handler.py | 217 | # Check if content is gzipped from response headers | COMMENT |
| LOW | backend/handler/filesystem/resources_handler.py | 448 | # Check if content is gzipped from response headers | COMMENT |
| LOW | backend/handler/filesystem/resources_handler.py | 576 | # Check if content is gzipped from response headers | COMMENT |
| LOW | backend/handler/filesystem/roms_handler.py | 365 | # Check if rom is a multi-part rom | COMMENT |
| LOW⚡ | backend/handler/filesystem/roms_handler.py | 396 | # Check if file is excluded by extension. | COMMENT |
| LOW⚡ | backend/handler/filesystem/roms_handler.py | 403 | # Check if the file name matches a pattern in the excluded list. | COMMENT |
| LOW⚡ | backend/handler/filesystem/roms_handler.py | 410 | # Check if this is a top-level file (not in a subdirectory) | COMMENT |
| LOW | backend/handler/filesystem/base_handler.py | 346 | # Check if the file name matches a pattern in the excluded list. | COMMENT |
| LOW | backend/handler/filesystem/base_handler.py | 461 | # Write file atomically | COMMENT |
| LOW | backend/handler/metadata/flashpoint_handler.py | 253 | # Check if the filename is a UUID | COMMENT |
| LOW | backend/handler/metadata/hasheous_handler.py | 209 | # Check if its a 404 error | COMMENT |
| LOW | backend/handler/metadata/gamelist_handler.py | 406 | # Check if we already have cached data for this platform | COMMENT |
| LOW | backend/handler/metadata/launchbox_handler/handler.py | 175 | # Check if game is scummvm shortname | COMMENT |
| LOW | backend/tasks/sync_push_pull_task.py | 383 | # Check if device has synced this before (intentional delete) | COMMENT |
| LOW | backend/tasks/scheduled/cleanup_orphaned_resources.py | 161 | # Check if platform exists in database | COMMENT |
| LOW | backend/tasks/scheduled/cleanup_orphaned_resources.py | 183 | # Check if ROM exists in database | COMMENT |
| LOW | backend/endpoints/auth.py | 208 | # Check if user has access to requested scopes | COMMENT |
| LOW | backend/endpoints/roms/__init__.py | 1143 | # Check if all requested ROMs were found | COMMENT |
| LOW | backend/endpoints/roms/__init__.py | 1576 | # Write file to ZIP | COMMENT |
| LOW | backend/logger/formatter.py | 110 | # Check if an explicit environment variable is set to control color behavior | COMMENT |
| LOW | backend/config/config_manager.py | 261 | # Check if the config file is mounted | COMMENT |
| LOW⚡ | backend/tests/handler/filesystem/test_base_handler.py | 340 | # Write file first | COMMENT |
| LOW⚡ | backend/tests/handler/filesystem/test_base_handler.py | 343 | # Read file | COMMENT |
| LOW⚡ | backend/tests/handler/filesystem/test_base_handler.py | 354 | # Write file first | COMMENT |
| LOW⚡ | backend/tests/handler/filesystem/test_base_handler.py | 402 | # Write file first | COMMENT |
| LOW | backend/utils/validation.py | 34 | # Check if any character is outside ASCII range (0-127) | COMMENT |
| LOW⚡ | backend/alembic/versions/0022_collections_.py | 46 | # Check if the item is a directory and not the new folder itself | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/handler/database/roms_handler.py | 1200 | CODE | |
| LOW | backend/handler/database/roms_handler.py | 2494 | CODE | |
| LOW | backend/handler/database/roms_handler.py | 2543 | CODE | |
| LOW | backend/handler/database/roms_handler.py | 2654 | CODE | |
| LOW | backend/handler/database/roms_handler.py | 2868 | CODE | |
| LOW | backend/handler/database/saves_handler.py | 84 | CODE | |
| LOW | backend/handler/auth/middleware/csrf_middleware.py | 20 | CODE | |
| LOW | backend/endpoints/music.py | 62 | CODE | |
| LOW | backend/endpoints/music.py | 116 | CODE | |
| LOW | backend/endpoints/music.py | 225 | CODE | |
| LOW | backend/endpoints/music.py | 255 | CODE | |
| LOW | backend/endpoints/music.py | 285 | CODE | |
| LOW | backend/endpoints/music.py | 315 | CODE | |
| LOW | backend/endpoints/saves.py | 161 | CODE | |
| LOW | backend/endpoints/roms/__init__.py | 268 | CODE | |
| LOW | backend/endpoints/roms/__init__.py | 361 | CODE | |
| LOW | backend/endpoints/roms/__init__.py | 1211 | CODE | |
| LOW | backend/tests/endpoints/roms/test_upload.py | 65 | CODE | |
| LOW | backend/adapters/services/retroachievements.py | 129 | CODE | |
| LOW | backend/adapters/services/steamgriddb.py | 80 | CODE | |
| LOW | backend/adapters/services/steamgriddb.py | 133 | CODE | |
| LOW | backend/adapters/services/mobygames.py | 158 | CODE | |
| LOW | backend/adapters/services/mobygames.py | 171 | CODE | |
| LOW | backend/adapters/services/screenscraper.py | 712 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/handler/auth/middleware/session_middleware.py | 136 | "null; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT;", | CODE |
| HIGH | …nd/handler/auth/middleware/redis_session_middleware.py | 91 | header_value = f"{self.session_cookie}=null; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT; {self.se | CODE |
| HIGH | backend/endpoints/roms/__init__.py | 384 | " sized; total then comes back null, unless the rom id index is" | CODE |
| HIGH | backend/tests/handler/database/test_saves_handler.py | 601 | wins (and is implicitly not-null), so slot_not_null=True is a no-op | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/handler/activity_handler.py | 50 | async def set_active(self, entry: ActivityEntry) -> None: | CODE |
| LOW | backend/handler/auth/base_handler.py | 169 | async def set_user_new_password(self, user: Any, new_password: str) -> None: | CODE |
| LOW | backend/handler/walkthrough/__init__.py | 9 | __all__ = [ | CODE |
| LOW | backend/handler/filesystem/__init__.py | 15 | __all__ = [ | CODE |
| LOW | backend/handler/metadata/launchbox_handler/__init__.py | 3 | __all__ = [ | CODE |
| LOW | backend/tasks/tasks.py | 24 | def update_job_meta(metadata: dict[str, Any]) -> None: | CODE |
| LOW | backend/endpoints/configs.py | 254 | async def update_scan_settings(request: Request, payload: ScanSettingsPayload) -> None: | CODE |
| LOW | backend/config/config_manager.py | 852 | def _update_config_file(self) -> None: | CODE |
| LOW | …ckend/tests/handler/database/test_roms_filter_cache.py | 51 | def _set_rom_genres(rom_id: int, genres: list[str]) -> None: | CODE |
| LOW | backend/utils/rate_limiter.py | 23 | def set_requests_per_second(self, requests_per_second: float) -> None: | CODE |
| LOW | backend/utils/rate_limiter.py | 75 | def set_max_concurrency(self, max_concurrency: int) -> None: | CODE |
| LOW | backend/utils/rom_patcher/__init__.py | 8 | __all__ = [ | CODE |
| LOW | backend/adapters/services/screenscraper.py | 459 | def _update_account_limits(response: dict) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/src/v2/components/shared/PlatformSelect.vue | 191 | :placeholder="placeholder" | CODE |
| LOW | frontend/src/v2/lib/forms/RForm/RForm.stories.ts | 128 | <RTextField v-model="name" prefix-label="stacked" label="Display name" :rules="nameRules" placeholder="Jane | CODE |
| LOW | …tend/src/v2/lib/forms/RTextField/RTextField.stories.ts | 125 | placeholder: "Jane Doe", | CODE |
| LOW | frontend/src/v2/lib/forms/RSelect/RSelect.vue | 997 | <slot name="placeholder">{{ effectivePlaceholder }}</slot> | CODE |
| LOW | frontend/src/v2/lib/primitives/RImg/RImg.vue | 125 | <slot name="placeholder" /> | CODE |
| LOW⚡ | backend/tests/handler/walkthrough/test_gamefaqs.py | 21 | '<meta name="author" content="John Doe">' | CODE |
| LOW⚡ | backend/tests/handler/walkthrough/test_gamefaqs.py | 29 | assert guide["author"] == "John Doe" | CODE |
| LOW | backend/tests/endpoints/roms/test_walkthrough.py | 90 | assert created.doc_meta.author == "John Doe" | CODE |
| LOW | backend/tests/utils/test_validation.py | 135 | validate_email("user@example.com") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/utils/audio_tags.py | 153 | # Vorbis comments / FLAC pictures) was largely AI-generated against mutagen's | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | examples/config.example.yml | 65 | # # In this example if you have a 'gc' folder, RomM will treat it like the 'ngc' folder | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | frontend/src/v2/components/Gallery/GalleryShell.vue | 474 | // visually seamless. | COMMENT |
| MEDIUM | …ontend/src/v2/components/Player/ResumePanel.stories.ts | 363 | // helper picks the first as default, so we leverage the existing | COMMENT |
| MEDIUM | backend/tests/endpoints/sockets/test_scan.py | 455 | """Test comprehensive scenarios with different combinations""" | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/BACKEND_ARCHITECTURE.md | 225 | │ ├── scan_handler.py # Library scan orchestration | CODE |