AI Slop Code Risk Monitor

gotson/komga

SlopCodeMonitor badge for gotson/komga Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

Media server for comics/mangas/BDs/magazines/eBooks with API, OPDS, Kobo Sync and KOReader Sync support

0.5 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for gotson/komga, a Kotlin project with 6,805 GitHub stars. SynthScan examined 243,195 lines of code across 1593 source files, recording 123 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 0.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.

0.5
Adjusted Signal
0.5
Raw Pattern Score
100%
Time Factor
2026-11-01
Last Push
6.8K
Stars
Kotlin
Language
243.2K
Lines of Code
1.6K
Files
123
Pattern Hits
2026-10-31
Scan Date
0.00
HC Hit Rate

Risk Review · Payload v1

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.

Cognitive Ownership Risk 0.9/100 · LOW

Can maintainers explain intent, assumptions, and trade-offs? 41 finding(s).

Hallucinated Dependency & Supply Chain Risk 1.8/100 · LOW

Are imports declared and package/API names verified? 82 finding(s).

Agent Over-Engineering Ratio 0.8/100 · LOW

Are wrappers, guards, and repeated structures necessary? 35 finding(s).

PR Review Velocity Impact 2.5/100 · LOW

Which changes need focused human review? 123 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

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.

Severity Breakdown

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.

CRITICAL 0HIGH 0MEDIUM 1LOW 122

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 123 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.

