Repository Analysis

readest/readest

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.

2.3 Likely human-written View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of readest/readest, a TypeScript project with 22,335 GitHub stars. SynthScan v2.0 examined 450,237 lines of code across 2322 source files, recording 556 pattern matches distributed across 14 syntactic categories. The overall adjusted score of 2.3 places this repository in the Likely human-written 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).

2.3
Adjusted Score
2.3
Raw Score
100%
Time Factor
2026-07-14
Last Push
22.3K
Stars
TypeScript
Language
450.2K
Lines of Code
2.3K
Files
556
Pattern Hits
2026-07-14
Scan Date
0.00
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

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.

Severity Breakdown

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.

CRITICAL 2HIGH 0MEDIUM 221LOW 333

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 556 distinct pattern matches across 14 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.

Decorative Section Separators205 hits · 622 pts
SeverityFileLineSnippetContext
MEDIUM.github/workflows/nightly.yml175 # ──────────────────────────── ANDROID ────────────────────────────COMMENT
MEDIUM.github/workflows/nightly.yml215 # ──────────────────────────── DESKTOP ────────────────────────────COMMENT
MEDIUM.github/workflows/nightly.yml321 # ───────────────── COLLECT ARTIFACTS + BUILD FRAGMENT ─────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs24// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs26// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs113// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs115// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs243// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs245// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs274// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs276// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs337// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs339// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs362// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs364// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs379// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs381// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs466// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs468// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs528// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…est-app/extensions/windows-thumbnail/src/extraction.rs530// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs38// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs40// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs74// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs76// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs113// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs115// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs268// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs270// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs325// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs327// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs383// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…t-app/extensions/windows-thumbnail/src/com_provider.rs385// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift1249 // ── Sync passphrase keychain ──────────────────────────────────────────COMMENT
MEDIUM…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift1327 // ── Keyed secure key-value store ──────────────────────────────────COMMENT
MEDIUM…ive-bridge/android/src/main/java/NativeBridgePlugin.kt1136 // ── Sync passphrase keychain ──────────────────────────────────────COMMENT
MEDIUM…ive-bridge/android/src/main/java/NativeBridgePlugin.kt1221 // ── Keyed secure key-value store ──────────────────────────────────COMMENT
MEDIUM…tauri/plugins/tauri-plugin-native-bridge/src/models.rs292// ── Sync passphrase keychain ────────────────────────────────────────────COMMENT
MEDIUM…tauri/plugins/tauri-plugin-native-bridge/src/models.rs362// ── Keyed secure key-value store ─────────────────────────────────────────COMMENT
MEDIUM…auri/plugins/tauri-plugin-native-bridge/src/desktop.rs203 // ── Sync passphrase keychain ────────────────────────────────────────COMMENT
MEDIUM…auri/plugins/tauri-plugin-native-bridge/src/desktop.rs289 // ── Keyed secure key-value store ────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src-tauri/gen/apple/project.yml36 # ----------------------------------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.ts177// ─── parse_epub_full (open hot-path prefetch) ────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/bridge.ts282// ── Sync passphrase keychain ────────────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/bridge.ts327// ── Keyed secure key-value store ─────────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/bridge.ts368// ── Reading widget ────────────────────────────────────────────────────────COMMENT
MEDIUMapps/readest-app/src/utils/bridge.ts394// ── 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
MEDIUMapps/readest-app/src/utils/event.ts71// ─── Settled events (one-shot, replay-on-subscribe) ────────────────────COMMENT
MEDIUM…p/src/__tests__/tauri/epub-parser-parity.tauri.test.ts39// ─── Rust IPC return shapes (serde camelCase) ────────────────────────COMMENT
MEDIUM…p/src/__tests__/tauri/epub-parser-parity.tauri.test.ts60// ─── helpers ─────────────────────────────────────────────────────────COMMENT
145 more matches not shown…
Over-Commented Block200 hits · 200 pts
SeverityFileLineSnippetContext
LOWCargo.toml41tauri = { path = "packages/tauri/crates/tauri" }COMMENT
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/codeql.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOW.github/workflows/scorecard.yml41 - name: "Run analysis"COMMENT
LOWapps/readest-app/vitest.tauri.setup.ts1// Vitest runs tests inside an iframe, but Tauri injects its plugin internalsCOMMENT
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/src-tauri/Cargo.toml81# href is percent-encoded (e.g. spaces as %20, CJK paths) but the zip storesCOMMENT
LOWapps/readest-app/src-tauri/Cargo.toml101COMMENT
LOW…ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift121 // Remote command targets we registered. The lock-screen command centerCOMMENT
LOW…ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift141 private var lastSessionOpTime = Date.distantPastCOMMENT
LOW…ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift181 // iOS runtime — and it is the ONLY lever that flips the client's playbackCOMMENT
LOW…tive-tts/android/src/main/java/MediaPlaybackService.kt241 // Deliver metadata/state updates to the live service in-process ratherCOMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift521 // leaving the system stuck at the app's level until the user nudges itCOMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift621 /// Bridge between the Readest Share Extension (separate process) andCOMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift1401 // Bridge for the system-dictionary "Look Up" surface on iOS.COMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift1441 // dictionary availability, but the staticCOMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift1521 }COMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift1661/// and stash the bytes in `UserDefaults` keyed by the POSIX path.COMMENT
LOW…gin-native-bridge/ios/Sources/NativeBridgePlugin.swift1781/// picker invocations would each hold their own state — currently weCOMMENT
LOW…ugin-native-bridge/ios/Sources/ClipUrlController.swift41 case .loadFailed(let detail): return "Could not fetch this page: \(detail)"COMMENT
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.kt321 // shared-intent events emitted before the JS side has registered itsCOMMENT
LOW…tauri/plugins/tauri-plugin-native-bridge/src/models.rs241pub struct OpenExternalUrlResponse {COMMENT
LOW…tauri/plugins/tauri-plugin-native-bridge/src/models.rs321/// Args for the mobile URL-clip flow. Mirrors the public `ClipOptions`COMMENT
LOW…tauri/plugins/tauri-plugin-native-bridge/src/models.rs361COMMENT
LOW…auri/plugins/tauri-plugin-native-bridge/src/desktop.rs201 }COMMENT
LOWapps/readest-app/src-tauri/gen/apple/project.yml41 # DEVELOPMENT_TEAM is set; inherits IAP from the App ID.COMMENT
LOWapps/readest-app/src-tauri/gen/apple/project.yml161 # may overwrite the file (even with no properties declared) duringCOMMENT
LOW…rc-tauri/gen/apple/ShareExtension/AppGroupBridge.swift1// Shared App Group container schema between the Readest Share Extension andCOMMENT
LOW…uri/gen/apple/ShareExtension/ShareViewController.swift1// Share Extension for Readest: catches an article URL from any iOS shareCOMMENT
LOW…uri/gen/apple/ShareExtension/ShareViewController.swift21//COMMENT
LOWapps/readest-app/src-tauri/src/spawn_fresh_browser.rs1//! Open a URL in a freshly-spawned, isolated browser process.COMMENT
LOWapps/readest-app/src-tauri/src/spawn_fresh_browser.rs21//!COMMENT
LOWapps/readest-app/src-tauri/src/lib.rs81 log::error!("Failed to allow directory in asset_protocol_scope: {e}");COMMENT
LOWapps/readest-app/src-tauri/src/lib.rs101/// - On desktop, this command refuses to extend `asset_protocol_scope`COMMENT
LOWapps/readest-app/src-tauri/src/lib.rs121/// can only read paths for which it holds a security-scopedCOMMENT
LOWapps/readest-app/src-tauri/src/lib.rs281 #[cfg(not(target_os = "linux"))]COMMENT
LOWapps/readest-app/src-tauri/src/clip_url.rs1// Spawn a hidden Tauri webview that loads the target URL with the realCOMMENT
LOWapps/readest-app/src-tauri/src/clip_url.rs21// invoke('clip_url', url) ─┬─▶ bind 127.0.0.1:RANDOM_PORTCOMMENT
LOWapps/readest-app/src-tauri/src/clip_url.rs541 window.__readest_setStatus__(CAPTURING_STATUS);COMMENT
LOWapps/readest-app/src-tauri/src/clip_url.rs581 // Hard fallback in case `load` never fires (SPA, error state,COMMENT
LOWapps/readest-app/src-tauri/src/clip_url.rs661}COMMENT
LOWapps/readest-app/src-tauri/src/mobi_parser.rs1// Native MOBI/AZW/AZW3 import path.COMMENT
LOWapps/readest-app/src-tauri/src/mobi_parser.rs21// - locate the cover image (EXTH `CoverOffset` 201 → `ThumbOffset` 202COMMENT
140 more matches not shown…
Hyper-Verbose Identifiers73 hits · 86 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.ts304export function expandAllRenderedSections(view: FoliateView | null, note: BookNote): void {CODE
LOW…/readest-app/src/app/reader/utils/globalAnnotations.ts343export function removeGlobalAnnotationOverlays(CODE
LOWapps/readest-app/src/app/reader/utils/annotatorUtil.ts145export function getHandlePositionsFromRange(CODE
LOWapps/readest-app/src/app/reader/utils/annotatorUtil.ts277export function removeEmptyAnnotationPlaceholder(CODE
LOWapps/readest-app/src/app/reader/utils/annotatorUtil.ts305export function buildTTSSentenceHighlight(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.ts84async function handleSuccessfulSubscription(session: Stripe.Checkout.Session, userId: string) {CODE
LOWapps/readest-app/src/app/api/stripe/webhook/route.ts162async function handleSubscriptionUpdated(subscription: Stripe.Subscription) {CODE
LOWapps/readest-app/src/app/api/stripe/webhook/route.ts180async function handleSubscriptionCancelled(subscription: Stripe.Subscription) {CODE
LOWapps/readest-app/src/libs/payment/iap/apple/server.ts30export 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.ts40export async function createOrUpdateSubscription(userId: string, purchase: VerifiedPurchase) {CODE
LOW…-app/src/__tests__/hooks/useSpatialNavigation.test.tsx56function simulateKeyboardActivation() {CODE
LOWapps/readest-app/src/hooks/usePullToRefresh.ts104 function updateLoadingSpinnerPosition(el: HTMLDivElement, transform: number, dy: number) {CODE
LOWapps/readest-app/src/pages/api/sync.ts60export function resolveReadingStatusMerge(CODE
LOWapps/readest-app/src/pages/api/sync.ts87export function buildStatusPropagationRow(CODE
LOWapps/readest-app/src/services/cloudService.ts134export async function downloadReplicaFileFromCloud(CODE
LOWapps/readest-app/src/services/cloudService.ts153export async function deleteReplicaBundleFromCloud(CODE
LOWapps/readest-app/src/services/bookService.ts85export function normalizeFilePathForIndex(path: string, osPlatform?: OsPlatform): string {CODE
LOWapps/readest-app/src/services/bookService.ts723export async function resolveNativeBookFilePath(CODE
LOWapps/readest-app/src/services/backupService.ts113export function sanitizeSettingsForBackup(CODE
LOWapps/readest-app/src/services/bookContent.ts28async function resolveLegacyManagedSource(CODE
LOWapps/readest-app/src/services/settingsService.ts64export function migrateHighlightColorPrefs(read: ReadSettings): void {CODE
LOW…adest-app/src/services/translators/providers/yandex.ts10async function translateSingleTextForService(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/store/proofreadStore.ts370export function validateReplacementRulePattern(CODE
LOWapps/readest-calibre-plugin/tests/test_hashes.py40 def test_small_file_reads_everything(self):CODE
LOWapps/readest-calibre-plugin/tests/test_hashes.py50 def test_skips_middle_of_larger_file(self):CODE
LOWapps/readest-calibre-plugin/tests/test_hashes.py82 def test_prefers_uuid_over_isbn(self):CODE
LOWapps/readest-calibre-plugin/tests/test_hashes.py88 def test_calibre_scheme_preferred_over_isbn(self):CODE
LOWapps/readest-calibre-plugin/tests/test_hashes.py94 def test_urn_identifier_sliced_after_last_colon(self):CODE
LOWapps/readest-calibre-plugin/tests/test_hashes.py103 def test_plain_identifier_without_scheme(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py110 def test_single_author_is_string(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py122 def test_strips_nul_characters(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py143 def test_meta_hash_uses_uuid_identifier(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py170 def test_new_book_without_cover(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py175 def test_unchanged_book_is_skipped(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py180 def test_changed_metadata_is_update(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py187 def test_changed_cover_only_is_update_with_cover(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py193 def test_tombstoned_row_is_resurrected(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py200 def test_tags_change_is_update(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py205 def test_missing_local_cover_does_not_force_update(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py210 def test_row_without_file_is_replaced(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py218 def test_changed_source_file_is_replaced(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py251 def test_index_prefers_live_row(self):CODE
LOWapps/readest-calibre-plugin/tests/test_wire.py261 def test_index_prefers_newer_row(self):CODE
13 more matches not shown…
Fake / Example Data35 hits · 40 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.tsx218 <div className='placeholder' style={{ height: `${iconSize15}px` }}></div>CODE
LOWapps/readest-app/src/styles/globals.css525[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…st-app/src/__tests__/app/library/group-header.test.tsx56 render(<GroupHeader groupBy={LibraryGroupByType.Author} groupName='Jane Doe' />);CODE
LOWapps/readest-app/src/__tests__/utils/md.test.ts132 expect(fm.metadata.author).toBe('Jane Doe');CODE
LOW…/readest-app/src/__tests__/utils/library-utils.test.ts44 expect(parseAuthors('John Smith, Jane Doe')).toEqual(['John Smith', 'Jane Doe']);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 and Jane Doe')).toEqual(['John Smith', 'Jane Doe']);CODE
LOW…/readest-app/src/__tests__/utils/library-utils.test.ts58 'Jane Doe',CODE
LOW…/readest-app/src/__tests__/utils/library-utils.test.ts66 'Jane Doe',CODE
LOW…/readest-app/src/__tests__/utils/library-utils.test.ts72 expect(parseAuthors(' John Smith , Jane Doe ')).toEqual(['John Smith', 'Jane Doe']);CODE
LOW…/readest-app/src/__tests__/utils/library-utils.test.ts216 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…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…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…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
AI Slop Vocabulary10 hits · 30 pts
SeverityFileLineSnippetContext
MEDIUMapps/readest-app/scripts/test-tauri.sh54# exists in this harness run.COMMENT
MEDIUM…tive-tts/android/src/main/java/MediaPlaybackService.kt553 // Promote with an explicit mediaPlayback type (required/robust onCOMMENT
MEDIUMapps/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-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-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-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-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-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.ts249 // TODO: general config sync via a more robust profile-based solution.COMMENT
MEDIUM…c/__tests__/services/tts-auto-advance.browser.test.tsx541 // The robust, event-agnostic observable: the section the iterator's CURRENTCOMMENT
Structural Annotation Overuse13 hits · 22 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
LOWapps/readest-app/.claude/skills/i18n/SKILL.md54### Step 2: Extract i18n stringsCOMMENT
LOWapps/readest-app/.claude/skills/i18n/SKILL.md63### Step 3: Find untranslated stringsCOMMENT
LOWapps/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.md37### Step 1: Start the Tauri AppCOMMENT
LOWapps/readest-app/docs/testing.md53### Step 2: Run TestsCOMMENT
Hallucination Indicators2 hits · 20 pts
SeverityFileLineSnippetContext
CRITICAL…app/extensions/send-to-readest/src/popup/popup.test.ts188 const clipCall = chromeMock.runtime.sendMessage.mock.calls.find((c) => {CODE
CRITICAL…_tests__/hooks/useSync-stale-settings-clobber.test.tsx162 const lastSaved = h.storeState.saveSettings.mock.calls.at(-1)![1];CODE
Modern AI Meta-Vocabulary4 hits · 12 pts
SeverityFileLineSnippetContext
MEDIUM.github/workflows/android-e2e.yml86 # the gradle scaffolding, then restore the tracked customizationsCOMMENT
MEDIUMapps/readest-app/docs/architecture.md405### 6.3 AI / RAGCOMMENT
MEDIUMapps/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-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
Excessive Try-Catch Wrapping7 hits · 8 pts
SeverityFileLineSnippetContext
LOWapps/readest-calibre-plugin/worker.py58 except Exception:CODE
LOWapps/readest-calibre-plugin/worker.py102 except Exception:CODE
LOWapps/readest-calibre-plugin/worker.py131 except Exception as err:CODE
LOWapps/readest-calibre-plugin/worker.py150 except Exception as err:CODE
LOWapps/readest-calibre-plugin/worker.py178 except Exception:CODE
MEDIUMapps/readest-calibre-plugin/worker.py123def run(self):CODE
LOWapps/readest-calibre-plugin/api.py266 except Exception:CODE
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.ts46async function handleRequest(request: NextRequest, method: 'GET' | 'HEAD') {CODE
LOWapps/readest-app/src/utils/warichu.ts367function getData(el: HTMLElement) {CODE
Verbosity Indicators1 hit · 2 pts
SeverityFileLineSnippetContext
LOWapps/readest-app/src/services/cloudService.ts346 // some books may not have cover image, so we need to check if the book is downloadedCOMMENT
TODO Padding1 hit · 2 pts
SeverityFileLineSnippetContext
LOWapps/readest-app/src/services/tts/TTSController.ts182 // TODO: implement native TTS client for desktop platforms.COMMENT