PDFCraft is a free, privacy-focused PDF toolkit that runs entirely in your browser. With 90+ professional tools, you can edit, convert, merge, split, and secure your PDF files without ever uploading them to a server.
This report summarizes scanner evidence for PDFCraftTool/pdfcraft, a TypeScript project with 9,723 GitHub stars. SynthScan examined 698,119 lines of code across 967 source files, recording 505 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 1.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? 243 finding(s).
Are imports declared and package/API names verified? 189 finding(s).
Are wrappers, guards, and repeated structures necessary? 250 finding(s).
Which changes need focused human review? 505 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 505 distinct pattern matches across 15 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 |
|---|---|---|---|---|
| HIGH⚡ | public/pymupdf-wasm/pymupdf.js | 713 | elif order_val[j] == ']': | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf.js | 721 | elif char == ']': | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf.js | 723 | elif char.isdigit(): | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf.js | 833 | elif char == ']': | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf.js | 941 | elif t2 != "null": | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf.js | 946 | elif t != "null": | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf.js | 955 | elif t2 != "null": | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf.js | 1352 | elif cs_name not in ('DEVICEGRAY', 'GRAY', 'DEVICERGB', 'RGB', 'SRGB', ''): | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf.js | 1361 | elif pix.n > 4: | CODE |
| HIGH | public/pymupdf-wasm/pymupdf.js | 647 | elif t != "null": | CODE |
| HIGH | public/pymupdf-wasm/pymupdf.js | 655 | elif t2 != "null": | CODE |
| HIGH | public/pymupdf-wasm/pymupdf.js | 789 | elif t != "null": | CODE |
| HIGH | public/pymupdf-wasm/pymupdf.js | 801 | elif t2 != "null": | CODE |
| HIGH | public/pymupdf-wasm/pymupdf.js | 890 | elif final_order[k] == ']': arr_depth -= 1 | CODE |
| HIGH | public/pymupdf-wasm/pymupdf.js | 1099 | elif t != "null": | CODE |
| HIGH | public/pymupdf-wasm/pymupdf.js | 1281 | return None | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf-lite.js | 713 | elif order_val[j] == ']': | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf-lite.js | 721 | elif char == ']': | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf-lite.js | 723 | elif char.isdigit(): | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf-lite.js | 833 | elif char == ']': | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf-lite.js | 941 | elif t2 != "null": | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf-lite.js | 946 | elif t != "null": | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf-lite.js | 955 | elif t2 != "null": | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf-lite.js | 1352 | elif cs_name not in ('DEVICEGRAY', 'GRAY', 'DEVICERGB', 'RGB', 'SRGB', ''): | CODE |
| HIGH⚡ | public/pymupdf-wasm/pymupdf-lite.js | 1361 | elif pix.n > 4: | CODE |
| HIGH | public/pymupdf-wasm/pymupdf-lite.js | 647 | elif t != "null": | CODE |
| HIGH | public/pymupdf-wasm/pymupdf-lite.js | 655 | elif t2 != "null": | CODE |
| HIGH | public/pymupdf-wasm/pymupdf-lite.js | 789 | elif t != "null": | CODE |
| HIGH | public/pymupdf-wasm/pymupdf-lite.js | 801 | elif t2 != "null": | CODE |
| HIGH | public/pymupdf-wasm/pymupdf-lite.js | 890 | elif final_order[k] == ']': arr_depth -= 1 | CODE |
| HIGH | public/pymupdf-wasm/pymupdf-lite.js | 1099 | elif t != "null": | CODE |
| HIGH | public/pymupdf-wasm/pymupdf-lite.js | 1281 | return None | CODE |
| HIGH⚡ | public/workers/extract-images.worker.js | 81 | print(f"Error extracting image {xref}: {e}") | CODE |
| HIGH⚡ | public/workers/table-of-contents-v2.worker.js | 38 | return True | CODE |
| HIGH⚡ | public/workers/table-of-contents-v2.worker.js | 39 | return False | CODE |
| HIGH⚡ | public/workers/table-of-contents-v2.worker.js | 43 | return False | CODE |
| HIGH⚡ | public/workers/table-of-contents-v2.worker.js | 46 | return True | CODE |
| HIGH⚡ | public/workers/table-of-contents-v2.worker.js | 59 | return True | CODE |
| HIGH⚡ | public/workers/table-of-contents-v2.worker.js | 61 | print(f"Font download error: {e}") | CODE |
| HIGH⚡ | public/workers/table-of-contents-v2.worker.js | 62 | return False | CODE |
| HIGH⚡ | public/workers/table-of-contents-v2.worker.js | 63 | return False | CODE |
| HIGH | public/workers/table-of-contents-v2.worker.js | 92 | print("Warning: CJK font needed but could not be loaded. Falling back to Helvetica.") | CODE |
| HIGH⚡ | public/workers/table-of-contents-v2.worker.js | 183 | print("Python: Generating bytes...") | CODE |
| HIGH⚡ | public/workers/table-of-contents-v2.worker.js | 185 | print(f"Python: Generated {len(result_bytes)} bytes") | CODE |
| HIGH⚡ | public/workers/table-of-contents-v2.worker.js | 192 | print(f"Python Error: {str(e)}") | CODE |
| HIGH | public/workers/word-to-pdf.worker.js | 278 | elif para.alignment == WD_ALIGN_PARAGRAPH.RIGHT: | CODE |
| HIGH | public/workers/word-to-pdf.worker.js | 280 | elif para.alignment == WD_ALIGN_PARAGRAPH.JUSTIFY: | CODE |
| HIGH | public/workers/word-to-pdf.worker.js | 494 | elif element.tag.endswith('tbl'): | CODE |
| HIGH | public/workers/pptx-to-pdf.worker.js | 176 | elif not target.startswith('ppt/'): | CODE |
| HIGH | public/workers/pptx-to-pdf.worker.js | 194 | return None | CODE |
| HIGH | public/workers/pptx-to-pdf.worker.js | 217 | return None | CODE |
| HIGH | public/workers/pptx-to-pdf.worker.js | 265 | elif algn == 'r': | CODE |
| HIGH | public/workers/pptx-to-pdf.worker.js | 267 | elif algn == 'just': | CODE |
| HIGH | public/workers/pptx-to-pdf.worker.js | 376 | elif tag.endswith('sp'): | CODE |
| HIGH⚡ | public/workers/pdf-to-excel.worker.js | 81 | print(f"Error extracting table {i} on page {page_num}: {e}") | CODE |
| HIGH | src/lib/pdf/pymupdf-loader.ts | 387 | elif n == 3: | CODE |
| HIGH | src/lib/pdf/pymupdf-loader.ts | 391 | elif n == 4: | CODE |
| HIGH | src/lib/pdf/pymupdf-loader.ts | 492 | return False | CODE |
| HIGH | src/lib/pdf/pymupdf-loader.ts | 514 | return True | CODE |
| HIGH | src/lib/pdf/pymupdf-loader.ts | 534 | return True | CODE |
| 3 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | scratch/test_placeholders.py | 35 | def translate_with_protection(text, target_lang): | CODE |
| LOW | scratch/batch_translate_threaded.py | 68 | def translate_with_protection(text, target_lang): | CODE |
| LOW⚡ | scratch/test_token_replace.py | 29 | def translate_with_token_protection(text, target_lang): | CODE |
| LOW | scratch/batch_translate.py | 61 | def translate_with_protection(text, target_lang): | CODE |
| LOW | scratch/translate_chunk4_partA.py | 61 | def translate_with_protection(text, target_lang): | CODE |
| LOW | scratch/translate_all.py | 45 | def translate_list_with_retry(translator, texts, lang_code, batch_size=40): | CODE |
| LOW | scratch/translate_chunk4_threaded.py | 66 | def translate_with_protection(text, target_lang): | CODE |
| LOW⚡ | public/pdfjs-annotation-viewer/web/viewer.js | 13685 | function webViewerPresentationMode() { | CODE |
| LOW⚡ | public/pdfjs-annotation-viewer/web/viewer.js | 13688 | function webViewerSwitchAnnotationEditorMode(evt) { | CODE |
| LOW⚡ | public/pdfjs-annotation-viewer/web/viewer.js | 13691 | function webViewerSwitchAnnotationEditorParams(evt) { | CODE |
| LOW⚡ | public/pdfjs-annotation-viewer/web/viewer.js | 13739 | function webViewerOptionalContentConfig(evt) { | CODE |
| LOW⚡ | public/pdfjs-annotation-viewer/web/viewer.js | 13742 | function webViewerSwitchScrollMode(evt) { | CODE |
| LOW⚡ | public/pdfjs-annotation-viewer/web/viewer.js | 13745 | function webViewerSwitchSpreadMode(evt) { | CODE |
| LOW⚡ | public/pdfjs-annotation-viewer/web/viewer.js | 13748 | function webViewerDocumentProperties() { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 276 | function backtrackBeforeAllVisibleElements(index, views, top) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 306 | function isElementBottomAfterViewTop(view) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 311 | function isElementNextAfterViewHorizontally(view) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 377 | function normalizeWheelEventDirection(evt) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 476 | function getActiveOrFocusedElement() { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 485 | function apiPageLayoutToViewerModes(layout) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 544 | (function checkCanvasSizeLimitation() { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 2447 | function createTextNodeFromTextContent(element) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 9882 | function isValidAnnotationEditorMode(mode) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 13351 | function addWindowResolutionChange(evt = null) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 13603 | function webViewerPresentationModeChanged(evt) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 13606 | function webViewerSidebarViewChanged({ | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 13631 | function webViewerScrollModeChanged(evt) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 13636 | function webViewerSpreadModeChanged(evt) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 13721 | function webViewerPageNumberChanged(evt) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 13763 | function webViewerUpdateFindMatchesCount({ | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 13772 | function webViewerUpdateFindControlState({ | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 13793 | function webViewerRotationChanging(evt) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 13812 | function webViewerResolutionChange(evt) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 13815 | function webViewerVisibilityChange(evt) { | CODE |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 14266 | function webViewerAnnotationEditorStatesChanged(data) { | CODE |
| LOW⚡ | public/libreoffice-wasm/soffice.js | 2 | function GROWABLE_HEAP_I8(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP8}function GROWABLE_HEAP_ | CODE |
| LOW | public/workers/mobi-to-pdf.worker.js | 113 | async function initializePythonConverter() { | CODE |
| LOW | public/workers/mobi-to-pdf.worker.js | 164 | async function reinitializePythonConverter() { | CODE |
| LOW | public/workers/extract-attachments.worker.js | 163 | function extractAttachmentsFromPDFsInWorker(fileBuffers, fileNames) { | CODE |
| LOW⚡ | public/workers/table-of-contents-v2.worker.js | 41 | async def download_cjk_font_if_needed(needs_cjk): | CODE |
| LOW | public/workers/edit-attachments.worker.js | 150 | function getAttachmentsFromPDFInWorker(fileBuffer, fileName) { | CODE |
| LOW | public/workers/edit-attachments.worker.js | 223 | function editAttachmentsInPDFInWorker(fileBuffer, fileName, attachmentsToRemove) { | CODE |
| LOW | public/workers/word-to-pdf.worker.js | 115 | async function initializePythonConverter() { | CODE |
| LOW | public/workers/word-to-pdf.worker.js | 315 | def render_text_with_formatting(x, y, text, props, max_width): | CODE |
| LOW | public/workers/pptx-to-pdf.worker.js | 105 | async function initializePythonConverter() { | CODE |
| LOW | public/workers/add-attachments.worker.js | 30 | function addAttachmentsToPDFInWorker(pdfBuffer, attachmentBuffers, attachmentNames, attachmentLevel, pageRange) { | CODE |
| LOW | public/workers/rtf-to-pdf.worker.js | 109 | async function initializePythonConverter() { | CODE |
| LOW | public/workers/rtf-to-pdf.worker.js | 203 | async function reinitializePythonConverter() { | CODE |
| LOW | public/workers/epub-to-pdf.worker.js | 142 | async function initializePythonConverter() { | CODE |
| LOW | public/workers/epub-to-pdf.worker.js | 193 | async function reinitializePythonConverter() { | CODE |
| LOW | public/direct-pdf-editor/editcore.js | 9 | var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPro | CODE |
| LOW | public/direct-pdf-editor/app.js | 3453 | function snapshotPrefersIncremental() { | CODE |
| LOW | src/config/tools.ts | 1647 | export function getAllToolsIncludingDisabled(): Tool[] { | CODE |
| LOW | …ents/studio/tool-options/OptimizeRepairToolOptions.tsx | 25 | export function OptimizeRepairToolOptions({ | CODE |
| LOW | src/components/tools/edit-pdf/LegacyAnnotatorTool.tsx | 537 | function setupArrowEndpointHandles() { | CODE |
| LOW | src/components/tools/edit-pdf/LegacyAnnotatorTool.tsx | 808 | function setupColorPickerAndStroke() { | CODE |
| LOW | src/components/tools/edit-pdf/LegacyAnnotatorTool.tsx | 958 | function setupUndoRedoAndAuthorPatch() { | CODE |
| LOW | src/components/tools/edit-pdf/LegacyAnnotatorTool.tsx | 1087 | function updateUndoRedoButtonsState() { | CODE |
| LOW | …gnature-anchor-helper/PdfSignatureAnchorHelperTool.tsx | 18 | export function PdfSignatureAnchorHelperTool({ className = '' }: PdfSignatureAnchorHelperToolProps) { | CODE |
| LOW | …pdf-page-resizer-uniform/PdfPageResizerUniformTool.tsx | 18 | export function PdfPageResizerUniformTool({ className = '' }: PdfPageResizerUniformToolProps) { | CODE |
| 117 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | messages/zh.json | 137 | "placeholder": "搜索工具...", | CODE |
| LOW⚡ | messages/zh.json | 1167 | "placeholder": "您的姓名" | CODE |
| LOW⚡ | messages/zh.json | 1171 | "placeholder": "your@email.com" | CODE |
| LOW⚡ | messages/zh.json | 1175 | "placeholder": "选择主题", | CODE |
| LOW | messages/zh.json | 1186 | "placeholder": "告诉我们更多关于您的咨询..." | CODE |
| LOW | messages/zh.json | 1486 | "placeholder": "搜索工具...", | CODE |
| LOW | messages/ja.json | 137 | "placeholder": "ツールを検索...", | CODE |
| LOW⚡ | messages/ja.json | 1153 | "placeholder": "あなたのお名前" | CODE |
| LOW⚡ | messages/ja.json | 1157 | "placeholder": "your@email.com" | CODE |
| LOW⚡ | messages/ja.json | 1161 | "placeholder": "件名を選択してください", | CODE |
| LOW | messages/ja.json | 1172 | "placeholder": "お問い合わせ内容の詳細を教えてください..." | CODE |
| LOW | messages/ja.json | 1464 | "placeholder": "検索ツール...", | CODE |
| LOW | messages/de.json | 137 | "placeholder": "Werkzeuge suchen...", | CODE |
| LOW⚡ | messages/de.json | 1153 | "placeholder": "Ihr Name" | CODE |
| LOW⚡ | messages/de.json | 1157 | "placeholder": "your@email.com" | CODE |
| LOW⚡ | messages/de.json | 1161 | "placeholder": "Wählen Sie einen Betreff", | CODE |
| LOW | messages/de.json | 1172 | "placeholder": "Erzählen Sie uns mehr über Ihre Anfrage..." | CODE |
| LOW | messages/de.json | 1464 | "placeholder": "Suchwerkzeuge...", | CODE |
| LOW | messages/pl.json | 137 | "placeholder": "Wyszukaj narzędzia...", | CODE |
| LOW⚡ | messages/pl.json | 1167 | "placeholder": "Twoje imię" | CODE |
| LOW⚡ | messages/pl.json | 1171 | "placeholder": "Twój@e-mail.com" | CODE |
| LOW⚡ | messages/pl.json | 1175 | "placeholder": "Wybierz temat", | CODE |
| LOW | messages/pl.json | 1186 | "placeholder": "Opowiedz nam więcej o swoim zapytaniu..." | CODE |
| LOW | messages/pl.json | 1483 | "placeholder": "Wyszukaj narzędzia...", | CODE |
| LOW | messages/ta.json | 137 | "placeholder": "கருவிகளைத் தேடுக...", | CODE |
| LOW⚡ | messages/ta.json | 1167 | "placeholder": "உங்கள் பெயர்" | CODE |
| LOW⚡ | messages/ta.json | 1171 | "placeholder": "your@email.com" | CODE |
| LOW⚡ | messages/ta.json | 1175 | "placeholder": "ஒரு பொருளைத் தேர்ந்தெடுக்கவும்", | CODE |
| LOW | messages/ta.json | 1186 | "placeholder": "உங்கள் விசாரணையைப் பற்றி மேலும் சொல்லுங்கள்..." | CODE |
| LOW | messages/ta.json | 1486 | "placeholder": "கருவிகளைத் தேடுக...", | CODE |
| LOW | messages/pt.json | 137 | "placeholder": "Pesquisar ferramentas...", | CODE |
| LOW⚡ | messages/pt.json | 1153 | "placeholder": "Seu nome" | CODE |
| LOW⚡ | messages/pt.json | 1157 | "placeholder": "seu@email.com" | CODE |
| LOW⚡ | messages/pt.json | 1161 | "placeholder": "Selecione um assunto", | CODE |
| LOW | messages/pt.json | 1172 | "placeholder": "Conte-nos mais sobre sua consulta..." | CODE |
| LOW | messages/pt.json | 1464 | "placeholder": "Buscar ferramentas...", | CODE |
| LOW | messages/en.json | 137 | "placeholder": "Search tools...", | CODE |
| LOW⚡ | messages/en.json | 1167 | "placeholder": "Your name" | CODE |
| LOW⚡ | messages/en.json | 1171 | "placeholder": "your@email.com" | CODE |
| LOW⚡ | messages/en.json | 1175 | "placeholder": "Select a subject", | CODE |
| LOW | messages/en.json | 1186 | "placeholder": "Tell us more about your inquiry..." | CODE |
| LOW | messages/en.json | 1486 | "placeholder": "Search tools...", | CODE |
| LOW | messages/it.json | 137 | "placeholder": "Cerca strumenti…", | CODE |
| LOW⚡ | messages/it.json | 1153 | "placeholder": "Il tuo nome" | CODE |
| LOW⚡ | messages/it.json | 1157 | "placeholder": "tuo@email.com" | CODE |
| LOW⚡ | messages/it.json | 1161 | "placeholder": "Seleziona un oggetto", | CODE |
| LOW | messages/it.json | 1172 | "placeholder": "Dicci qualcosa in più sulla tua richiesta…" | CODE |
| LOW | messages/it.json | 1464 | "placeholder": "Cerca strumenti...", | CODE |
| LOW | messages/fr.json | 137 | "placeholder": "Rechercher des outils...", | CODE |
| LOW⚡ | messages/fr.json | 1153 | "placeholder": "Votre nom" | CODE |
| LOW⚡ | messages/fr.json | 1157 | "placeholder": "votre@email.com" | CODE |
| LOW⚡ | messages/fr.json | 1161 | "placeholder": "Sélectionnez un sujet", | CODE |
| LOW | messages/fr.json | 1172 | "placeholder": "Dites-nous en plus sur votre demande..." | CODE |
| LOW | messages/fr.json | 1464 | "placeholder": "Rechercher des outils...", | CODE |
| LOW | messages/ro.json | 137 | "placeholder": "Caută instrumente...", | CODE |
| LOW⚡ | messages/ro.json | 1153 | "placeholder": "Numele tău" | CODE |
| LOW⚡ | messages/ro.json | 1157 | "placeholder": "your@email.com" | CODE |
| LOW⚡ | messages/ro.json | 1161 | "placeholder": "Selectează un subiect", | CODE |
| LOW | messages/ro.json | 1172 | "placeholder": "Spune-ne mai multe despre solicitarea ta..." | CODE |
| LOW | messages/ro.json | 1464 | "placeholder": "Instrumente de căutare...", | CODE |
| 61 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | scratch/test_placeholders.py | 25 | except Exception as e: | CODE |
| MEDIUM⚡ | scratch/test_placeholders.py | 26 | print(f"Error translating: {e}") | CODE |
| LOW | scratch/batch_translate_threaded.py | 35 | except Exception: | CODE |
| LOW | scratch/batch_translate_threaded.py | 61 | except Exception as e: | CODE |
| LOW⚡ | scratch/test_token_replace.py | 25 | except Exception as e: | CODE |
| MEDIUM⚡ | scratch/test_token_replace.py | 26 | print(f"Error translating: {e}") | CODE |
| LOW | scratch/translate.py | 62 | except Exception as e: | CODE |
| LOW | scratch/translate.py | 99 | except Exception as e: | CODE |
| MEDIUM | scratch/translate.py | 100 | print(f"Error loading cache: {e}") | CODE |
| LOW | scratch/translate.py | 153 | except Exception as exc: | CODE |
| LOW⚡ | scratch/translate.py | 167 | except Exception as e: | CODE |
| MEDIUM⚡ | scratch/translate.py | 168 | print(f"Error saving cache: {e}") | CODE |
| LOW⚡ | scratch/translate.py | 175 | except Exception as e: | CODE |
| MEDIUM⚡ | scratch/translate.py | 176 | print(f"Error saving final output: {e}") | CODE |
| MEDIUM | scratch/translate.py | 163 | def save_cache(cache): | CODE |
| MEDIUM | scratch/translate.py | 170 | def write_final_output(output): | CODE |
| MEDIUM | scratch/merge_splits.py | 24 | print(f"Error: {split_file} does not exist.") | CODE |
| LOW | scratch/translate_script.py | 21 | except Exception as e: | CODE |
| LOW | scratch/translate_all_robust.py | 53 | except Exception as e: | CODE |
| LOW | scratch/translate_all_robust.py | 115 | except Exception as e: | CODE |
| MEDIUM | scratch/translate_all_robust.py | 116 | print(f"Error on batch attempt {attempt+1}/{retries}: {e}") | CODE |
| LOW | scratch/translate_all_robust.py | 132 | except Exception as e: | CODE |
| LOW | scratch/translate_all_robust.py | 163 | except Exception as e: | CODE |
| LOW | scratch/batch_translate.py | 29 | except Exception: | CODE |
| LOW | scratch/batch_translate.py | 54 | except Exception as e: | CODE |
| LOW | scratch/translate_chunk4_partA.py | 29 | except Exception: | CODE |
| LOW | scratch/translate_chunk4_partA.py | 54 | except Exception as e: | CODE |
| LOW | scratch/test_translate.py | 24 | except Exception as e: | CODE |
| MEDIUM | scratch/test_translate.py | 25 | print(f"Error translating: {e}") | CODE |
| LOW | scratch/translate_all.py | 66 | except Exception as e: | CODE |
| MEDIUM | scratch/translate_all.py | 67 | print(f"Error on attempt {attempt+1}/{retries}: {e}") | CODE |
| LOW | scratch/translate_all.py | 82 | except Exception as e: | CODE |
| LOW | scratch/search_translations.py | 16 | except Exception as e: | CODE |
| MEDIUM | scratch/search_translations.py | 17 | print(f"Error reading {filename}: {e}") | CODE |
| LOW | scratch/translate_chunk4_threaded.py | 34 | except Exception: | CODE |
| LOW | scratch/translate_chunk4_threaded.py | 60 | except Exception as e: | CODE |
| LOW⚡ | public/pymupdf-wasm/pymupdf.js | 1369 | except Exception as e: | CODE |
| LOW | public/pymupdf-wasm/pymupdf.js | 743 | except Exception as e: | CODE |
| LOW⚡ | public/pymupdf-wasm/pymupdf-lite.js | 1369 | except Exception as e: | CODE |
| LOW | public/pymupdf-wasm/pymupdf-lite.js | 743 | except Exception as e: | CODE |
| LOW⚡ | public/workers/extract-images.worker.js | 80 | except Exception as e: | CODE |
| MEDIUM⚡ | public/workers/extract-images.worker.js | 81 | print(f"Error extracting image {xref}: {e}") | CODE |
| LOW⚡ | public/workers/extract-images.worker.js | 86 | except Exception as e: | CODE |
| MEDIUM | public/workers/extract-images.worker.js | 42 | def extract_images_from_pdf(input_bytes, options): | CODE |
| LOW⚡ | public/workers/table-of-contents-v2.worker.js | 60 | except Exception as e: | CODE |
| LOW⚡ | public/workers/table-of-contents-v2.worker.js | 191 | except Exception as e: | CODE |
| LOW | public/workers/word-to-pdf.worker.js | 471 | except Exception as e: | CODE |
| LOW | public/workers/pptx-to-pdf.worker.js | 372 | except Exception as e: | CODE |
| LOW | public/workers/pptx-to-pdf.worker.js | 454 | except Exception as e: | CODE |
| LOW⚡ | public/workers/pdf-to-excel.worker.js | 80 | except Exception as e: | CODE |
| MEDIUM⚡ | public/workers/pdf-to-excel.worker.js | 81 | print(f"Error extracting table {i} on page {page_num}: {e}") | CODE |
| LOW⚡ | public/workers/pdf-to-excel.worker.js | 88 | except Exception as e: | CODE |
| MEDIUM | public/workers/pdf-to-excel.worker.js | 47 | def convert_pdf_to_excel(input_bytes, options=None): | CODE |
| LOW | src/lib/pdf/pymupdf-loader.ts | 263 | except Exception as e: | CODE |
| LOW | src/lib/pdf/pymupdf-loader.ts | 310 | except Exception as e: | CODE |
| LOW | src/lib/pdf/pymupdf-loader.ts | 559 | except Exception as e: | CODE |
| LOW | src/lib/pdf/pymupdf-loader.ts | 718 | except Exception as e: | CODE |
| LOW | src/lib/pdf/pymupdf-loader.ts | 1084 | except Exception as e: | CODE |
| LOW | src/lib/pdf/pymupdf-loader.ts | 1337 | except Exception: | CODE |
| LOW | src/lib/pdf/pymupdf-loader.ts | 1424 | except Exception: | CODE |
| 1 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | netlify.toml | 18 | # ========================================== | COMMENT |
| MEDIUM | netlify.toml | 20 | # ========================================== | COMMENT |
| MEDIUM | netlify.toml | 33 | # ========================================== | COMMENT |
| MEDIUM | netlify.toml | 35 | # ========================================== | COMMENT |
| MEDIUM | netlify.toml | 153 | # ========================================== | COMMENT |
| MEDIUM | netlify.toml | 155 | # ========================================== | COMMENT |
| MEDIUM | .github/workflows/docker-publish.yml | 1 | # ============================================================================= | COMMENT |
| MEDIUM | .github/workflows/docker-publish.yml | 5 | # ============================================================================= | COMMENT |
| MEDIUM | .github/workflows/docker-publish.yml | 28 | # ============================================================================ | COMMENT |
| MEDIUM | .github/workflows/docker-publish.yml | 30 | # ============================================================================ | COMMENT |
| MEDIUM | .github/workflows/docker-publish.yml | 116 | # ============================================================================ | COMMENT |
| MEDIUM | .github/workflows/docker-publish.yml | 118 | # ============================================================================ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scratch/inspect_translated_parts.py | 5 | # Set stdout to UTF-8 | COMMENT |
| LOW | scratch/inspect_chunk3.py | 23 | # Check if there are other translated parts | COMMENT |
| LOW | scratch/translate_all_robust.py | 8 | # Set stdout to UTF-8 to prevent console print encoding errors | COMMENT |
| LOW | scratch/translate_all.py | 7 | # Set stdout to UTF-8 to prevent console print encoding errors | COMMENT |
| LOW | scratch/test_batch.py | 6 | # Set stdout to UTF-8 | COMMENT |
| LOW⚡ | public/pymupdf-wasm/pymupdf.js | 838 | # Check if we are looking at the child ref | COMMENT |
| LOW⚡ | public/pymupdf-wasm/pymupdf.js | 843 | # Check if chunk starts with child_ref followed by non-digit | COMMENT |
| LOW⚡ | public/pymupdf-wasm/pymupdf.js | 1343 | # Check if pixmap needs conversion to RGB | COMMENT |
| LOW | public/pymupdf-wasm/pymupdf.js | 970 | # Check if already in array | COMMENT |
| LOW⚡ | public/pymupdf-wasm/pymupdf-lite.js | 838 | # Check if we are looking at the child ref | COMMENT |
| LOW⚡ | public/pymupdf-wasm/pymupdf-lite.js | 843 | # Check if chunk starts with child_ref followed by non-digit | COMMENT |
| LOW⚡ | public/pymupdf-wasm/pymupdf-lite.js | 1343 | # Check if pixmap needs conversion to RGB | COMMENT |
| LOW | public/pymupdf-wasm/pymupdf-lite.js | 970 | # Check if already in array | COMMENT |
| LOW | public/workers/table-of-contents-v2.worker.js | 77 | # Check if we need CJK font | COMMENT |
| LOW | public/workers/fb2-to-pdf.worker.js | 60 | # Check if it's a zipped FB2 | COMMENT |
| LOW | public/workers/table-of-contents.worker.js | 109 | # Check if we need a new page | COMMENT |
| LOW | public/workers/pdf-to-excel.worker.js | 56 | # Check if we found any tables | COMMENT |
| LOW | src/lib/pdf/pymupdf-loader.ts | 287 | # Check if we need a new page | COMMENT |
| LOW | src/lib/pdf/pymupdf-loader.ts | 749 | # Return result | COMMENT |
| LOW | src/lib/pdf/pymupdf-loader.ts | 1059 | # Check if we need to reduce quality | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | public/pymupdf-wasm/pymupdf.js | 1372 | # Create a new RGB pixmap with same dimensions | COMMENT |
| MEDIUM⚡ | public/pymupdf-wasm/pymupdf-lite.js | 1372 | # Create a new RGB pixmap with same dimensions | COMMENT |
| MEDIUM | public/workers/table-of-contents-v2.worker.js | 98 | # Create a new PDF for the TOC page | COMMENT |
| MEDIUM | public/workers/table-of-contents.worker.js | 59 | # Create a new PDF for the TOC page | COMMENT |
| MEDIUM | public/workers/table-of-contents.worker.js | 171 | # Create a link to the target page | COMMENT |
| MEDIUM | src/lib/pdf/pymupdf-loader.ts | 1135 | # Create a new document | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | public/pymupdf-wasm/pymupdf.js | 1379 | # Last resort: just pass through and hope for the best | COMMENT |
| LOW⚡ | public/pymupdf-wasm/pymupdf-lite.js | 1379 | # Last resort: just pass through and hope for the best | COMMENT |
| MEDIUM | public/workers/table-of-contents-v2.worker.js | 256 | // Use Blob for robust transfer, similar to word-to-pdf worker | COMMENT |
| MEDIUM | src/lib/pdf/processors/pdf-scratchpad-canvas.ts | 122 | // To keep it clean and robust, we expand size. In pdf-lib, translating all content requires pushing a graphic | COMMENT |
| MEDIUM | src/lib/pdf/processors/form-logic-designer.ts | 144 | // For inputs/checkboxes, Validate is the most robust event for values | COMMENT |
| MEDIUM | src/lib/pdf/processors/table-of-contents.ts | 104 | // Use V2 worker to bypass cache and use robust byte handling | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | public/workers/pdf-to-docx.worker.js | 154 | // Step 1: Write PDF to virtual filesystem | COMMENT |
| LOW | public/workers/pdf-to-docx.worker.js | 165 | // Step 2: Convert PDF to DOCX (returns page count) | COMMENT |
| LOW | public/workers/pdf-to-docx.worker.js | 181 | // Step 3: Read result | COMMENT |
| LOW | src/lib/pdf/processors/citation-linker.ts | 77 | // Step 2: Extract reference items (e.g. "[1] Author, Title. DOI: ...") | COMMENT |
| LOW | src/lib/pdf/processors/citation-linker.ts | 103 | // Step 3: Scan body pages (1 to referencesPageNum - 1) for citation markers (e.g., [1] or [1,2]) | COMMENT |
| LOW | src/lib/pdf/processors/citation-linker.ts | 156 | // Step 4: If we are in "apply mode" (user selected which citations to link) | COMMENT |
| LOW | src/lib/utils/html-sanitizer.ts | 47 | // Step 1: Replace disallowed tags but keep their content | COMMENT |
| LOW | src/lib/utils/html-sanitizer.ts | 93 | // Step 2: Remove dangerous script/event content that might have been in text | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | public/workers/pdf-to-docx.worker.js | 154 | // Step 1: Write PDF to virtual filesystem | COMMENT |
| LOW | public/workers/pdf-to-docx.worker.js | 165 | // Step 2: Convert PDF to DOCX (returns page count) | COMMENT |
| LOW | public/workers/pdf-to-docx.worker.js | 181 | // Step 3: Read result | COMMENT |
| LOW | src/lib/pdf/processors/citation-linker.ts | 77 | // Step 2: Extract reference items (e.g. "[1] Author, Title. DOI: ...") | COMMENT |
| LOW | src/lib/pdf/processors/citation-linker.ts | 103 | // Step 3: Scan body pages (1 to referencesPageNum - 1) for citation markers (e.g., [1] or [1,2]) | COMMENT |
| LOW | src/lib/pdf/processors/citation-linker.ts | 156 | // Step 4: If we are in "apply mode" (user selected which citations to link) | COMMENT |
| LOW | src/lib/utils/html-sanitizer.ts | 47 | // Step 1: Replace disallowed tags but keep their content | COMMENT |
| LOW | src/lib/utils/html-sanitizer.ts | 93 | // Step 2: Remove dangerous script/event content that might have been in text | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | public/libreoffice-wasm/soffice.js | 2 | function GROWABLE_HEAP_I8(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP8}function GROWABLE_HEAP_ | CODE |
| LOW⚡ | public/libreoffice-wasm/soffice.js | 2 | function GROWABLE_HEAP_I8(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP8}function GROWABLE_HEAP_ | CODE |
| MEDIUM | src-tauri/gen/schemas/acl-manifests.json | 1 | {"__app-acl__":{"default_permission":null,"permissions":{"allow-get-system-printers":{"identifier":"allow-get-system-pri | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scratch/inspect_translated_parts.py | 10 | CODE | |
| LOW | scratch/translate.py | 44 | CODE | |
| LOW | scratch/translate.py | 87 | CODE | |
| LOW | scratch/translate_all_robust.py | 57 | CODE | |
| LOW | scratch/polish_translations.py | 3 | CODE | |
| LOW | scratch/translate_all.py | 45 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scratch/translate_script.py | 5 | CODE | |
| LOW | scratch/inspect_keys.py | 2 | CODE | |
| LOW | scratch/test_batch.py | 2 | CODE | |
| LOW | scratch/test_batch.py | 3 | CODE | |
| LOW | scratch/search_translations.py | 1 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 3081 | } | COMMENT |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 7001 | } | COMMENT |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 9101 | const DEFAULT_LAYER_PROPERTIES = null; | COMMENT |
| LOW | public/pdfjs-annotation-viewer/web/viewer.js | 9941 | #enableHighlightFloatingButton = false; | COMMENT |
| LOW | public/direct-pdf-editor/styles.css | 1841 | #text-editor-app #contextbar, | COMMENT |
| LOW | src-tauri/src/main.rs | 301 | COMMENT | |
| LOW | src/lib/pdf/processors/crop.ts | 121 | // True destructive crop in PDF is complex (requires rewriting content streams). | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | public/libreoffice-wasm/soffice.js | 2 | function GROWABLE_HEAP_I8(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP8}function GROWABLE_HEAP_ | CODE |
| LOW | public/direct-pdf-editor/editcore.js | 9 | var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPro | CODE |