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.
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.
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.
Can maintainers explain intent, assumptions, and trade-offs? 587 finding(s).
Are imports declared and package/API names verified? 63 finding(s).
Are wrappers, guards, and repeated structures necessary? 378 finding(s).
Which changes need focused human review? 891 finding(s).
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.
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.
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.
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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/nightly.yml | 247 | # ──────────────────────────── ANDROID ──────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/nightly.yml | 294 | # ──────────────────────────── DESKTOP ──────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/nightly.yml | 398 | # ───────────────── COLLECT ARTIFACTS + BUILD FRAGMENT ───────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 26 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 28 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 115 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 117 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 245 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 247 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 276 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 278 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 339 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 341 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 364 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 366 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 382 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 384 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 469 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 471 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 531 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est-app/extensions/windows-thumbnail/src/extraction.rs | 533 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t-app/extensions/windows-thumbnail/src/com_provider.rs | 50 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t-app/extensions/windows-thumbnail/src/com_provider.rs | 52 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t-app/extensions/windows-thumbnail/src/com_provider.rs | 96 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t-app/extensions/windows-thumbnail/src/com_provider.rs | 98 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t-app/extensions/windows-thumbnail/src/com_provider.rs | 135 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t-app/extensions/windows-thumbnail/src/com_provider.rs | 137 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t-app/extensions/windows-thumbnail/src/com_provider.rs | 406 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t-app/extensions/windows-thumbnail/src/com_provider.rs | 408 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t-app/extensions/windows-thumbnail/src/com_provider.rs | 463 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t-app/extensions/windows-thumbnail/src/com_provider.rs | 465 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t-app/extensions/windows-thumbnail/src/com_provider.rs | 521 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t-app/extensions/windows-thumbnail/src/com_provider.rs | 523 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …gin-native-bridge/ios/Sources/NativeBridgePlugin.swift | 1644 | // ── Sync passphrase keychain ────────────────────────────────────────── | COMMENT |
| MEDIUM | …gin-native-bridge/ios/Sources/NativeBridgePlugin.swift | 1722 | // ── Keyed secure key-value store ────────────────────────────────── | COMMENT |
| MEDIUM | …-plugin-native-bridge/ios/Sources/AppGroupBridge.swift | 83 | // ── Shared clip HTML files (extension writes, host reads) ────────── | COMMENT |
| MEDIUM | …ive-bridge/android/src/main/java/NativeBridgePlugin.kt | 1722 | // ── Sync passphrase keychain ────────────────────────────────────── | COMMENT |
| MEDIUM | …ive-bridge/android/src/main/java/NativeBridgePlugin.kt | 1807 | // ── Keyed secure key-value store ────────────────────────────────── | COMMENT |
| MEDIUM | …tauri/plugins/tauri-plugin-native-bridge/src/models.rs | 390 | // ── Sync passphrase keychain ──────────────────────────────────────────── | COMMENT |
| MEDIUM | …tauri/plugins/tauri-plugin-native-bridge/src/models.rs | 533 | // ── Keyed secure key-value store ───────────────────────────────────────── | COMMENT |
| MEDIUM | …auri/plugins/tauri-plugin-native-bridge/src/desktop.rs | 250 | // ── Sync passphrase keychain ──────────────────────────────────────── | COMMENT |
| MEDIUM | …auri/plugins/tauri-plugin-native-bridge/src/desktop.rs | 361 | // ── Keyed secure key-value store ──────────────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src-tauri/gen/apple/project.yml | 36 | # ---------------------------------- | COMMENT |
| MEDIUM | …rc-tauri/gen/apple/ShareExtension/AppGroupBridge.swift | 102 | // ── Shared clip HTML files (extension writes, host reads) ────────── | COMMENT |
| MEDIUM | …est-app/src/app/reader/components/rsvp/RSVPControl.tsx | 39 | // ─── TTS-sync decision logic (slice 5, #3235) ────────────────────────── | COMMENT |
| MEDIUM | …est-app/src/app/reader/components/rsvp/RSVPControl.tsx | 39 | // ─── TTS-sync decision logic (slice 5, #3235) ────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/tauriEpubBridge.ts | 38 | // ─── shared helpers ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/tauriEpubBridge.ts | 55 | // ─── parse_epub_metadata (import path) ─────────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/tauriEpubBridge.ts | 230 | // ─── parse_epub_full (open hot-path prefetch) ──────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/bridge.ts | 465 | // ── Sync passphrase keychain ──────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/bridge.ts | 510 | // ── Keyed secure key-value store ───────────────────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/bridge.ts | 551 | // ── Bookshelf widget ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/bridge.ts | 641 | // ── Reading widget ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/bridge.ts | 710 | // ── Nightly updater (main-app commands, no native-bridge prefix) ───────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/tauriMobiBridge.ts | 42 | // ─── shared helpers ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/tauriMobiBridge.ts | 70 | // ─── parse_mobi_metadata (import path) ─────────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/warichu.ts | 120 | // ── Core measurement ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/warichu.ts | 173 | // ── Build nodes ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/warichu.ts | 356 | // ── Helpers ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/readest-app/src/utils/warichu.ts | 472 | // ── HTML slicing helpers ────────────────────────────────────────────── | COMMENT |
| 162 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Cargo.toml | 61 | [profile.release] | COMMENT |
| LOW | docker/volumes/db/apply-migrations.sh | 1 | #!/bin/sh | COMMENT |
| LOW | packages/swift-rs/Cargo.toml | 1 | # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO | COMMENT |
| LOW | packages/swift-rs/src-rs/dark_magic.rs | 1 | /// This retain-balancing algorithm is cool but likely isn't required. | COMMENT |
| LOW | packages/swift-rs/src-rs/dark_magic.rs | 21 | // }); | COMMENT |
| LOW | packages/swift-rs/src-rs/dark_magic.rs | 41 | COMMENT | |
| LOW | packages/swift-rs/src-rs/dark_magic.rs | 61 | COMMENT | |
| LOW | packages/swift-rs/src-rs/dark_magic.rs | 81 | // retain_object(ptr) | COMMENT |
| LOW | packages/swift-rs/src-rs/build.rs | 261 | command | COMMENT |
| LOW | packages/swift-rs/src-rs/swift_arg.rs | 1 | use std::ffi::c_void; | COMMENT |
| LOW | packages/swift-rs/src-rs/autorelease.rs | 1 | /// Run code with its own autorelease pool. Semantically, this is identical | COMMENT |
| LOW | packages/swift-rs/src-rs/swift.rs | 21 | fn get_object(&self) -> &SRObject<Self::Shape>; | COMMENT |
| LOW | packages/swift-rs/src-rs/swift.rs | 61 | /// | COMMENT |
| LOW | packages/swift-rs/src-rs/types/object.rs | 1 | use crate::swift::{self, SwiftObject}; | COMMENT |
| LOW | packages/swift-rs/src-rs/types/object.rs | 21 | /// struct CustomObject { | COMMENT |
| LOW | packages/swift-rs/src-rs/types/array.rs | 21 | /// ## Returning Directly | COMMENT |
| LOW | packages/swift-rs/src-rs/types/array.rs | 41 | /// | COMMENT |
| LOW | .github/workflows/try-appimage.yml | 81 | sudo apt-get install -y pkg-config libfontconfig-dev libgtk-3-dev libwebkit2gtk-4.1 libwebkit2gtk-4.1-dev libj | COMMENT |
| LOW | .github/workflows/release.yml | 461 | # hands to quick-sharun as arguments: Debian keeps the NSS modules in | COMMENT |
| LOW | .github/workflows/nightly.yml | 181 | # bundled glibc on any newer distro (NSS: FATAL crypto/nss_util.cc). | COMMENT |
| LOW | .github/workflows/codeql.yml | 1 | # For most projects, this workflow file will not need changing; you simply need | COMMENT |
| LOW | .github/workflows/pull-request.yml | 421 | toolchain: stable | COMMENT |
| LOW | .github/workflows/scorecard.yml | 41 | - name: "Run analysis" | COMMENT |
| LOW | apps/readest-app/pdfjs.d.ts | 1 | // `@pdfjs/*` resolves into `packages/foliate-js/node_modules/pdfjs-dist`, so | COMMENT |
| LOW | apps/readest-app/wrangler.toml | 81 | # Reading-statistics archive: immutable per-user JSON segments of page events | COMMENT |
| LOW | apps/readest-app/vitest.tauri.setup.ts | 1 | // Vitest runs tests inside an iframe, but Tauri injects its plugin internals | COMMENT |
| LOW | apps/readest-app/worker.ts | 1 | // Custom Cloudflare Worker entry (wrangler.toml `main`). Wraps the handler that | COMMENT |
| LOW | apps/readest-app/scripts/release-ios-appstore.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | apps/readest-app/scripts/release-ios-appstore.sh | 21 | # from the widget / share extensions, or the reading widget ships dead. With | COMMENT |
| LOW | apps/readest-app/scripts/fix-ios-appstore-appgroup.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | apps/readest-app/scripts/sync-release-notes.sh | 1 | #!/bin/bash | COMMENT |
| LOW | …eadest-app/scripts/verify-ios-appstore-entitlements.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | apps/readest-app/scripts/worktree-new.ts | 241 | } | COMMENT |
| LOW | apps/readest-app/scripts/ios16-fonts-ready-repro.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | apps/readest-app/src-tauri/Cargo.toml | 121 | COMMENT | |
| LOW | apps/readest-app/src-tauri/Cargo.toml | 141 | # are disabled to keep the binary lean — we only need decoders for the | COMMENT |
| LOW | apps/readest-app/src-tauri/Cargo.toml | 161 | flate2 = "1" | COMMENT |
| LOW | …ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift | 241 | // prompts PAUSE us instead of ducking, and the interruption-ended | COMMENT |
| LOW | …ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift | 261 | return Date().timeIntervalSince(lastSessionOpTime) < 2.0 | COMMENT |
| LOW | …ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift | 281 | // state must all live on ONE MediaRemote player surface — splitting them | COMMENT |
| LOW | …ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift | 1101 | let index: Int | COMMENT |
| LOW | …ri-plugin-native-tts/ios/Sources/NativeTTSPlugin.swift | 1281 | } | COMMENT |
| LOW | …tive-tts/android/src/main/java/MediaPlaybackService.kt | 321 | } | COMMENT |
| LOW | …gin-native-bridge/ios/Sources/NativeBridgePlugin.swift | 821 | /// Bridge between the Readest Share Extension (separate process) and | COMMENT |
| LOW | …gin-native-bridge/ios/Sources/NativeBridgePlugin.swift | 1181 | if volumeKeys { | COMMENT |
| LOW | …gin-native-bridge/ios/Sources/NativeBridgePlugin.swift | 2101 | Thread.sleep(forTimeInterval: 0.25) | COMMENT |
| LOW | …gin-native-bridge/ios/Sources/NativeBridgePlugin.swift | 2121 | /// | COMMENT |
| LOW | …gin-native-bridge/ios/Sources/NativeBridgePlugin.swift | 2141 | return | COMMENT |
| LOW | …gin-native-bridge/ios/Sources/NativeBridgePlugin.swift | 2321 | self.turnCoverView?.removeFromSuperview() | COMMENT |
| LOW | …gin-native-bridge/ios/Sources/NativeBridgePlugin.swift | 2341 | /// Foundation / POSIX reads against `url.path` succeed. | COMMENT |
| LOW | …gin-native-bridge/ios/Sources/NativeBridgePlugin.swift | 2441 | COMMENT | |
| LOW | …gin-native-bridge/ios/Sources/NativeBridgePlugin.swift | 2481 | defer { onComplete() } | COMMENT |
| LOW | …gin-native-bridge/ios/Sources/NativeBridgePlugin.swift | 2621 | func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor { | COMMENT |
| LOW | …ative-bridge/ios/Sources/TextSelectionSuppressor.swift | 1 | import ObjectiveC | COMMENT |
| LOW | …ugin-native-bridge/ios/Sources/ClipUrlController.swift | 61 | COMMENT | |
| LOW | …-native-bridge/ios/Sources/ContextMenuSuppressor.swift | 1 | import ObjectiveC | COMMENT |
| LOW | …-native-bridge/ios/Sources/ContextMenuSuppressor.swift | 21 | /// a backstop in case WebKit presents without re-querying the delegate. | COMMENT |
| LOW | …ive-bridge/android/src/main/java/NativeBridgePlugin.kt | 441 | COMMENT | |
| LOW | …ive-bridge/android/src/main/java/NativeBridgePlugin.kt | 501 | val list: ArrayList<Uri>? = | COMMENT |
| LOW | …tauri/plugins/tauri-plugin-native-bridge/src/models.rs | 341 | pub error: Option<String>, | COMMENT |
| 341 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …p/.claude/plans/2026-06-18-sync-reading-status-plan.md | 513 | export function resolveReadingStatusMerge( | CODE |
| LOW | …ers/plans/2026-05-30-tts-highlight-current-sentence.md | 148 | export function buildTTSSentenceHighlight( | CODE |
| LOW | …cs/2026-05-30-tts-highlight-current-sentence-design.md | 167 | export function buildTTSSentenceHighlight( | CODE |
| LOW | …extensions/send-to-readest/src/background/offscreen.ts | 119 | export async function clipAndUploadViaOffscreen(opts: { | CODE |
| LOW | …/readest-app/src/app/reader/utils/globalAnnotations.ts | 309 | export function expandAllRenderedSections(view: FoliateView | null, note: BookNote): void { | CODE |
| LOW | …/readest-app/src/app/reader/utils/globalAnnotations.ts | 348 | export function removeGlobalAnnotationOverlays( | CODE |
| LOW | apps/readest-app/src/app/reader/utils/annotatorUtil.ts | 140 | export function getHandlePositionsFromRange( | CODE |
| LOW | apps/readest-app/src/app/reader/utils/annotatorUtil.ts | 273 | export function removeEmptyAnnotationPlaceholder( | CODE |
| LOW | apps/readest-app/src/app/reader/utils/annotatorUtil.ts | 301 | export function buildTTSSentenceHighlight( | CODE |
| LOW | apps/readest-app/src/app/reader/utils/annotatorUtil.ts | 552 | export function decideNoteBubbleTransition(before: string, after: string): NoteBubbleTransition { | CODE |
| LOW | apps/readest-app/src/app/reader/utils/annotatorUtil.ts | 564 | export function applyNoteBubbleTransition( | CODE |
| LOW | …ps/readest-app/src/app/reader/utils/annotationIndex.ts | 61 | export function selectLocationAnnotations( | CODE |
| LOW | …app/src/app/reader/components/notebook/AIAssistant.tsx | 41 | function convertToExportedMessages( | CODE |
| LOW | …adest-app/src/app/reader/hooks/useAutoSaveBookCover.ts | 102 | async function tryWriteFullCoverFromBook( | CODE |
| LOW | apps/readest-app/src/app/api/stripe/webhook/route.ts | 110 | async function handleSuccessfulSubscription(session: Stripe.Checkout.Session, userId: string) { | CODE |
| LOW | apps/readest-app/src/app/api/stripe/webhook/route.ts | 188 | async function handleSubscriptionUpdated(subscription: Stripe.Subscription) { | CODE |
| LOW | apps/readest-app/src/app/api/stripe/webhook/route.ts | 206 | async function handleSubscriptionCancelled(subscription: Stripe.Subscription) { | CODE |
| LOW | apps/readest-app/src/utils/note.ts | 248 | export function buildAnnotationCopyMarkdown({ | CODE |
| LOW | apps/readest-app/src/utils/ambientLight.ts | 78 | export function readStoredAmbientIsDarkMode( | CODE |
| LOW | apps/readest-app/src/utils/bridge.ts | 376 | export function checkEinkRefreshSupported(): Promise<boolean> { | CODE |
| LOW | apps/readest-app/src/utils/bridge.ts | 402 | export function getCachedEinkRefreshSupported(): boolean | null { | CODE |
| LOW | apps/readest-app/src/utils/bridge.ts | 611 | export async function getBookshelfWidgetInstances(): Promise<GetBookshelfWidgetInstancesResponse> { | CODE |
| LOW | apps/readest-app/src/utils/bridge.ts | 637 | export async function setBookshelfWidgetCatalog(catalog: BookshelfWidgetCatalog): Promise<void> { | CODE |
| LOW | apps/readest-app/src/utils/bridge.ts | 682 | export async function getReadingWidgetInstances(): Promise<GetReadingWidgetInstancesResponse> { | CODE |
| LOW | apps/readest-app/src/libs/payment/iap/apple/server.ts | 31 | export async function createOrUpdateSubscription(userId: string, purchase: VerifiedPurchase) { | CODE |
| LOW | …adest-app/src/libs/payment/iap/google/notifications.ts | 108 | async function handleSubscriptionNotification( | CODE |
| LOW | apps/readest-app/src/libs/payment/iap/google/server.ts | 41 | export async function createOrUpdateSubscription(userId: string, purchase: VerifiedPurchase) { | CODE |
| LOW | …-app/src/__tests__/hooks/useSpatialNavigation.test.tsx | 56 | function simulateKeyboardActivation() { | CODE |
| LOW | …p/src/__tests__/services/translators/providers.test.ts | 993 | function mockProxyAuthAndTranslation(text: string) { | CODE |
| LOW | apps/readest-app/src/hooks/usePullToRefresh.ts | 152 | function updateLoadingSpinnerPosition(el: HTMLDivElement, transform: number, dy: number) { | CODE |
| LOW | …s/readest-app/src/hooks/useAndroidGamepadConnection.ts | 14 | export function useAndroidGamepadConnection(enabled: boolean): boolean { | CODE |
| LOW | …s/readest-app/src/hooks/useRestoreLibraryOnRelaunch.ts | 18 | export function useRestoreLibraryOnRelaunch() { | CODE |
| LOW | apps/readest-app/src/pages/api/sync.ts | 51 | export function resolveReadingStatusMerge( | CODE |
| LOW | apps/readest-app/src/pages/api/sync.ts | 77 | export function buildStatusPropagationRow( | CODE |
| LOW | apps/readest-app/src/services/cloudService.ts | 154 | export async function downloadReplicaFileFromCloud( | CODE |
| LOW | apps/readest-app/src/services/cloudService.ts | 173 | export async function deleteReplicaBundleFromCloud( | CODE |
| LOW | apps/readest-app/src/services/bookService.ts | 130 | export function normalizeFilePathForIndex(path: string, osPlatform?: OsPlatform): string { | CODE |
| LOW | apps/readest-app/src/services/bookService.ts | 1202 | export async function resolveNativeBookFilePath( | CODE |
| LOW | apps/readest-app/src/services/backupService.ts | 142 | export function sanitizeSettingsForBackup( | CODE |
| LOW | apps/readest-app/src/services/bookContent.ts | 31 | async function resolveLegacyManagedSource( | CODE |
| LOW | apps/readest-app/src/services/settingsService.ts | 66 | export function migrateHighlightColorPrefs(read: ReadSettings): void { | CODE |
| LOW | apps/readest-app/src/services/translators/utils.ts | 87 | export function splitTextIntoSentenceChunks( | CODE |
| LOW | apps/readest-app/src/services/localsend/sounds.ts | 20 | export function setLocalSendSoundsEnabled(enabled: boolean): void { | CODE |
| LOW | …p/src/services/reedy/tools/builtins/createHighlight.ts | 26 | export function createCreateHighlightTool( | CODE |
| LOW | …src/services/reedy/tools/builtins/getReadingContext.ts | 14 | export function createGetReadingContextTool( | CODE |
| LOW⚡ | …t-app/src/services/reedy/tools/builtins/memoryTools.ts | 135 | export function createSearchUserMemoryTool(deps: SearchMemoryToolDeps) { | CODE |
| LOW⚡ | …t-app/src/services/reedy/tools/builtins/memoryTools.ts | 144 | export function createWriteUserMemoryTool(deps: WriteMemoryToolDeps) { | CODE |
| LOW⚡ | …t-app/src/services/reedy/tools/builtins/memoryTools.ts | 153 | export function createSearchBookMemoryTool(deps: SearchMemoryToolDeps) { | CODE |
| LOW⚡ | …t-app/src/services/reedy/tools/builtins/memoryTools.ts | 162 | export function createWriteBookMemoryTool(deps: WriteMemoryToolDeps) { | CODE |
| LOW⚡ | …t-app/src/services/reedy/tools/builtins/memoryTools.ts | 171 | export function createSearchSessionMemoryTool(deps: SearchMemoryToolDeps) { | CODE |
| LOW | …p/src/services/ai/providers/ProxiedGatewayEmbedding.ts | 8 | export function createProxiedEmbeddingModel(options: ProxiedEmbeddingOptions): EmbeddingModel { | CODE |
| LOW | …s/readest-app/src/services/ai/adapters/ReedyBackend.ts | 162 | function mapToolEventToMetricEvent( | CODE |
| LOW | apps/readest-app/src/services/bookshelves/grouping.ts | 12 | export function getActiveBookshelfGroupBy( | CODE |
| LOW | apps/readest-app/src/services/webBrowser/webBrowser.ts | 61 | export async function subscribeWebBrowserDownloads( | CODE |
| LOW | apps/readest-app/src/services/send/clipSignIn.ts | 67 | export async function clipPageWithSignInFallback( | CODE |
| LOW | apps/readest-app/src/store/proofreadStore.ts | 378 | export function validateReplacementRulePattern( | CODE |
| LOW | apps/readest.koplugin/readest_syncclient.lua | 17 | local function isTransientTransportError(err) | CODE |
| LOW | apps/readest-calibre-plugin/tests/test_version.py | 12 | def test_committed_version_matches_the_app(self): | CODE |
| LOW | apps/readest-calibre-plugin/tests/test_version.py | 18 | def test_app_version_is_a_three_part_tuple(self): | CODE |
| LOW | apps/readest-calibre-plugin/tests/test_version.py | 33 | def test_rewrites_a_stale_version(self): | CODE |
| 77 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …app/extensions/send-to-readest/src/popup/popup.test.ts | 209 | const clipCall = chromeMock.runtime.sendMessage.mock.calls.find((c) => { | CODE |
| CRITICAL | …-app/src/__tests__/statistics/ttsStatsRecorder.test.ts | 51 | mocks.db.insertPageEvent.mock.calls.map((call) => (call as unknown[])[1] as RecordedEvent); | CODE |
| CRITICAL | …app/reader/reader-content-close-saves-library.test.tsx | 126 | const saved = h.appService.saveLibraryBooks.mock.calls.at(-1)![0] as Book[]; | CODE |
| CRITICAL | …src/__tests__/hooks/useCapturedTurn-scrollLock.test.ts | 1124 | const lastSample = h.controller.moveDrag.mock.calls.at(-1)!; | CODE |
| CRITICAL | …src/__tests__/hooks/useCapturedTurn-scrollLock.test.ts | 1128 | expect(h.controller.moveDrag.mock.invocationCallOrder.at(-1)!).toBeLessThan( | CODE |
| CRITICAL | …_tests__/hooks/useSync-stale-settings-clobber.test.tsx | 162 | const lastSaved = h.storeState.saveSettings.mock.calls.at(-1)![1]; | CODE |
| CRITICAL | …dest-app/src/__tests__/services/tts-controller.test.ts | 2643 | expect(content.overlayer.add.mock.calls.map((call) => call[0])).not.toContain( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/swift-rs/README.md | 226 | else return SRString("lorem ipsum") | CODE |
| LOW | packages/swift-rs/README.md | 272 | let value: SRString = "lorem ipsum".into(); | CODE |
| LOW | packages/swift-rs/README.md | 274 | unsafe { swift_print(&value) }; // Will print "lorem ipsum" to the console | CODE |
| LOW | packages/swift-rs/README.md | 285 | let value = "lorem ipsum" | CODE |
| LOW | packages/swift-rs/README.md | 306 | println!("{}", value_srstring); // Will print "lorem ipsum" to the console | CODE |
| LOW | …s/readest-app/src/app/library/components/GroupItem.tsx | 244 | <div className='placeholder' style={{ height: `${iconSize15}px` }}></div> | CODE |
| LOW | apps/readest-app/src/styles/globals.css | 1000 | [data-eink='true'] [class*='placeholder']::placeholder { | CODE |
| LOW | apps/readest-app/src/__tests__/reedy/CfiChunker.test.ts | 112 | const paragraph = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. '.repeat(40); | CODE |
| LOW | apps/readest-app/src/__tests__/reedy/CfiChunker.test.ts | 112 | const paragraph = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. '.repeat(40); | CODE |
| LOW | …rc/__tests__/app/reader/utils/notebookRecovery.test.ts | 17 | expect(getNotebookRecoveryKey('user@example.com', 'book-hash')).toBe( | CODE |
| LOW | …app/reader/components/notebook/NotebookEditor.test.tsx | 33 | expect(editor.getAttribute('placeholder')).toBe('Start writing about this book…'); | CODE |
| LOW | …tests__/app/library/import-pasted-text-dialog.test.tsx | 72 | expect(screen.getByLabelText('Book title')).toHaveProperty('placeholder', 'Morning briefing'); | CODE |
| LOW | …st-app/src/__tests__/app/library/group-header.test.tsx | 63 | render(<GroupHeader groupBy={LibraryGroupByType.Author} groupName='Jane Doe' />); | CODE |
| LOW | …readest-app/src/__tests__/utils/md-frontmatter.test.ts | 153 | expect(metadata.author).toEqual(['Jane Doe', 'John Roe']); | CODE |
| LOW | …est-app/src/__tests__/utils/dialogue-highlight.test.ts | 429 | 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore mag | CODE |
| LOW | …est-app/src/__tests__/utils/dialogue-highlight.test.ts | 429 | 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore mag | CODE |
| LOW | apps/readest-app/src/__tests__/utils/md.test.ts | 194 | expect(fm.metadata.author).toBe('Jane Doe'); | CODE |
| LOW | apps/readest-app/src/__tests__/utils/html.test.ts | 27 | `<p>${'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor. '.repeat(n)}</p>`; | CODE |
| LOW | apps/readest-app/src/__tests__/utils/html.test.ts | 27 | `<p>${'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor. '.repeat(n)}</p>`; | CODE |
| LOW | apps/readest-app/src/__tests__/utils/html.test.ts | 55 | expect(text).toContain('Lorem ipsum'); | CODE |
| LOW | apps/readest-app/src/__tests__/utils/html.test.ts | 287 | expect(doc.body.textContent).toContain('Lorem ipsum'); | CODE |
| LOW | apps/readest-app/src/__tests__/utils/html.test.ts | 340 | expect(doc.body.textContent).toContain('Lorem ipsum'); | CODE |
| LOW⚡ | …/readest-app/src/__tests__/utils/library-utils.test.ts | 48 | expect(parseAuthors('John Smith, Jane Doe')).toEqual(['John Smith', 'Jane Doe']); | CODE |
| LOW⚡ | …/readest-app/src/__tests__/utils/library-utils.test.ts | 52 | expect(parseAuthors('John Smith & Jane Doe')).toEqual(['John Smith', 'Jane Doe']); | CODE |
| LOW⚡ | …/readest-app/src/__tests__/utils/library-utils.test.ts | 56 | expect(parseAuthors('John Smith and Jane Doe')).toEqual(['John Smith', 'Jane Doe']); | CODE |
| LOW⚡ | …/readest-app/src/__tests__/utils/library-utils.test.ts | 62 | 'Jane Doe', | CODE |
| LOW⚡ | …/readest-app/src/__tests__/utils/library-utils.test.ts | 70 | 'Jane Doe', | CODE |
| LOW⚡ | …/readest-app/src/__tests__/utils/library-utils.test.ts | 76 | expect(parseAuthors(' John Smith , Jane Doe ')).toEqual(['John Smith', 'Jane Doe']); | CODE |
| LOW | …/readest-app/src/__tests__/utils/library-utils.test.ts | 220 | const jane = groups.find((g) => g.name === 'Jane Doe'); | CODE |
| LOW | apps/readest-app/src/__tests__/utils/txt-worker.test.ts | 55 | const options = { file, author: 'Jane Doe', language: 'zh' }; | CODE |
| LOW | …t/paginator-page-progression-direction.browser.test.ts | 15 | (_, i) => `<p>paragraph ${i} ${'lorem ipsum dolor sit amet consectetur '.repeat(8)}</p>`, | CODE |
| LOW | …t/paginator-page-progression-direction.browser.test.ts | 15 | (_, i) => `<p>paragraph ${i} ${'lorem ipsum dolor sit amet consectetur '.repeat(8)}</p>`, | CODE |
| LOW | …adest-app/src/__tests__/libs/replicaSyncClient.test.ts | 4 | getAccessToken: vi.fn(async () => 'fake-token'), | CODE |
| LOW | …adest-app/src/__tests__/libs/replicaSyncClient.test.ts | 51 | expect(init.headers.Authorization).toBe('Bearer fake-token'); | CODE |
| LOW | apps/readest-app/src/__tests__/ai/chunker.test.ts | 67 | const longText = 'Lorem ipsum dolor sit amet. '.repeat(50); | CODE |
| LOW | apps/readest-app/src/__tests__/ai/chunker.test.ts | 67 | const longText = 'Lorem ipsum dolor sit amet. '.repeat(50); | CODE |
| LOW | …t-app/src/__tests__/services/opds-feed-checker.test.ts | 731 | author: 'Jane Doe', | CODE |
| LOW | …adest-app/src/__tests__/services/opds-metadata.test.ts | 15 | { name: 'Jane Doe', links: [] }, | CODE |
| LOW | …adest-app/src/__tests__/services/opds-metadata.test.ts | 28 | expect(result.author).toEqual(['Jane Doe', 'John Smith']); | CODE |
| LOW | …adest-app/src/__tests__/services/opds-metadata.test.ts | 129 | author: ['Jane Doe', 'John Smith'], | CODE |
| LOW | …adest-app/src/__tests__/services/opds-metadata.test.ts | 142 | expect(book.author).toContain('Jane Doe'); | CODE |
| LOW | …c/__tests__/services/send-convert-page-unified.test.ts | 41 | <p>${'lorem ipsum dolor sit amet '.repeat(40)}</p> | CODE |
| LOW | …c/__tests__/services/send-convert-page-unified.test.ts | 41 | <p>${'lorem ipsum dolor sit amet '.repeat(40)}</p> | CODE |
| LOW | …eadest-app/src/__tests__/services/send-address.test.ts | 20 | expect(slugFromIdentity('Jane Doe')).toBe('janedoe'); | CODE |
| LOW | …pp/src/__tests__/services/send-cover-generator.test.ts | 43 | author: 'Jane Doe', | CODE |
| LOW | …pp/src/__tests__/services/send-cover-generator.test.ts | 46 | expect(svg).toContain('Jane Doe'); | CODE |
| LOW⚡ | …pp/src/__tests__/services/send-cover-generator.test.ts | 126 | expect(pickTheme('Jane Doe')).toEqual(pickTheme('Jane Doe')); | CODE |
| LOW⚡ | …pp/src/__tests__/services/send-cover-generator.test.ts | 131 | const theme = pickTheme('Jane Doe'); | CODE |
| LOW⚡ | …pp/src/__tests__/services/send-cover-generator.test.ts | 137 | expect(pickTheme(' Jane Doe ')).toEqual(pickTheme('Jane Doe')); | CODE |
| LOW | …/services/sync/providers/icloud/ICloudProvider.test.ts | 147 | state.files.set(abs('/Readest/.library.json.icloud'), 'placeholder'); | CODE |
| LOW | …p/src/__tests__/services/sync/adapters/texture.test.ts | 12 | id: 'placeholder', | CODE |
| LOW | …-app/src/__tests__/services/sync/adapters/font.test.ts | 12 | id: 'placeholder', | CODE |
| LOW | …rc/__tests__/services/sync/adapters/dictionary.test.ts | 11 | id: 'placeholder', | CODE |
| LOW | …ps/readest.koplugin/spec/library/group_covers_spec.lua | 98 | cloud_covers.set_opts({ sync_auth = "fake-token" }) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | apps/readest-calibre-plugin/worker.py | 42 | except NameError: | CODE |
| HIGH | apps/readest-calibre-plugin/worker.py | 357 | except OSError: | CODE |
| HIGH | apps/readest-calibre-plugin/config.py | 11 | except NameError: | CODE |
| HIGH | apps/readest-calibre-plugin/ui.py | 16 | except NameError: | CODE |
| HIGH | apps/readest-calibre-plugin/__init__.py | 8 | except NameError: | CODE |
| HIGH | apps/readest-calibre-plugin/api.py | 296 | except Exception: | CODE |
| HIGH | apps/readest-calibre-plugin/dialogs.py | 34 | except NameError: | CODE |
| HIGH | apps/readest-calibre-plugin/dialogs.py | 152 | except TypeError: | CODE |
| HIGH | apps/readest-calibre-plugin/oauth.py | 71 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/pull-request.yml | 352 | # the Rust backend, the vendored native packages, nor the tauri test harness | COMMENT |
| MEDIUM | apps/readest-app/scripts/test-tauri.sh | 59 | # exists in this harness run. | COMMENT |
| MEDIUM | apps/readest-app/src-tauri/Cargo.toml | 20 | # only for the webdriver test harness (scripts/test-tauri.sh) — every Linux | COMMENT |
| MEDIUM | …tive-tts/android/src/main/java/MediaPlaybackService.kt | 1302 | // Promote with an explicit mediaPlayback type (required/robust on | COMMENT |
| MEDIUM⚡ | apps/readest-app/data/wordlens/en-fr.json | 1 | {"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived fr | CODE |
| MEDIUM⚡ | apps/readest-app/data/wordlens/en-fr.json | 1 | {"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived fr | CODE |
| MEDIUM⚡ | apps/readest-app/data/wordlens/en-fr.json | 1 | {"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived fr | CODE |
| MEDIUM⚡ | apps/readest-app/data/wordlens/en-fr.json | 1 | {"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived fr | CODE |
| MEDIUM⚡ | apps/readest-app/data/wordlens/en-fr.json | 1 | {"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived fr | CODE |
| MEDIUM⚡ | apps/readest-app/data/wordlens/en-fr.json | 1 | {"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived fr | CODE |
| MEDIUM | …ps/readest-app/src/app/reader/hooks/useProgressSync.ts | 402 | // TODO: general config sync via a more robust profile-based solution. | COMMENT |
| MEDIUM | …c/__tests__/services/tts-auto-advance.browser.test.tsx | 550 | // The robust, event-agnostic observable: the section the iterator's CURRENT | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/readest-app/.claude/skills/i18n-koplugin/SKILL.md | 14 | ## Step 1: Determine the working directory | COMMENT |
| LOW | apps/readest-app/.claude/skills/i18n-koplugin/SKILL.md | 18 | ## Step 2: Extract msgids from Lua sources | COMMENT |
| LOW | apps/readest-app/.claude/skills/i18n-koplugin/SKILL.md | 34 | ## Step 3: Find untranslated entries | COMMENT |
| LOW | apps/readest-app/.claude/skills/i18n-koplugin/SKILL.md | 62 | ## Step 4: Translate empty msgstrs | COMMENT |
| LOW | apps/readest-app/.claude/skills/i18n-koplugin/SKILL.md | 98 | ## Step 5: Verify | COMMENT |
| LOW | apps/readest-app/.claude/skills/i18n/SKILL.md | 13 | ## Step 0: Determine the mode | COMMENT |
| LOW | apps/readest-app/.claude/skills/i18n/SKILL.md | 18 | ## Step 1: Determine the working directory | COMMENT |
| LOW⚡ | apps/readest-app/.claude/skills/i18n/SKILL.md | 54 | ### Step 2: Extract i18n strings | COMMENT |
| LOW⚡ | apps/readest-app/.claude/skills/i18n/SKILL.md | 63 | ### Step 3: Find untranslated strings | COMMENT |
| LOW⚡ | apps/readest-app/.claude/skills/i18n/SKILL.md | 71 | ### Step 4: Translate missing strings | COMMENT |
| LOW | apps/readest-app/.claude/skills/i18n/SKILL.md | 90 | ### Step 5: Verify | COMMENT |
| LOW | apps/readest-app/docs/testing.md | 39 | ### Step 1: Start the Tauri App | COMMENT |
| LOW | apps/readest-app/docs/testing.md | 55 | ### Step 2: Run Tests | COMMENT |
| LOW⚡ | apps/readest-app/scripts/ios16-fonts-ready-repro.py | 42 | // Step 1: create the JS deferred promise while processingLoadEvent. | COMMENT |
| LOW⚡ | apps/readest-app/scripts/ios16-fonts-ready-repro.py | 45 | // Step 2: inject the @font-face and force a synchronous layout so the | COMMENT |
| LOW | apps/readest-app/scripts/ios16-fonts-ready-repro.py | 56 | // Step 3: with the font still in flight, swap the stylesheet like | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/android-e2e.yml | 102 | # the gradle scaffolding, then restore the tracked customizations | COMMENT |
| MEDIUM | apps/readest-app/docs/architecture.md | 420 | ### 6.3 AI / RAG | COMMENT |
| MEDIUM | …ive-bridge/android/src/main/java/NativeBridgePlugin.kt | 302 | // page observes it (#5693). InputManager is event-driven, so use it only to | COMMENT |
| MEDIUM⚡ | apps/readest-app/data/wordlens/en-fr.json | 1 | {"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived fr | CODE |
| MEDIUM⚡ | apps/readest-app/data/wordlens/en-fr.json | 1 | {"meta":{"source":"en","target":"fr","license":"CC-BY-SA-3.0","attribution":"Glosses: WikDict (CC-BY-SA-3.0), derived fr | CODE |
| MEDIUM | apps/readest-calibre-plugin/scripts/i18n.py | 14 | python3 scripts/i18n.py new LANG # scaffold translations/LANG.po | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | apps/readest-calibre-plugin/scripts/i18n.py | 57 | '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.py | 58 | '&& (n%100<10 || n%100>=20) ? 1 : 2);', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/readest-app/.claude/skills/triage-github/watch-prs.py | 131 | except Exception as e: # one failing PR must not stop the watch, but never stay silent | CODE |
| LOW | apps/readest-calibre-plugin/worker.py | 100 | except Exception: | CODE |
| LOW | apps/readest-calibre-plugin/worker.py | 142 | except Exception: | CODE |
| LOW | apps/readest-calibre-plugin/worker.py | 177 | except Exception as err: | CODE |
| LOW | apps/readest-calibre-plugin/worker.py | 202 | except Exception: | CODE |
| LOW | apps/readest-calibre-plugin/worker.py | 216 | except Exception: | CODE |
| LOW | apps/readest-calibre-plugin/worker.py | 280 | except Exception as err: | CODE |
| LOW | apps/readest-calibre-plugin/worker.py | 310 | except Exception: | CODE |
| LOW | apps/readest-calibre-plugin/worker.py | 411 | except Exception as err: | CODE |
| LOW | apps/readest-calibre-plugin/api.py | 296 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | apps/readest-app/scripts/ios16-fonts-ready-repro.py | 42 | // Step 1: create the JS deferred promise while processingLoadEvent. | COMMENT |
| LOW⚡ | apps/readest-app/scripts/ios16-fonts-ready-repro.py | 45 | // Step 2: inject the @font-face and force a synchronous layout so the | COMMENT |
| LOW | apps/readest-app/scripts/ios16-fonts-ready-repro.py | 56 | // Step 3: with the font still in flight, swap the stylesheet like | COMMENT |
| LOW | apps/readest-app/src/services/cloudService.ts | 371 | // some books may not have cover image, so we need to check if the book is downloaded | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | apps/readest-calibre-plugin/scripts/i18n.py | 65 | # This file is distributed under the same license as the Readest calibre plugin. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/readest-app/.claude/skills/triage-github/watch-prs.py | 114 | CODE | |
| LOW | apps/readest-calibre-plugin/scripts/i18n.py | 131 | CODE | |
| LOW | apps/readest-calibre-plugin/scripts/i18n.py | 214 | CODE | |
| LOW | apps/readest-calibre-plugin/scripts/i18n.py | 356 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/codeql.yml | 60 | # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/readest-app/scripts/sync-release-notes.sh | 36 | # Check if required commands are available | COMMENT |
| LOW | apps/readest-app/scripts/sync-release-notes.sh | 64 | # Check if releases key exists | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/readest-app/src/app/api/opds/proxy/route.ts | 96 | async function handleRequest(request: NextRequest, method: 'GET' | 'HEAD') { | CODE |
| LOW | apps/readest-app/src/utils/warichu.ts | 367 | function getData(el: HTMLElement) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/readest-app/src/services/tts/TTSController.ts | 334 | // TODO: implement native TTS client for desktop platforms. | COMMENT |