An ebook reader application supporting PDF, DjVu, EPUB, FB2 and many more formats, running on Cervantes, Kindle, Kobo, PocketBook and Android devices
This report summarizes scanner evidence for koreader/koreader, a Lua project with 30,763 GitHub stars. SynthScan examined 238,253 lines of code across 773 source files, recording 68 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 0.4 (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? 55 finding(s).
Are imports declared and package/API names verified? 13 finding(s).
Are wrappers, guards, and repeated structures necessary? 35 finding(s).
Which changes need focused human review? 68 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 68 distinct pattern matches across 9 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 |
|---|---|---|---|---|
| LOW | tools/logcat.py | 196 | def _check_for_birth_or_death(self, rec): | CODE |
| LOW | tools/logcat.py | 220 | def _update_packages_and_pids(self, rec): | CODE |
| LOW | tools/ja_keyboard_generate.py | 102 | def generate_alphabet_shift_cycle(letter): | CODE |
| LOW | frontend/pluginloader.lua | 158 | local function sandboxPluginEventHandlers(plugin) | CODE |
| LOW | frontend/docsettings.lua | 101 | local function getOrderedLocationCandidates() | CODE |
| LOW | frontend/depgraph.lua | 59 | local function getOrCreateNode(self, node_key) | CODE |
| LOW | frontend/ui/wikipedia.lua | 135 | local function getWikimediaThumbnailStep(width) | CODE |
| LOW | frontend/ui/widget/booklist.lua | 43 | local function getLeadingArticlePrefixes(lang) | CODE |
| LOW | frontend/ui/elements/common_settings_menu_table.lua | 598 | local function genMetadataFolderMenuItem(value) | CODE |
| LOW | frontend/ui/elements/menu_keyboard_layout.lua | 19 | local function getOrderedActivatedKeyboardLayouts() | CODE |
| LOW | frontend/ui/elements/menu_keyboard_layout.lua | 38 | local function getActivatedKeyboardsStringCount(compact) | CODE |
| LOW | frontend/ui/elements/menu_keyboard_layout.lua | 48 | local function genKeyboardLayoutsSubmenu() | CODE |
| LOW | frontend/document/djvudocument.lua | 104 | local function groupWordsIntoLinesInOrder(words) | CODE |
| LOW | frontend/document/djvudocument.lua | 127 | local function groupWordsIntoLinesByGeometry(words) | CODE |
| LOW | frontend/document/koptinterface.lua | 481 | local function buildOptimizedFullPageTile() | CODE |
| LOW | frontend/document/koptinterface.lua | 492 | local function buildOptimizedPagePartTile() | CODE |
| LOW | frontend/device/gesturedetector.lua | 1408 | local function translateMultiswipeGesDirCoordinate(multiswipe_directions, translation_table) | CODE |
| LOW | frontend/device/kindle/device.lua | 104 | local function kindleAuthenticateNetwork(essid) | CODE |
| LOW | frontend/device/sdl/device.lua | 218 | local function dispatchGamepadAxisMotion(axis, value, event_time) | CODE |
| LOW | frontend/apps/reader/modules/readerstyletweak.lua | 473 | local function dispatcherRegisterStyleTweak(tweak_id, tweak_title) | CODE |
| LOW⚡ | frontend/apps/reader/modules/readerlink.lua | 275 | local function isLargerTapAreaToFollowLinksEnabled() | CODE |
| LOW⚡ | frontend/apps/reader/modules/readerlink.lua | 279 | local function isTapIgnoreExternalLinksEnabled() | CODE |
| LOW⚡ | frontend/apps/reader/modules/readerlink.lua | 283 | local function isFootnoteLinkInPopupEnabled() | CODE |
| LOW⚡ | frontend/apps/reader/modules/readerlink.lua | 295 | local function isSwipeToFollowNearestLinkEnabled() | CODE |
| LOW⚡ | frontend/apps/reader/modules/readerlink.lua | 299 | local function isSwipeIgnoreExternalLinksEnabled() | CODE |
| LOW⚡ | frontend/apps/reader/modules/readerlink.lua | 303 | local function isSwipeToJumpToLatestBookmarkEnabled() | CODE |
| LOW | frontend/apps/reader/modules/readerwikipedia.lua | 46 | local function getKeyboardLayoutLanguage() | CODE |
| LOW | frontend/apps/filemanager/filemanagercollection.lua | 514 | local function genFilterByMetadataButton(button_prop) | CODE |
| LOW | plugins/hotkeys.koplugin/main.lua | 402 | local function attachNewTableToExistingTable(original_table, second_table) | CODE |
| LOW | plugins/newsdownloader.koplugin/main.lua | 298 | local function parseCommaSeparatedOption(opt) | CODE |
| LOW | plugins/profiles.koplugin/main.lua | 67 | local function dispatcherRegisterProfile(name) | CODE |
| LOW | plugins/profiles.koplugin/main.lua | 72 | local function dispatcherUnregisterProfile(name) | CODE |
| LOW | plugins/bookshortcuts.koplugin/main.lua | 24 | local function dispatcherRegisterShortcut(name) | CODE |
| LOW | spec/unit/readhistory_spec.lua | 310 | local function testAutoRemoveDeletedItems() | CODE |
| LOW | spec/unit/readhistory_spec.lua | 329 | local function testDoNotAutoRemoveDeletedItems() | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/apps/reader/modules/readerdictionary.lua | 650 | local preview_definition = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " .. | CODE |
| LOW | frontend/apps/reader/modules/readerdictionary.lua | 650 | local preview_definition = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " .. | CODE |
| LOW⚡ | spec/unit/newsdownloader_url_normalization_spec.lua | 14 | <title>Lorem Ipsum Feed</title> | CODE |
| LOW⚡ | spec/unit/newsdownloader_url_normalization_spec.lua | 16 | <description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description> | CODE |
| LOW⚡ | spec/unit/newsdownloader_url_normalization_spec.lua | 16 | <description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description> | CODE |
| LOW⚡ | spec/unit/newsdownloader_url_normalization_spec.lua | 19 | <title><![CDATA[Lorem Ipsum Article]]></title> | CODE |
| LOW⚡ | spec/unit/newsdownloader_url_normalization_spec.lua | 23 | <description><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit.]]></description> | CODE |
| LOW⚡ | spec/unit/newsdownloader_url_normalization_spec.lua | 23 | <description><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit.]]></description> | CODE |
| LOW⚡ | spec/unit/newsdownloader_url_normalization_spec.lua | 24 | <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit.]]></content:encoded> | CODE |
| LOW⚡ | spec/unit/newsdownloader_url_normalization_spec.lua | 24 | <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit.]]></content:encoded> | CODE |
| LOW | spec/unit/newsdownloader_url_normalization_spec.lua | 54 | assert.equals("Lorem Ipsum Feed", feeds.rss.channel.title) | CODE |
| LOW | spec/unit/newsdownloader_url_normalization_spec.lua | 59 | assert.equals("Lorem Ipsum Article", first_item.title) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | platform/kindle/libkohelper.sh | 18 | ## Check if we have an FBInk binary available somewhere... | COMMENT |
| LOW | platform/kindle/koreader.sh | 252 | # Check if KPVBooklet was launched more than once, if not we will disable pillow | COMMENT |
| LOW | platform/kindle/extensions/koreader/bin/koreader-ext.sh | 33 | # Check if we were called by install_koreader... | COMMENT |
| LOW | platform/cervantes/koreader.sh | 129 | # Check if the user requested to always abort on crash | COMMENT |
| LOW | platform/bookeen/wlan.sh | 51 | # Check if wlan driver is already up. | COMMENT |
| LOW | platform/remarkable/koreader.sh | 156 | # Check if the swap has been disabled... | COMMENT |
| LOW | platform/remarkable/koreader.sh | 214 | # Check if the user requested to always abort on crash | COMMENT |
| LOW | platform/kobo/koreader.sh | 179 | # Check if Nickel is our parent... | COMMENT |
| LOW | platform/kobo/koreader.sh | 370 | # Check if the swap has been disabled... | COMMENT |
| LOW | platform/kobo/koreader.sh | 446 | # Check if the user requested to always abort on crash | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/mkrelease.sh | 371 | # Create the initial uncompressed TAR file. | COMMENT |
| MEDIUM | tools/mkrelease.sh | 377 | # Create the final TAR.XZ file. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/ja_keyboard_generate.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | platform/remarkable/koreader.sh | 121 | ORIG_FB_BPP="" | COMMENT |
| LOW | platform/mac/do_mac_bundle.sh | 1 | #!/bin/bash | COMMENT |
| LOW | platform/kobo/koreader.sh | 61 | # but it unfortunately defaults to its lowest possible setting... | COMMENT |
| LOW | platform/kobo/koreader.sh | 461 | # Height @ ~56.7%, w/ a margin worth 1.5 lines | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/ja_keyboard_generate.py | 130 | # NOTE: If we ever want to enable looping for these modifiers, just set | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | platform/kobo/koreader.sh | 60 | # NOTE: The default sampling_rate is a bit high for my tastes, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/ja_keyboard_generate.py | 15 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/device/kindle/device.lua | 774 | -- Don't forget to flag ourselves in ScreenSaver mode like Screensaver:show would, | CODE |