Fake / Example Data82 hits · 89 pts
SeverityFileLineSnippetContext
LOWnext-ui/src/components/readlist/form/General.stories.ts33 summary: `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dCODE
LOWnext-ui/src/components/readlist/form/General.stories.ts33 summary: `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dCODE
LOWnext-ui/src/components/user/Details.stories.ts25 email: 'admin@example.org',CODE
LOWnext-ui/src/components/user/form/CreateEdit.stories.ts65 email: 'user@example.org',CODE
LOWnext-ui/src/pages/login.stories.ts185 await userEvent.type(login, 'test@example.org')CODE
LOWnext-ui/src/pages/login.stories.ts207 await userEvent.type(login, 'test@example.org')CODE
LOWnext-ui/src/pages/login.stories.ts227 await userEvent.type(login, 'test@example.org')CODE
LOWnext-ui/src/pages/claim.stories.ts41 await userEvent.type(login, 'test@example.org')CODE
LOWnext-ui/src/pages/claim.stories.ts66 await userEvent.type(login, 'test@example.org')CODE
LOWnext-ui/src/pages/claim.stories.ts91 await userEvent.type(login, 'test@example.org')CODE
LOW…g/gotson/komga/benchmark/rest/AbstractRestBenchmark.kt31 userRepository.findByEmailIgnoreCaseOrNull("admin@example.org")CODE
LOW…otson/komga/infrastructure/jooq/main/BookSearchTest.kt77 private val user1 = KomgaUser("user1@example.org", "p")CODE
LOW…otson/komga/infrastructure/jooq/main/BookSearchTest.kt78 private val user2 = KomgaUser("user2@example.org", "p")CODE
LOW…otson/komga/infrastructure/jooq/main/BookDtoDaoTest.kt66 private val user = KomgaUser("user@example.org", "")CODE
LOW…/komga/infrastructure/jooq/main/ReadProgressDaoTest.kt33 private val user1 = KomgaUser("user1@example.org", "")CODE
LOW…/komga/infrastructure/jooq/main/ReadProgressDaoTest.kt34 private val user2 = KomgaUser("user2@example.org", "")CODE
LOW…son/komga/infrastructure/jooq/main/SeriesSearchTest.kt71 private val user1 = KomgaUser("user1@example.org", "p")CODE
LOW…son/komga/infrastructure/jooq/main/SeriesSearchTest.kt72 private val user2 = KomgaUser("user2@example.org", "p")CODE
LOW…son/komga/infrastructure/jooq/main/SeriesDtoDaoTest.kt64 private val user = KomgaUser("user@example.org", "")CODE
LOW…ga/infrastructure/jooq/main/SeriesCollectionDaoTest.kt29 private val testUser = KomgaUser("test@example.org", "")CODE
LOW…a/infrastructure/jooq/main/ClientSettingsDtoDaoTest.kt20 private val user1 = KomgaUser("user1@example.org", "")CODE
LOW…a/infrastructure/jooq/main/ClientSettingsDtoDaoTest.kt21 private val user2 = KomgaUser("user2@example.org", "")CODE
LOW…tson/komga/infrastructure/jooq/main/ReadListDaoTest.kt33 private val testUser = KomgaUser("test@example.org", "")CODE
LOW⚡…n/komga/infrastructure/jooq/main/ReferentialDaoTest.kt59 private val userAll = KomgaUser("user1@example.org", "p")CODE
LOW⚡…n/komga/infrastructure/jooq/main/ReferentialDaoTest.kt60 private val userLib1 = KomgaUser("user2@example.org", "p", sharedLibrariesIds = setOf(library1.id), sharedAllLibrariesCODE
LOW⚡…n/komga/infrastructure/jooq/main/ReferentialDaoTest.kt61 private val userLabelAllow = KomgaUser("user3@example.org", "p", restrictions = ContentRestrictions(labelsAllow = setOCODE
LOW⚡…n/komga/infrastructure/jooq/main/ReferentialDaoTest.kt62 private val userAge10 = KomgaUser("user4@example.org", "p", restrictions = ContentRestrictions(ageRestriction = AgeResCODE
LOW…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt48 email = "user@example.org",CODE
LOW…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt61 assertThat(email).isEqualTo("user@example.org")CODE
LOW…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt76 email = "user@example.org",CODE
LOW…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt100 email = "user2@example.org",CODE
LOW…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt122 assertThat(email).isEqualTo("user2@example.org")CODE
LOW⚡…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt144 komgaUserDao.insert(KomgaUser("user1@example.org", "p"))CODE
LOW⚡…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt145 komgaUserDao.insert(KomgaUser("user2@example.org", "p"))CODE
LOW⚡…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt151 "user1@example.org",CODE
LOW⚡…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt152 "user2@example.org",CODE
LOW⚡…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt158 komgaUserDao.insert(KomgaUser("user1@example.org", "p"))CODE
LOW⚡…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt159 komgaUserDao.insert(KomgaUser("user2@example.org", "p"))CODE
LOW⚡…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt168 val existing = KomgaUser("user1@example.org", "p")CODE
LOW…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt185 val existing = KomgaUser("user1@example.org", "p")CODE
LOW…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt196 KomgaUser("user1@example.org", "p"),CODE
LOW⚡…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt209 KomgaUser("user1@example.org", "p"),CODE
LOW⚡…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt216 assertThat(found?.email).isEqualTo("user1@example.org")CODE
LOW⚡…son/komga/infrastructure/jooq/main/KomgaUserDaoTest.kt222 val user = KomgaUser("user1@example.org", "p")CODE
LOW…/kotlin/org/gotson/komga/domain/model/KomgaUserTest.kt8 val defaultUser = KomgaUser("user@example.org", "aPassword")CODE
LOW…/gotson/komga/domain/service/KomgaUserLifecycleTest.kt28 private val user1 = KomgaUser("user1@example.org", "")CODE
LOW…/gotson/komga/domain/service/KomgaUserLifecycleTest.kt29 private val user2 = KomgaUser("user2@example.org", "")CODE
LOW…n/org/gotson/komga/domain/service/BookLifecycleTest.kt65 private val user1 = KomgaUser("user1@example.org", "")CODE
LOW…n/org/gotson/komga/domain/service/BookLifecycleTest.kt66 private val user2 = KomgaUser("user2@example.org", "")CODE
LOW…on/komga/domain/service/LibraryContentLifecycleTest.kt97 private val user = KomgaUser("user@example.org", "", id = "1")CODE
LOW…/gotson/komga/domain/service/SyncPointLifecycleTest.kt55 "user1@example.org",CODE
LOW…in/org/gotson/komga/domain/service/BookImporterTest.kt66 private val user1 = KomgaUser("user1@example.org", "")CODE
LOW…in/org/gotson/komga/domain/service/BookImporterTest.kt67 private val user2 = KomgaUser("user2@example.org", "")CODE
LOW…/kotlin/org/gotson/komga/interfaces/api/SessionTest.kt34 user = KomgaUser("user@example.org", "user")CODE
LOW…ga/interfaces/api/kosync/KoreaderSyncControllerTest.kt30 "user@example.org",CODE
LOW…gotson/komga/interfaces/api/opds/OpdsControllerTest.kt47 private val user = KomgaUser("user@example.org", "", id = "1")CODE
LOW…gotson/komga/interfaces/api/opds/OpdsControllerTest.kt48 private val user2 = KomgaUser("user2@example.org", "", id = "2")CODE
LOW…gotson/komga/interfaces/api/kobo/KoboControllerTest.kt55 "user@example.org",CODE
LOW…ga/interfaces/api/rest/ClientSettingsControllerTest.kt114 private val user1 = KomgaUser("user1@example.org", "", id = "user1")CODE
LOW…gotson/komga/interfaces/api/rest/UserControllerTest.kt48 private val admin = KomgaUser("admin@example.org", "", id = "admin")CODE
22 more matches not shown…
Hyper-Verbose Identifiers35 hits · 36 pts
SeverityFileLineSnippetContext
LOWkomga-webui/src/functions/urls.ts21export function bookThumbnailUrlByThumbnailId(bookId: string, thumbnailId: string) {CODE
LOWkomga-webui/src/functions/urls.ts56export function seriesThumbnailUrlByThumbnailId(seriesId: string, thumbnailId: string) {CODE
LOWkomga-webui/src/functions/urls.ts64export function collectionThumbnailUrlByThumbnailId(collectionId: string, thumbnailId: string) {CODE
LOW⚡komga-webui/src/functions/urls.ts76export function readListThumbnailUrlByThumbnailId(readListId: string, thumbnailId: string) {CODE
LOW⚡komga-webui/src/functions/urls.ts84export function pageHashUnknownThumbnailUrl(pageHash: PageHashUnknownDto, resize?: number): string {CODE
LOW⚡komga-webui/src/functions/urls.ts92export function pageHashKnownThumbnailUrl(pageHash: PageHashKnownDto): string {CODE
LOWkomga-webui/src/functions/filter.ts24export function extractFilterOptionsValues(options: NameValue[] | undefined): any[] {CODE
LOWkomga-webui/src/functions/book-progress.ts10export function getReadProgressPercentage (book: BookDto): number {CODE
LOWkomga-webui/src/functions/book-format.ts22export function getBookFormatFromMediaType(mediaType: string): BookFormat {CODE
LOWkomga-webui/src/functions/book-format.ts40export function getBookReadRouteFromMedia(media: MediaDto): string {CODE
LOWnext-ui/src/types/BookDetails.ts11export function transientBookDtoToBookDetails(transientBook: TransientBookDto): BookDetails {CODE
LOWnext-ui/src/composables/intlFormatter.ts7 function convertSortOptionDescriptor(sortDescriptor: SortOptionDescriptor): SortOption {CODE
LOWnext-ui/src/composables/selection.ts8export function useSelectionContextualActions(CODE
LOW…/src/composables/series/useEditSeriesMetadataDialog.ts18export function useEditSeriesMetadataDialog() {CODE
LOW…i/src/composables/book/useBookNavigationFromContext.ts6export function useBookNavigationFromContext(CODE
LOW…t-ui/src/composables/book/useEditBookMetadataDialog.ts21export function useEditBookMetadataDialog() {CODE
LOWnext-ui/src/stores/messages.ts38export function isMessageWithActionRouter(CODE
LOWnext-ui/src/api/images.ts60export function pageHashKnownThumbnailUrl(hash?: string): string | undefined {CODE
LOWnext-ui/src/api/images.ts65export function pageHashUnknownThumbnailUrl(hash?: string): string | undefined {CODE
LOWnext-ui/src/functions/clipboard.ts1export async function extractImageFromClipboard(item: ClipboardItem | DataTransferItem) {CODE
LOWnext-ui/src/functions/clipboard.ts6async function extractImageFromDataTransferItem(item: DataTransferItem): Promise<File | undefined> {CODE
LOWnext-ui/src/functions/clipboard.ts19async function extractImageFromClipboardItem(item: ClipboardItem): Promise<File | undefined> {CODE
LOWnext-ui/src/functions/filter.ts61export function schemaFilterContributorsToConditions(CODE
LOWnext-ui/src/functions/filter.ts99export function schemaFilterNotableEntitiesToConditions(CODE
LOWnext-ui/src/functions/filter.ts137export function schemaFilterReadStatusToConditions(CODE
LOWnext-ui/src/functions/filter.ts154export function schemaFilterPosterToConditions(filter: InferOutput<typeof SchemaFilterPoster>) {CODE
LOWnext-ui/src/functions/filter.ts172export function schemaFilterIncludeExcludeToConditions(filter: FilterIncludeExclude, key: string) {CODE
LOWnext-ui/src/functions/filter.ts181export function schemaFilterStringToConditions(CODE
LOWnext-ui/src/functions/filter.ts222export function schemaFilterReleaseYearToConditions(CODE
LOWnext-ui/src/functions/filter.ts264export function schemaFilterAgeRatingToConditions(CODE
LOWnext-ui/src/functions/filter.ts315export function contributorToContributorsQuery(contributor: AuthorDto) {CODE
LOWnext-ui/src/functions/series.ts3export function seriesMetadataToUpdateDto(CODE
LOWnext-ui/src/functions/browsing-context.ts122export function formatBrowsingContextAsQueryParam(context?: BrowsingContext): LocationQueryRaw {CODE
LOWnext-ui/src/functions/browsing-context.ts133export function browsingContextToRouteLocation(CODE
LOWnext-ui/src/router/library-view-redirect-guard.ts14export function useLibraryViewRedirectGuard(router: Router) {CODE
Over-Commented Block3 hits · 3 pts
SeverityFileLineSnippetContext
LOWnext-ui/env.d.ts1/// <reference types="vite/client" />COMMENT
LOWkomga/src/main/resources/application-dev.yml21# org.springframework.web.filter.CommonsRequestLoggingFilter: DEBUGCOMMENT
LOW.github/FUNDING.yml1# These are supported funding model platformsCOMMENT
Modern AI Meta-Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMnext-ui/package-lock.json304 "resolved": "https://registry.npmjs.org/@devframes/agentic/-/agentic-1.1.0.tgz",CODE
TODO Padding1 hit · 2 pts
SeverityFileLineSnippetContext
LOWnext-ui/src/composables/useEntitiesActions.ts40 //TODO: implement remaining actionsCOMMENT
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippetContext
LOWnext-ui/public-msw/mockServiceWorker.js124async function handleRequest(event, requestId, requestInterceptedAt) {CODE