AI Slop Code Risk Monitor

readest/readest

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

Readest is a modern, feature-rich ebook reader designed for avid readers offering seamless cross-platform access, powerful tools, and an intuitive interface to elevate your reading experience.

1.9 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for readest/readest, a TypeScript project with 25,785 GitHub stars. SynthScan examined 804,794 lines of code across 4106 source files, recording 891 pattern matches distributed across 18 syntactic categories. The legacy adjusted pattern signal is 1.9 (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.9
Adjusted Signal
1.9
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
25.8K
Stars
TypeScript
Language
804.8K
Lines of Code
4.1K
Files
891
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 3.9/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.9/100 · LOW

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

Agent Over-Engineering Ratio 5.2/100 · LOW

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

PR Review Velocity Impact 8.9/100 · LOW

Which changes need focused human review? 891 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 7HIGH 11MEDIUM 242LOW 631

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 891 distinct pattern matches across 18 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 Separators222 hits · 662 pts
SeverityFileLineSnippetContext
MEDIUM.github/workflows/nightly.yml247 # ──────────────────────────── ANDROID ────────────────────────────COMMENT
MEDIUM.github/workflows/nightly.yml294 # ──────────────────────────── DESKTOP ────────────────────────────COMMENT
MEDIUM.github/workflows/nightly.yml398 # ───────────────── COLLECT ARTIFACTS + BUILD FRAGMENT ─────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs26// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs28// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs115// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs117// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs245// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs247// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs276// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs278// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs339// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs341// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs364// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs366// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs382// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs384// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs469// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs471// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs531// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs533// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs50// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs52// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs96// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs98// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs135// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs137// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs406// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs408// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs463// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs465// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs521// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs523// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift1644 // ── Sync passphrase keychain ──────────────────────────────────────────COMMENT
MEDIUM…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift1722 // ── Keyed secure key-value store ──────────────────────────────────COMMENT
MEDIUM…-plugin-native-bridge/ios/Sources/AppGroupBridge.swift83 // ── Shared clip HTML files (extension writes, host reads) ──────────COMMENT
MEDIUM…ive-bridge/android/src/main/java/NativeBridgePlugin.kt1722 // ── Sync passphrase keychain ──────────────────────────────────────COMMENT
MEDIUM…ive-bridge/android/src/main/java/NativeBridgePlugin.kt1807 // ── Keyed secure key-value store ──────────────────────────────────COMMENT
MEDIUM…tauri/plugins/tauri-plugin-native-bridge/src/models.rs390// ── Sync passphrase keychain ────────────────────────────────────────────COMMENT
MEDIUM…tauri/plugins/tauri-plugin-native-bridge/src/models.rs533// ── Keyed secure key-value store ─────────────────────────────────────────COMMENT
MEDIUM…auri/plugins/tauri-plugin-native-bridge/src/desktop.rs250 // ── Sync passphrase keychain ────────────────────────────────────────COMMENT
MEDIUM…auri/plugins/tauri-plugin-native-bridge/src/desktop.rs361 // ── Keyed secure key-value store ────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src-tauri/gen/apple/project.yml36 # ----------------------------------COMMENT
MEDIUM…rc-tauri/gen/apple/ShareExtension/AppGroupBridge.swift102 // ── Shared clip HTML files (extension writes, host reads) ──────────COMMENT
MEDIUM…est-app/src/app/reader/components/rsvp/RSVPControl.tsx39// ─── TTS-sync decision logic (slice 5, #3235) ──────────────────────────COMMENT
MEDIUM…est-app/src/app/reader/components/rsvp/RSVPControl.tsx39// ─── TTS-sync decision logic (slice 5, #3235) ──────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/tauriEpubBridge.ts38// ─── shared helpers ──────────────────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/tauriEpubBridge.ts55// ─── parse_epub_metadata (import path) ───────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/tauriEpubBridge.ts230// ─── parse_epub_full (open hot-path prefetch) ────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/bridge.ts465// ── Sync passphrase keychain ────────────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/bridge.ts510// ── Keyed secure key-value store ─────────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/bridge.ts551// ── Bookshelf widget ────────────────────────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/bridge.ts641// ── Reading widget ──────────────────────────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/bridge.ts710// ── Nightly updater (main-app commands, no native-bridge prefix) ─────────COMMENT
MEDIUMapps/readest-app/src/utils/tauriMobiBridge.ts42// ─── shared helpers ──────────────────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/tauriMobiBridge.ts70// ─── parse_mobi_metadata (import path) ───────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/warichu.ts120// ── Core measurement ──────────────────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/warichu.ts173// ── Build nodes ───────────────────────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/warichu.ts356// ── Helpers ───────────────────────────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/warichu.ts472// ── HTML slicing helpers ──────────────────────────────────────────────COMMENT
162 more matches not shown…
Over-Commented Block401 hits · 401 pts
SeverityFileLineSnippetContext
LOWCargo.toml61[profile.release]COMMENT
LOWdocker/volumes/db/apply-migrations.sh1#!/bin/shCOMMENT
LOWpackages/swift-rs/Cargo.toml1# THIS FILE IS AUTOMATICALLY GENERATED BY CARGOCOMMENT
LOWpackages/swift-rs/src-rs/dark_magic.rs1/// This retain-balancing algorithm is cool but likely isn't required.COMMENT
LOWpackages/swift-rs/src-rs/dark_magic.rs21// });COMMENT
LOWpackages/swift-rs/src-rs/dark_magic.rs41COMMENT
LOWpackages/swift-rs/src-rs/dark_magic.rs61COMMENT
LOWpackages/swift-rs/src-rs/dark_magic.rs81// retain_object(ptr)COMMENT
LOWpackages/swift-rs/src-rs/build.rs261 commandCOMMENT
LOWpackages/swift-rs/src-rs/swift_arg.rs1use std::ffi::c_void;COMMENT
LOWpackages/swift-rs/src-rs/autorelease.rs1/// Run code with its own autorelease pool. Semantically, this is identicalCOMMENT
LOWpackages/swift-rs/src-rs/swift.rs21 fn get_object(&self) -> &SRObject<Self::Shape>;COMMENT
LOWpackages/swift-rs/src-rs/swift.rs61///COMMENT
LOWpackages/swift-rs/src-rs/types/object.rs1use crate::swift::{self, SwiftObject};COMMENT
LOWpackages/swift-rs/src-rs/types/object.rs21/// struct CustomObject {COMMENT
LOWpackages/swift-rs/src-rs/types/array.rs21/// ## Returning DirectlyCOMMENT
LOWpackages/swift-rs/src-rs/types/array.rs41///COMMENT
LOW.github/workflows/try-appimage.yml81 sudo apt-get install -y pkg-config libfontconfig-dev libgtk-3-dev libwebkit2gtk-4.1 libwebkit2gtk-4.1-dev libjCOMMENT
LOW.github/workflows/release.yml461 # hands to quick-sharun as arguments: Debian keeps the NSS modules inCOMMENT
LOW.github/workflows/nightly.yml181 # bundled glibc on any newer distro (NSS: FATAL crypto/nss_util.cc).COMMENT
LOW.github/workflows/codeql.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOW.github/workflows/pull-request.yml421 toolchain: stableCOMMENT
LOW.github/workflows/scorecard.yml41 - name: "Run analysis"COMMENT
LOWapps/readest-app/pdfjs.d.ts1// `@pdfjs/*` resolves into `packages/foliate-js/node_modules/pdfjs-dist`, soCOMMENT
LOWapps/readest-app/wrangler.toml81# Reading-statistics archive: immutable per-user JSON segments of page eventsCOMMENT
LOWapps/readest-app/vitest.tauri.setup.ts1// Vitest runs tests inside an iframe, but Tauri injects its plugin internalsCOMMENT
LOWapps/readest-app/worker.ts1// Custom Cloudflare Worker entry (wrangler.toml `main`). Wraps the handler thatCOMMENT
LOWapps/readest-app/scripts/release-ios-appstore.sh1#!/usr/bin/env bashCOMMENT
LOWapps/readest-app/scripts/release-ios-appstore.sh21# from the widget / share extensions, or the reading widget ships dead. WithCOMMENT
LOWapps/readest-app/scripts/fix-ios-appstore-appgroup.sh1#!/usr/bin/env bashCOMMENT
LOWapps/readest-app/scripts/sync-release-notes.sh1#!/bin/bashCOMMENT
LOW…eadest-app/scripts/verify-ios-appstore-entitlements.sh1#!/usr/bin/env bashCOMMENT
LOWapps/readest-app/scripts/worktree-new.ts241}COMMENT
LOWapps/readest-app/scripts/ios16-fonts-ready-repro.py1#!/usr/bin/env python3COMMENT
LOWapps/readest-app/src-tauri/Cargo.toml121COMMENT
LOWapps/readest-app/src-tauri/Cargo.toml141# are disabled to keep the binary lean — we only need decoders for theCOMMENT
LOWapps/readest-app/src-tauri/Cargo.toml161flate2 = "1"COMMENT
LOW…ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift241 // prompts PAUSE us instead of ducking, and the interruption-endedCOMMENT
LOW…ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift261 return Date().timeIntervalSince(lastSessionOpTime) < 2.0COMMENT
LOW…ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift281 // state must all live on ONE MediaRemote player surface — splitting themCOMMENT
LOW…ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift1101 let index: IntCOMMENT
LOW…ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift1281 }COMMENT
LOW…tive-tts/android/src/main/java/MediaPlaybackService.kt321 }COMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift821 /// Bridge between the Readest Share Extension (separate process) andCOMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift1181 if volumeKeys {COMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift2101 Thread.sleep(forTimeInterval: 0.25)COMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift2121 ///COMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift2141 returnCOMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift2321 self.turnCoverView?.removeFromSuperview()COMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift2341/// Foundation / POSIX reads against `url.path` succeed.COMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift2441COMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift2481 defer { onComplete() }COMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift2621 func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {COMMENT
LOW…ative-bridge/ios/Sources/TextSelectionSuppressor.swift1import ObjectiveCCOMMENT
LOW…ugin-native-bridge/ios/Sources/ClipUrlController.swift61COMMENT
LOW…-native-bridge/ios/Sources/ContextMenuSuppressor.swift1import ObjectiveCCOMMENT
LOW…-native-bridge/ios/Sources/ContextMenuSuppressor.swift21/// a backstop in case WebKit presents without re-querying the delegate.COMMENT
LOW…ive-bridge/android/src/main/java/NativeBridgePlugin.kt441COMMENT
LOW…ive-bridge/android/src/main/java/NativeBridgePlugin.kt501 val list: ArrayList<Uri>? =COMMENT
LOW…tauri/plugins/tauri-plugin-native-bridge/src/models.rs341 pub error: Option<String>,COMMENT
341 more matches not shown…
Hyper-Verbose Identifiers137 hits · 141 pts
SeverityFileLineSnippetContext
LOW…p/.claude/plans/2026-06-18-sync-reading-status-plan.md513export function resolveReadingStatusMerge(CODE
LOW…ers/plans/2026-05-30-tts-highlight-current-sentence.md148export function buildTTSSentenceHighlight(CODE
LOW…cs/2026-05-30-tts-highlight-current-sentence-design.md167export function buildTTSSentenceHighlight(CODE
LOW…extensions/send-to-readest/src/background/offscreen.ts119export async function clipAndUploadViaOffscreen(opts: {CODE
LOW…/readest-app/src/app/reader/utils/globalAnnotations.ts309export function expandAllRenderedSections(view: FoliateView | null, note: BookNote): void {CODE
LOW…/readest-app/src/app/reader/utils/globalAnnotations.ts348export function removeGlobalAnnotationOverlays(CODE
LOWapps/readest-app/src/app/reader/utils/annotatorUtil.ts140export function getHandlePositionsFromRange(CODE
LOWapps/readest-app/src/app/reader/utils/annotatorUtil.ts273export function removeEmptyAnnotationPlaceholder(CODE
LOWapps/readest-app/src/app/reader/utils/annotatorUtil.ts301export function buildTTSSentenceHighlight(CODE
LOWapps/readest-app/src/app/reader/utils/annotatorUtil.ts552export function decideNoteBubbleTransition(before: string, after: string): NoteBubbleTransition {CODE
LOWapps/readest-app/src/app/reader/utils/annotatorUtil.ts564export function applyNoteBubbleTransition(CODE
LOW…ps/readest-app/src/app/reader/utils/annotationIndex.ts61export function selectLocationAnnotations(CODE
LOW…app/src/app/reader/components/notebook/AIAssistant.tsx41function convertToExportedMessages(CODE
LOW…adest-app/src/app/reader/hooks/useAutoSaveBookCover.ts102async function tryWriteFullCoverFromBook(CODE
LOWapps/readest-app/src/app/api/stripe/webhook/route.ts110async function handleSuccessfulSubscription(session: Stripe.Checkout.Session, userId: string) {CODE
LOWapps/readest-app/src/app/api/stripe/webhook/route.ts188async function handleSubscriptionUpdated(subscription: Stripe.Subscription) {CODE
LOWapps/readest-app/src/app/api/stripe/webhook/route.ts206async function handleSubscriptionCancelled(subscription: Stripe.Subscription) {CODE
LOWapps/readest-app/src/utils/note.ts248export function buildAnnotationCopyMarkdown({CODE
LOWapps/readest-app/src/utils/ambientLight.ts78export function readStoredAmbientIsDarkMode(CODE
LOWapps/readest-app/src/utils/bridge.ts376export function checkEinkRefreshSupported(): Promise<boolean> {CODE
LOWapps/readest-app/src/utils/bridge.ts402export function getCachedEinkRefreshSupported(): boolean | null {CODE
LOWapps/readest-app/src/utils/bridge.ts611export async function getBookshelfWidgetInstances(): Promise<GetBookshelfWidgetInstancesResponse> {CODE
LOWapps/readest-app/src/utils/bridge.ts637export async function setBookshelfWidgetCatalog(catalog: BookshelfWidgetCatalog): Promise<void> {CODE
LOWapps/readest-app/src/utils/bridge.ts682export async function getReadingWidgetInstances(): Promise<GetReadingWidgetInstancesResponse> {CODE
LOWapps/readest-app/src/libs/payment/iap/apple/server.ts31export async function createOrUpdateSubscription(userId: string, purchase: VerifiedPurchase) {CODE
LOW…adest-app/src/libs/payment/iap/google/notifications.ts108async function handleSubscriptionNotification(CODE
LOWapps/readest-app/src/libs/payment/iap/google/server.ts41export async function createOrUpdateSubscription(userId: string, purchase: VerifiedPurchase) {CODE
LOW…-app/src/__tests__/hooks/useSpatialNavigation.test.tsx56function simulateKeyboardActivation() {CODE
LOW…p/src/__tests__/services/translators/providers.test.ts993 function mockProxyAuthAndTranslation(text: string) {CODE
LOWapps/readest-app/src/hooks/usePullToRefresh.ts152 function updateLoadingSpinnerPosition(el: HTMLDivElement, transform: number, dy: number) {CODE
LOW…s/readest-app/src/hooks/useAndroidGamepadConnection.ts14export function useAndroidGamepadConnection(enabled: boolean): boolean {CODE
LOW…s/readest-app/src/hooks/useRestoreLibraryOnRelaunch.ts18export function useRestoreLibraryOnRelaunch() {CODE
LOWapps/readest-app/src/pages/api/sync.ts51export function resolveReadingStatusMerge(CODE
LOWapps/readest-app/src/pages/api/sync.ts77export function buildStatusPropagationRow(CODE
LOWapps/readest-app/src/services/cloudService.ts154export async function downloadReplicaFileFromCloud(CODE
LOWapps/readest-app/src/services/cloudService.ts173export async function deleteReplicaBundleFromCloud(CODE
LOWapps/readest-app/src/services/bookService.ts130export function normalizeFilePathForIndex(path: string, osPlatform?: OsPlatform): string {CODE
LOWapps/readest-app/src/services/bookService.ts1202export async function resolveNativeBookFilePath(CODE
LOWapps/readest-app/src/services/backupService.ts142export function sanitizeSettingsForBackup(CODE
LOWapps/readest-app/src/services/bookContent.ts31async function resolveLegacyManagedSource(CODE
LOWapps/readest-app/src/services/settingsService.ts66export function migrateHighlightColorPrefs(read: ReadSettings): void {CODE
LOWapps/readest-app/src/services/translators/utils.ts87export function splitTextIntoSentenceChunks(CODE
LOWapps/readest-app/src/services/localsend/sounds.ts20export function setLocalSendSoundsEnabled(enabled: boolean): void {CODE
LOW…p/src/services/reedy/tools/builtins/createHighlight.ts26export function createCreateHighlightTool(CODE
LOW…src/services/reedy/tools/builtins/getReadingContext.ts14export function createGetReadingContextTool(CODE
LOW⚡…t-app/src/services/reedy/tools/builtins/memoryTools.ts135export function createSearchUserMemoryTool(deps: SearchMemoryToolDeps) {CODE
LOW⚡…t-app/src/services/reedy/tools/builtins/memoryTools.ts144export function createWriteUserMemoryTool(deps: WriteMemoryToolDeps) {CODE
LOW⚡…t-app/src/services/reedy/tools/builtins/memoryTools.ts153export function createSearchBookMemoryTool(deps: SearchMemoryToolDeps) {CODE
LOW⚡…t-app/src/services/reedy/tools/builtins/memoryTools.ts162export function createWriteBookMemoryTool(deps: WriteMemoryToolDeps) {CODE
LOW⚡…t-app/src/services/reedy/tools/builtins/memoryTools.ts171export function createSearchSessionMemoryTool(deps: SearchMemoryToolDeps) {CODE
LOW…p/src/services/ai/providers/ProxiedGatewayEmbedding.ts8export function createProxiedEmbeddingModel(options: ProxiedEmbeddingOptions): EmbeddingModel {CODE
LOW…s/readest-app/src/services/ai/adapters/ReedyBackend.ts162function mapToolEventToMetricEvent(CODE
LOWapps/readest-app/src/services/bookshelves/grouping.ts12export function getActiveBookshelfGroupBy(CODE
LOWapps/readest-app/src/services/webBrowser/webBrowser.ts61export async function subscribeWebBrowserDownloads(CODE
LOWapps/readest-app/src/services/send/clipSignIn.ts67export async function clipPageWithSignInFallback(CODE
LOWapps/readest-app/src/store/proofreadStore.ts378export function validateReplacementRulePattern(CODE
LOWapps/readest.koplugin/readest_syncclient.lua17local function isTransientTransportError(err)CODE
LOWapps/readest-calibre-plugin/tests/test_version.py12 def test_committed_version_matches_the_app(self):CODE
LOWapps/readest-calibre-plugin/tests/test_version.py18 def test_app_version_is_a_three_part_tuple(self):CODE
LOWapps/readest-calibre-plugin/tests/test_version.py33 def test_rewrites_a_stale_version(self):CODE
77 more matches not shown…
Hallucination Indicators7 hits · 70 pts
SeverityFileLineSnippetContext
CRITICAL…app/extensions/send-to-readest/src/popup/popup.test.ts209 const clipCall = chromeMock.runtime.sendMessage.mock.calls.find((c) => {CODE
CRITICAL…-app/src/__tests__/statistics/ttsStatsRecorder.test.ts51 mocks.db.insertPageEvent.mock.calls.map((call) => (call as unknown[])[1] as RecordedEvent);CODE
CRITICAL…app/reader/reader-content-close-saves-library.test.tsx126 const saved = h.appService.saveLibraryBooks.mock.calls.at(-1)![0] as Book[];CODE
CRITICAL…src/__tests__/hooks/useCapturedTurn-scrollLock.test.ts1124 const lastSample = h.controller.moveDrag.mock.calls.at(-1)!;CODE
CRITICAL…src/__tests__/hooks/useCapturedTurn-scrollLock.test.ts1128 expect(h.controller.moveDrag.mock.invocationCallOrder.at(-1)!).toBeLessThan(CODE
CRITICAL…_tests__/hooks/useSync-stale-settings-clobber.test.tsx162 const lastSaved = h.storeState.saveSettings.mock.calls.at(-1)![1];CODE
CRITICAL…dest-app/src/__tests__/services/tts-controller.test.ts2643 expect(content.overlayer.add.mock.calls.map((call) => call[0])).not.toContain(CODE
Fake / Example Data54 hits · 58 pts
SeverityFileLineSnippetContext
LOWpackages/swift-rs/README.md226 else return SRString("lorem ipsum")CODE
LOWpackages/swift-rs/README.md272 let value: SRString = "lorem ipsum".into();CODE
LOWpackages/swift-rs/README.md274 unsafe { swift_print(&value) }; // Will print "lorem ipsum" to the consoleCODE
LOWpackages/swift-rs/README.md285 let value = "lorem ipsum"CODE
LOWpackages/swift-rs/README.md306 println!("{}", value_srstring); // Will print "lorem ipsum" to the consoleCODE
LOW…s/readest-app/src/app/library/components/GroupItem.tsx244 <div className='placeholder' style={{ height: `${iconSize15}px` }}></div>CODE
LOWapps/readest-app/src/styles/globals.css1000 [data-eink='true'] [class*='placeholder']::placeholder {CODE
LOWapps/readest-app/src/__tests__/reedy/CfiChunker.test.ts112 const paragraph = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. '.repeat(40);CODE
LOWapps/readest-app/src/__tests__/reedy/CfiChunker.test.ts112 const paragraph = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. '.repeat(40);CODE
LOW…rc/__tests__/app/reader/utils/notebookRecovery.test.ts17 expect(getNotebookRecoveryKey('user@example.com', 'book-hash')).toBe(CODE
LOW…app/reader/components/notebook/NotebookEditor.test.tsx33 expect(editor.getAttribute('placeholder')).toBe('Start writing about this book…');CODE
LOW…tests__/app/library/import-pasted-text-dialog.test.tsx72 expect(screen.getByLabelText('Book title')).toHaveProperty('placeholder', 'Morning briefing');CODE
LOW…st-app/src/__tests__/app/library/group-header.test.tsx63 render(<GroupHeader groupBy={LibraryGroupByType.Author} groupName='Jane Doe' />);CODE
LOW…readest-app/src/__tests__/utils/md-frontmatter.test.ts153 expect(metadata.author).toEqual(['Jane Doe', 'John Roe']);CODE
LOW…est-app/src/__tests__/utils/dialogue-highlight.test.ts429 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magCODE
LOW…est-app/src/__tests__/utils/dialogue-highlight.test.ts429 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magCODE
LOWapps/readest-app/src/__tests__/utils/md.test.ts194 expect(fm.metadata.author).toBe('Jane Doe');CODE
LOWapps/readest-app/src/__tests__/utils/html.test.ts27 `<p>${'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor. '.repeat(n)}</p>`;CODE
LOWapps/readest-app/src/__tests__/utils/html.test.ts27 `<p>${'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor. '.repeat(n)}</p>`;CODE
LOWapps/readest-app/src/__tests__/utils/html.test.ts55 expect(text).toContain('Lorem ipsum');CODE
LOWapps/readest-app/src/__tests__/utils/html.test.ts287 expect(doc.body.textContent).toContain('Lorem ipsum');CODE
LOWapps/readest-app/src/__tests__/utils/html.test.ts340 expect(doc.body.textContent).toContain('Lorem ipsum');CODE
LOW⚡…/readest-app/src/__tests__/utils/library-utils.test.ts48 expect(parseAuthors('John Smith, Jane Doe')).toEqual(['John Smith', 'Jane Doe']);CODE
LOW⚡…/readest-app/src/__tests__/utils/library-utils.test.ts52 expect(parseAuthors('John Smith & Jane Doe')).toEqual(['John Smith', 'Jane Doe']);CODE
LOW⚡…/readest-app/src/__tests__/utils/library-utils.test.ts56 expect(parseAuthors('John Smith and Jane Doe')).toEqual(['John Smith', 'Jane Doe']);CODE
LOW⚡…/readest-app/src/__tests__/utils/library-utils.test.ts62 'Jane Doe',CODE
LOW⚡…/readest-app/src/__tests__/utils/library-utils.test.ts70 'Jane Doe',CODE
LOW⚡…/readest-app/src/__tests__/utils/library-utils.test.ts76 expect(parseAuthors(' John Smith , Jane Doe ')).toEqual(['John Smith', 'Jane Doe']);CODE
LOW…/readest-app/src/__tests__/utils/library-utils.test.ts220 const jane = groups.find((g) => g.name === 'Jane Doe');CODE
LOWapps/readest-app/src/__tests__/utils/txt-worker.test.ts55 const options = { file, author: 'Jane Doe', language: 'zh' };CODE
LOW…t/paginator-page-progression-direction.browser.test.ts15 (_, i) => `<p>paragraph ${i} ${'lorem ipsum dolor sit amet consectetur '.repeat(8)}</p>`,CODE
LOW…t/paginator-page-progression-direction.browser.test.ts15 (_, i) => `<p>paragraph ${i} ${'lorem ipsum dolor sit amet consectetur '.repeat(8)}</p>`,CODE
LOW…adest-app/src/__tests__/libs/replicaSyncClient.test.ts4 getAccessToken: vi.fn(async () => 'fake-token'),CODE
LOW…adest-app/src/__tests__/libs/replicaSyncClient.test.ts51 expect(init.headers.Authorization).toBe('Bearer fake-token');CODE
LOWapps/readest-app/src/__tests__/ai/chunker.test.ts67 const longText = 'Lorem ipsum dolor sit amet. '.repeat(50);CODE
LOWapps/readest-app/src/__tests__/ai/chunker.test.ts67 const longText = 'Lorem ipsum dolor sit amet. '.repeat(50);CODE
LOW…t-app/src/__tests__/services/opds-feed-checker.test.ts731 author: 'Jane Doe',CODE
LOW…adest-app/src/__tests__/services/opds-metadata.test.ts15 { name: 'Jane Doe', links: [] },CODE
LOW…adest-app/src/__tests__/services/opds-metadata.test.ts28 expect(result.author).toEqual(['Jane Doe', 'John Smith']);CODE
LOW…adest-app/src/__tests__/services/opds-metadata.test.ts129 author: ['Jane Doe', 'John Smith'],CODE
LOW…adest-app/src/__tests__/services/opds-metadata.test.ts142 expect(book.author).toContain('Jane Doe');CODE
LOW…c/__tests__/services/send-convert-page-unified.test.ts41 <p>${'lorem ipsum dolor sit amet '.repeat(40)}</p>CODE
LOW…c/__tests__/services/send-convert-page-unified.test.ts41 <p>${'lorem ipsum dolor sit amet '.repeat(40)}</p>CODE
LOW…eadest-app/src/__tests__/services/send-address.test.ts20 expect(slugFromIdentity('Jane Doe')).toBe('janedoe');CODE
LOW…pp/src/__tests__/services/send-cover-generator.test.ts43 author: 'Jane Doe',CODE
LOW…pp/src/__tests__/services/send-cover-generator.test.ts46 expect(svg).toContain('Jane Doe');CODE
LOW⚡…pp/src/__tests__/services/send-cover-generator.test.ts126 expect(pickTheme('Jane Doe')).toEqual(pickTheme('Jane Doe'));CODE
LOW⚡…pp/src/__tests__/services/send-cover-generator.test.ts131 const theme = pickTheme('Jane Doe');CODE
LOW⚡…pp/src/__tests__/services/send-cover-generator.test.ts137 expect(pickTheme(' Jane Doe ')).toEqual(pickTheme('Jane Doe'));CODE
LOW…/services/sync/providers/icloud/ICloudProvider.test.ts147 state.files.set(abs('/Readest/.library.json.icloud'), 'placeholder');CODE
LOW…p/src/__tests__/services/sync/adapters/texture.test.ts12 id: 'placeholder',CODE
LOW…-app/src/__tests__/services/sync/adapters/font.test.ts12 id: 'placeholder',CODE
LOW…rc/__tests__/services/sync/adapters/dictionary.test.ts11 id: 'placeholder',CODE
LOW…ps/readest.koplugin/spec/library/group_covers_spec.lua98 cloud_covers.set_opts({ sync_auth = "fake-token" })CODE
Empty Error Handlers9 hits · 45 pts
SeverityFileLineSnippetContext
HIGHapps/readest-calibre-plugin/worker.py42except NameError:CODE
HIGHapps/readest-calibre-plugin/worker.py357except OSError:CODE
HIGHapps/readest-calibre-plugin/config.py11except NameError:CODE
HIGHapps/readest-calibre-plugin/ui.py16except NameError:CODE
HIGHapps/readest-calibre-plugin/__init__.py8except NameError:CODE
HIGHapps/readest-calibre-plugin/api.py296except Exception:CODE
HIGHapps/readest-calibre-plugin/dialogs.py34except NameError:CODE
HIGHapps/readest-calibre-plugin/dialogs.py152except TypeError:CODE
HIGHapps/readest-calibre-plugin/oauth.py71except ValueError:CODE
AI Slop Vocabulary12 hits · 36 pts
SeverityFileLineSnippetContext
MEDIUM.github/workflows/pull-request.yml352 # the Rust backend, the vendored native packages, nor the tauri test harnessCOMMENT
MEDIUMapps/readest-app/scripts/test-tauri.sh59# exists in this harness run.COMMENT
MEDIUMapps/readest-app/src-tauri/Cargo.toml20# only for the webdriver test harness (scripts/test-tauri.sh) — every LinuxCOMMENT
MEDIUM…tive-tts/android/src/main/java/MediaPlaybackService.kt1302 // Promote with an explicit mediaPlayback type (required/robust onCOMMENT
MEDIUM⚡apps/readest-app/data/wordlens/en-fr.json1{"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived frCODE
MEDIUM⚡apps/readest-app/data/wordlens/en-fr.json1{"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived frCODE
MEDIUM⚡apps/readest-app/data/wordlens/en-fr.json1{"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived frCODE
MEDIUM⚡apps/readest-app/data/wordlens/en-fr.json1{"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived frCODE
MEDIUM⚡apps/readest-app/data/wordlens/en-fr.json1{"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived frCODE
MEDIUM⚡apps/readest-app/data/wordlens/en-fr.json1{"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived frCODE
MEDIUM…ps/readest-app/src/app/reader/hooks/useProgressSync.ts402 // TODO: general config sync via a more robust profile-based solution.COMMENT
MEDIUM…c/__tests__/services/tts-auto-advance.browser.test.tsx550 // The robust, event-agnostic observable: the section the iterator's CURRENTCOMMENT
Structural Annotation Overuse16 hits · 28 pts
SeverityFileLineSnippetContext
LOWapps/readest-app/.claude/skills/i18n-koplugin/SKILL.md14## Step 1: Determine the working directoryCOMMENT
LOWapps/readest-app/.claude/skills/i18n-koplugin/SKILL.md18## Step 2: Extract msgids from Lua sourcesCOMMENT
LOWapps/readest-app/.claude/skills/i18n-koplugin/SKILL.md34## Step 3: Find untranslated entriesCOMMENT
LOWapps/readest-app/.claude/skills/i18n-koplugin/SKILL.md62## Step 4: Translate empty msgstrsCOMMENT
LOWapps/readest-app/.claude/skills/i18n-koplugin/SKILL.md98## Step 5: VerifyCOMMENT
LOWapps/readest-app/.claude/skills/i18n/SKILL.md13## Step 0: Determine the modeCOMMENT
LOWapps/readest-app/.claude/skills/i18n/SKILL.md18## Step 1: Determine the working directoryCOMMENT
LOW⚡apps/readest-app/.claude/skills/i18n/SKILL.md54### Step 2: Extract i18n stringsCOMMENT
LOW⚡apps/readest-app/.claude/skills/i18n/SKILL.md63### Step 3: Find untranslated stringsCOMMENT
LOW⚡apps/readest-app/.claude/skills/i18n/SKILL.md71### Step 4: Translate missing stringsCOMMENT
LOWapps/readest-app/.claude/skills/i18n/SKILL.md90### Step 5: VerifyCOMMENT
LOWapps/readest-app/docs/testing.md39### Step 1: Start the Tauri AppCOMMENT
LOWapps/readest-app/docs/testing.md55### Step 2: Run TestsCOMMENT
LOW⚡apps/readest-app/scripts/ios16-fonts-ready-repro.py42 // Step 1: create the JS deferred promise while processingLoadEvent.COMMENT
LOW⚡apps/readest-app/scripts/ios16-fonts-ready-repro.py45 // Step 2: inject the @font-face and force a synchronous layout so theCOMMENT
LOWapps/readest-app/scripts/ios16-fonts-ready-repro.py56 // Step 3: with the font still in flight, swap the stylesheet likeCOMMENT
Modern AI Meta-Vocabulary6 hits · 16 pts
SeverityFileLineSnippetContext
MEDIUM.github/workflows/android-e2e.yml102 # the gradle scaffolding, then restore the tracked customizationsCOMMENT
MEDIUMapps/readest-app/docs/architecture.md420### 6.3 AI / RAGCOMMENT
MEDIUM…ive-bridge/android/src/main/java/NativeBridgePlugin.kt302 // page observes it (#5693). InputManager is event-driven, so use it only toCOMMENT
MEDIUM⚡apps/readest-app/data/wordlens/en-fr.json1{"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived frCODE
MEDIUM⚡apps/readest-app/data/wordlens/en-fr.json1{"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived frCODE
MEDIUMapps/readest-calibre-plugin/scripts/i18n.py14 python3 scripts/i18n.py new LANG # scaffold translations/LANG.poSTRING
Cross-Language Confusion2 hits · 15 pts
SeverityFileLineSnippetContext
HIGH⚡apps/readest-calibre-plugin/scripts/i18n.py57 'ru': 'nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 'CODE
HIGH⚡apps/readest-calibre-plugin/scripts/i18n.py58 '&& (n%100<10 || n%100>=20) ? 1 : 2);',CODE
Excessive Try-Catch Wrapping10 hits · 10 pts
SeverityFileLineSnippetContext
LOW…/readest-app/.claude/skills/triage-github/watch-prs.py131 except Exception as e: # one failing PR must not stop the watch, but never stay silentCODE
LOWapps/readest-calibre-plugin/worker.py100 except Exception:CODE
LOWapps/readest-calibre-plugin/worker.py142 except Exception:CODE
LOWapps/readest-calibre-plugin/worker.py177 except Exception as err:CODE
LOWapps/readest-calibre-plugin/worker.py202 except Exception:CODE
LOWapps/readest-calibre-plugin/worker.py216 except Exception:CODE
LOWapps/readest-calibre-plugin/worker.py280 except Exception as err:CODE
LOWapps/readest-calibre-plugin/worker.py310 except Exception:CODE
LOWapps/readest-calibre-plugin/worker.py411 except Exception as err:CODE
LOWapps/readest-calibre-plugin/api.py296 except Exception:CODE
Verbosity Indicators4 hits · 8 pts
SeverityFileLineSnippetContext
LOW⚡apps/readest-app/scripts/ios16-fonts-ready-repro.py42 // Step 1: create the JS deferred promise while processingLoadEvent.COMMENT
LOW⚡apps/readest-app/scripts/ios16-fonts-ready-repro.py45 // Step 2: inject the @font-face and force a synchronous layout so theCOMMENT
LOWapps/readest-app/scripts/ios16-fonts-ready-repro.py56 // Step 3: with the font still in flight, swap the stylesheet likeCOMMENT
LOWapps/readest-app/src/services/cloudService.ts371 // some books may not have cover image, so we need to check if the book is downloadedCOMMENT
Self-Referential Comments1 hit · 4 pts
SeverityFileLineSnippetContext
MEDIUM⚡apps/readest-calibre-plugin/scripts/i18n.py65# This file is distributed under the same license as the Readest calibre plugin.COMMENT
Deep Nesting4 hits · 4 pts
SeverityFileLineSnippetContext
LOW…/readest-app/.claude/skills/triage-github/watch-prs.py114CODE
LOWapps/readest-calibre-plugin/scripts/i18n.py131CODE
LOWapps/readest-calibre-plugin/scripts/i18n.py214CODE
LOWapps/readest-calibre-plugin/scripts/i18n.py356CODE
Slop Phrases1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUM.github/workflows/codeql.yml60 # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize howCOMMENT
Redundant / Tautological Comments2 hits · 3 pts
SeverityFileLineSnippetContext
LOWapps/readest-app/scripts/sync-release-notes.sh36# Check if required commands are availableCOMMENT
LOWapps/readest-app/scripts/sync-release-notes.sh64# Check if releases key existsCOMMENT
Overly Generic Function Names2 hits · 2 pts
SeverityFileLineSnippetContext
LOWapps/readest-app/src/app/api/opds/proxy/route.ts96async function handleRequest(request: NextRequest, method: 'GET' | 'HEAD') {CODE
LOWapps/readest-app/src/utils/warichu.ts367function getData(el: HTMLElement) {CODE
TODO Padding1 hit · 2 pts
SeverityFileLineSnippetContext
LOWapps/readest-app/src/services/tts/TTSController.ts334 // TODO: implement native TTS client for desktop platforms.COMMENT