AI Slop Code Risk Monitor

CrossPaste/crosspaste-desktop

SlopCodeMonitor badge for CrossPaste/crosspaste-desktop Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

Cross-device clipboard sync for macOS, Windows & Linux — end-to-end encrypted, LAN-only, no cloud. OCR, CLI and MCP server built in.

1.7 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for CrossPaste/crosspaste-desktop, a Kotlin project with 2,683 GitHub stars. SynthScan examined 209,007 lines of code across 1538 source files, recording 146 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 1.7 (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.

1.7
Adjusted Signal
1.7
Raw Pattern Score
100%
Time Factor
2026-10-30
Last Push
2.7K
Stars
Kotlin
Language
209.0K
Lines of Code
1.5K
Files
146
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 2.8/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.5/100 · LOW

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

Agent Over-Engineering Ratio 5.2/100 · LOW

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

PR Review Velocity Impact 7.2/100 · LOW

Which changes need focused human review? 146 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 2HIGH 0MEDIUM 73LOW 71

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 146 distinct pattern matches across 13 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.

Decorative Section Separators67 hits · 212 pts
SeverityFileLineSnippetContext
MEDIUMi18n_batch_update.sh3# ==========================================COMMENT
MEDIUMi18n_batch_update.sh5# ==========================================COMMENT
MEDIUMi18n_batch_update.sh16# ==========================================COMMENT
MEDIUMi18n_batch_update.sh18# ==========================================COMMENT
MEDIUMi18n_batch_update.sh37# ==========================================COMMENT
MEDIUMi18n_batch_update.sh39# ==========================================COMMENT
MEDIUMi18n_batch_update.sh95# ==========================================COMMENT
MEDIUMi18n_batch_update.sh97# ==========================================COMMENT
MEDIUMi18n_batch_update.sh116# ==========================================COMMENT
MEDIUMi18n_batch_update.sh118# ==========================================COMMENT
MEDIUMi18n_batch_update.sh157# ==========================================COMMENT
MEDIUMi18n_batch_update.sh159# ==========================================COMMENT
MEDIUM⚡i18n_batch_update.sh229# ==========================================COMMENT
MEDIUM⚡i18n_batch_update.sh231# ==========================================COMMENT
MEDIUM⚡i18n_batch_update.sh238# ==========================================COMMENT
MEDIUM⚡i18n_batch_update.sh240# ==========================================COMMENT
MEDIUMi18n_batch_update.sh302# ==========================================COMMENT
MEDIUMi18n_batch_update.sh305# ==========================================COMMENT
MEDIUM…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt194 // ──────────────────────────────────────────────────────────────COMMENT
MEDIUM…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt198 // ──────────────────────────────────────────────────────────────COMMENT
MEDIUM…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt526 // ──────────────────────────────────────────────────────────────COMMENT
MEDIUM…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt528 // ──────────────────────────────────────────────────────────────COMMENT
MEDIUM…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt559 // ──────────────────────────────────────────────────────────────COMMENT
MEDIUM…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt561 // ──────────────────────────────────────────────────────────────COMMENT
MEDIUM…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt783 // ──────────────────────────────────────────────────────────────COMMENT
MEDIUM…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt785 // ──────────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/background/service-worker.ts48// ─── Per-device runtime facts (source of truth) ───────────────────────COMMENT
MEDIUMweb/src/background/service-worker.ts101// ─── WebSocket manager (initialized in initialize()) ────────────────────COMMENT
MEDIUMweb/src/background/service-worker.ts105// ─── Current connection attempt ─────────────────────────────────────────COMMENT
MEDIUMweb/src/background/service-worker.ts151// ─── Clipboard monitoring ───────────────────────────────────────────────COMMENT
MEDIUMweb/src/background/service-worker.ts374// ─── Identity ───────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/background/service-worker.ts391// ─── Device status helpers ──────────────────────────────────────────────COMMENT
MEDIUMweb/src/background/service-worker.ts410// ─── Sync & heartbeat ──────────────────────────────────────────────────COMMENT
MEDIUMweb/src/background/service-worker.ts525// ─── Migration from legacy single-device format ────────────────────────COMMENT
MEDIUMweb/src/background/service-worker.ts557// ─── Startup ────────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/background/service-worker.ts657// ─── Alarm handler ──────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/background/service-worker.ts672// ─── Broadcast ──────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/background/service-worker.ts712// ─── Message handling ───────────────────────────────────────────────────COMMENT
MEDIUMweb/src/shared/api/__tests__/sync-v2v3.test.ts10// ─── chrome.storage.local stub (KeyStore dependency) ────────────────────COMMENT
MEDIUM⚡web/src/shared/i18n/use-i18n.ts19// ─── Language detection ─────────────────────────────────────────────────COMMENT
MEDIUM⚡web/src/shared/i18n/use-i18n.ts29// ─── Context ────────────────────────────────────────────────────────────COMMENT
MEDIUM⚡web/src/shared/i18n/use-i18n.ts39// ─── Provider ───────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/shared/i18n/use-i18n.ts72// ─── Hooks ──────────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/shared/paste/paste-type-detector.ts66// ─── URL detection ──────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/shared/paste/paste-type-detector.ts84// ─── Color detection ────────────────────────────────────────────────────COMMENT
MEDIUM…src/shared/paste/__tests__/paste-type-detector.test.ts5// ─── Helper: ARGB integer from components ─────────────────────────────COMMENT
MEDIUM…src/shared/paste/__tests__/paste-type-detector.test.ts10// ─── parseColor ───────────────────────────────────────────────────────COMMENT
MEDIUM…src/shared/paste/__tests__/paste-type-detector.test.ts159// ─── detectPasteType ──────────────────────────────────────────────────COMMENT
MEDIUM…hared/paste/__tests__/remove-html-image-plugin.test.ts8// ─── isSingleImgInBody ───────────────────────────────────────────────COMMENT
MEDIUM…hared/paste/__tests__/remove-html-image-plugin.test.ts59// ─── RemoveHtmlImagePlugin.process ───────────────────────────────────COMMENT
MEDIUMweb/src/shared/ws/ws-manager.ts232 // ─── Reconnection ──────────────────────────────────────────────────COMMENT
MEDIUMweb/src/shared/ws/ws-client.ts403 // ─── Frame parsing ──────────────────────────────────────────────────COMMENT
MEDIUMweb/src/shared/ws/ws-client.ts526 // ─── Heartbeat ──────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/shared/ws/ws-client.ts559 // ─── Send queue ─────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/shared/ws/ws-client.ts612 // ─── Cleanup ────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/components/settings/AboutView.tsx25// ─── Divider ────────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/components/settings/AboutView.tsx35// ─── Link Item ──────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/components/settings/AboutView.tsx78// ─── About View ─────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/components/settings/SettingsView.tsx23// ─── Segmented Control ──────────────────────────────────────────────────COMMENT
MEDIUMweb/src/components/settings/SettingsView.tsx61// ─── Language Dropdown ──────────────────────────────────────────────────COMMENT
7 more matches not shown…
Verbosity Indicators14 hits · 25 pts
SeverityFileLineSnippetContext
LOW…/com/crosspaste/ui/devices/PairingV3DialogStateTest.kt261 // Step 1: LoadingCOMMENT
LOW…/com/crosspaste/ui/devices/PairingV3DialogStateTest.kt274 // Step 2: Incorrect PIN feedback shown (isLoading remains true)COMMENT
LOW…/com/crosspaste/ui/devices/PairingV3DialogStateTest.kt289 // Step 3: Error cleared while recover is executedCOMMENT
LOW…/com/crosspaste/ui/devices/PairingV3DialogStateTest.kt300 // Step 4: Recover finishes; inputResetGeneration incremented and loading ends in one atomic emissionCOMMENT
LOW…n/com/crosspaste/paste/PasteExportImportServiceTest.kt239 // Step 1: Write paste.data file (simulating export)COMMENT
LOW⚡…n/com/crosspaste/paste/PasteExportImportServiceTest.kt254 // Step 2: CompressCOMMENT
LOW⚡…n/com/crosspaste/paste/PasteExportImportServiceTest.kt264 // Step 3: Decompress (simulating import)COMMENT
LOW⚡…n/com/crosspaste/paste/PasteExportImportServiceTest.kt272 // Step 4: Read and verify paste.dataCOMMENT
LOW…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt716 // Step 1: Exchange keys. This exchange supersedes the dialog'sCOMMENT
LOW…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt740 // Step 2: Compute local SAS and compare with user-entered tokenCOMMENT
LOW…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt754 // Step 3: Confirm trustCOMMENT
LOW…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt766 // Step 4: Save remote key locally and send heartbeat. The confirmCOMMENT
LOW⚡…osspaste/image/coil/AppSourceIconCropTransformation.kt32 // Step 1: normalize by symmetrically trimming transparent padding.COMMENT
LOW⚡…osspaste/image/coil/AppSourceIconCropTransformation.kt38 // Step 2: apply the fixed crop ratios relative to the trimmed content.COMMENT
Structural Annotation Overuse14 hits · 25 pts
SeverityFileLineSnippetContext
LOW…/com/crosspaste/ui/devices/PairingV3DialogStateTest.kt261 // Step 1: LoadingCOMMENT
LOW…/com/crosspaste/ui/devices/PairingV3DialogStateTest.kt274 // Step 2: Incorrect PIN feedback shown (isLoading remains true)COMMENT
LOW…/com/crosspaste/ui/devices/PairingV3DialogStateTest.kt289 // Step 3: Error cleared while recover is executedCOMMENT
LOW…/com/crosspaste/ui/devices/PairingV3DialogStateTest.kt300 // Step 4: Recover finishes; inputResetGeneration incremented and loading ends in one atomic emissionCOMMENT
LOW…n/com/crosspaste/paste/PasteExportImportServiceTest.kt239 // Step 1: Write paste.data file (simulating export)COMMENT
LOW⚡…n/com/crosspaste/paste/PasteExportImportServiceTest.kt254 // Step 2: CompressCOMMENT
LOW⚡…n/com/crosspaste/paste/PasteExportImportServiceTest.kt264 // Step 3: Decompress (simulating import)COMMENT
LOW⚡…n/com/crosspaste/paste/PasteExportImportServiceTest.kt272 // Step 4: Read and verify paste.dataCOMMENT
LOW…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt716 // Step 1: Exchange keys. This exchange supersedes the dialog'sCOMMENT
LOW…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt740 // Step 2: Compute local SAS and compare with user-entered tokenCOMMENT
LOW…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt754 // Step 3: Confirm trustCOMMENT
LOW…/commonMain/kotlin/com/crosspaste/sync/SyncResolver.kt766 // Step 4: Save remote key locally and send heartbeat. The confirmCOMMENT
LOW⚡…osspaste/image/coil/AppSourceIconCropTransformation.kt32 // Step 1: normalize by symmetrically trimming transparent padding.COMMENT
LOW⚡…osspaste/image/coil/AppSourceIconCropTransformation.kt38 // Step 2: apply the fixed crop ratios relative to the trimmed content.COMMENT
Over-Commented Block24 hits · 24 pts
SeverityFileLineSnippetContext
LOWsmoke-test.sh1#!/usr/bin/env bashCOMMENT
LOWapp/openssl.yaml1# Pinned OpenSSL libcrypto binaries bundled with the desktop app for theCOMMENT
LOW…ste/ui/paste/side/preview/SkiaAnimatedImageViewTest.kt101COMMENT
LOW…t/kotlin/com/crosspaste/sync/GeneralSyncHandlerTest.kt641 // ========== X. callback wiring (polling vs force) ==========COMMENT
LOW…c/commonMain/kotlin/com/crosspaste/net/TelnetHelper.kt61 // Last address set we successfully advertised to each peer (keyed by the probed hostCOMMENT
LOW…nMain/kotlin/com/crosspaste/net/routing/SyncRouting.kt241COMMENT
LOW…n/kotlin/com/crosspaste/DesktopPasteComponentModule.kt201 // plugins and must keep these invariants):COMMENT
LOW…tlin/com/crosspaste/ui/paste/side/SidePasteItemView.kt161 // layer is only used to provide a drag preview, and a dragCOMMENT
LOW…sspaste/ui/paste/side/preview/SkiaAnimatedImageView.kt81COMMENT
LOW…topMain/kotlin/com/crosspaste/app/WindowsZipUpdater.kt281 if (readReadyMarker()?.version == release.version && fileUtils.existFile(stagingDir())) {COMMENT
LOW…rc/desktopMain/kotlin/com/crosspaste/cli/CliRouting.kt1061 // Sampling inside the collect instead would race — a paste created betweenCOMMENT
LOW…rc/desktopMain/kotlin/com/crosspaste/cli/CliRouting.kt1081 // query. Building a baseline from the latter would replayCOMMENT
LOWweb/src/vite-env.d.ts1/// <reference types="vite/client" />COMMENT
LOWscripts/build-test-windows-zip.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/serve-fake-update.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/build-oss-test-update.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/publish-msstore.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/publish-msstore.sh21# the Store accepts or rejects it.COMMENT
LOW.github/workflows/build-beta-linux.yml1name: "Build Beta (Linux)"COMMENT
LOW.github/workflows/build-release.yml301 # takes precedence over build.conveyor.conf's `revision = ${env.REVISION}`COMMENT
LOW.github/workflows/build-release.yml321 # alias extension with both aliases and the windows.firewallRulesCOMMENT
LOW.github/workflows/build-release.yml361 unzip -Z1 "${files[0]}" | grep -x 'bin/CrossPaste.exe' > /dev/null || { echo "Store MSIX does not contain bin/COMMENT
LOW.github/workflows/build-release.yml381 # and keep a backup of the secret key outside GitHub: rotating itCOMMENT
LOW.github/scripts/package_appimage.sh1#!/bin/bashCOMMENT
Hallucination Indicators2 hits · 20 pts
SeverityFileLineSnippetContext
CRITICAL…t/kotlin/com/crosspaste/net/routing/PushRoutingTest.kt147 private fun io.ktor.client.request.HttpRequestBuilder.pushHeaders(CODE
CRITICAL…pMain/kotlin/com/crosspaste/ui/ChangeLogContentView.kt344private fun androidx.compose.ui.text.AnnotatedString.Builder.appendLinkified(CODE
Hyper-Verbose Identifiers12 hits · 12 pts
SeverityFileLineSnippetContext
LOWweb/src/background/service-worker.ts64function getOrCreateRuntime(targetId: string): RuntimeFacts {CODE
LOWweb/src/background/service-worker.ts1103async function refreshOfferForNewGeneration(CODE
LOWweb/src/shared/app/ui-support.ts20export async function openCrossPasteWebInBrowser(path = ""): Promise<void> {CODE
LOWweb/src/shared/utils/html-color.ts93function parseBackgroundColorFromStyle(style: string): number | null {CODE
LOWweb/src/shared/hooks/use-oversize-notice.ts20export function useOversizeNoticeListener(): void {CODE
LOWweb/src/shared/api/__tests__/sync-v2v3.test.ts63async function fabricateExchangeResponse(server: Awaited<ReturnType<typeof generateServerKeys>>) {CODE
LOWweb/src/shared/i18n/i18n-core.ts55export async function buildTranslatorFromStorage(): Promise<TranslateFn> {CODE
LOWweb/src/shared/ws/ws-message-handler.ts383 async function handlePasteRejectedOversize(CODE
LOWweb/src/shared/ws/__tests__/ws-client-auth.test.ts35function gatedVerificationProcessor(): {CODE
LOWweb/src/shared/clipboard/clipboard-sync-writer.ts22export async function writeRemotePasteToClipboard(pasteData: PasteData): Promise<boolean> {CODE
LOW.github/scripts/processJarFiles.js102function removeTesseractFilesFromJar(jarPath) {CODE
LOW.github/scripts/validateAndUpdateVersion.js7async function validateAndUpdateVersion() {CODE
Self-Referential Comments2 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUM⚡app/script/mac_start.sh3# Define the application path relative to this scriptCOMMENT
MEDIUM⚡app/script/linux_start.sh3# Define the application path relative to this scriptCOMMENT
Redundant / Tautological Comments4 hits · 9 pts
SeverityFileLineSnippetContext
LOW⚡app/script/mac_start.sh6# Check if a PID is provided and if it is a numberCOMMENT
LOW⚡app/script/mac_start.sh10 # Check if the process exists and wait for it to stopCOMMENT
LOW⚡app/script/linux_start.sh6# Check if a PID is provided and if it is a numberCOMMENT
LOW⚡app/script/linux_start.sh10 # Check if the process exists and wait for it to stopCOMMENT
Slop Phrases2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUM…ommonMain/kotlin/com/crosspaste/ui/base/FontManager.kt100 * This is for demonstration purposes of a fontCOMMENT
MEDIUM.github/scripts/processJarFiles.js94 // You can modify this to extract specific parts using regex groupsCOMMENT
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUM…m/crosspaste/ui/paste/edit/PasteHtmlEditContentView.kt134 // Track the annotated string at the last save point for robust change detectionCOMMENT
MEDIUMweb/src/shared/utils/html-color.ts94 // Use a temp element to leverage browser CSS parsingCOMMENT
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWscripts/publish-msstore.sh32# Usage:COMMENT
Fake / Example Data1 hit · 1 pts
SeverityFileLineSnippetContext
LOW…topTest/kotlin/com/crosspaste/db/paste/PasteDaoTest.kt390 assertTrue(results.single().pasteSearchContent!!.contains("foo@bar.com"))CODE
Excessive Try-Catch Wrapping1 hit · 1 pts
SeverityFileLineSnippetContext
LOWapp/src/desktopMain/resources/plugins/translate/run.py31except Exception as e:CODE