AI Slop Code Risk Monitor

alam00000/bentopdf

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

The Privacy First PDF Toolkit

2.9 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for alam00000/bentopdf, a JavaScript project with 16,216 GitHub stars. SynthScan examined 714,789 lines of code across 3991 source files, recording 695 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 2.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.

2.9
Adjusted Signal
2.9
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
16.2K
Stars
JavaScript
Language
714.8K
Lines of Code
4.0K
Files
695
Pattern Hits
2026-10-31
Scan Date
0.00
HC Hit Rate

Risk Review · Payload v1

Use each vector to guide manual verification of the underlying findings.

Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.

Cognitive Ownership Risk 1.2/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.1/100 · LOW

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

Agent Over-Engineering Ratio 12.8/100 · LOW

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

PR Review Velocity Impact 11.8/100 · LOW

Which changes need focused human review? 695 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 0MEDIUM 552LOW 143

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 695 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Decorative Section Separators550 hits · 1884 pts
SeverityFileLineSnippetContext
MEDIUMcloudflare/wasm-wrangler.toml5# =============================================================================COMMENT
MEDIUMcloudflare/wasm-wrangler.toml7# =============================================================================COMMENT
MEDIUMcloudflare/wasm-wrangler.toml22# =============================================================================COMMENT
MEDIUMcloudflare/wasm-wrangler.toml24# =============================================================================COMMENT
MEDIUM⚡cloudflare/wasm-wrangler.toml39# =============================================================================COMMENT
MEDIUM⚡cloudflare/wasm-wrangler.toml41# =============================================================================COMMENT
MEDIUM⚡cloudflare/wasm-wrangler.toml47# =============================================================================COMMENT
MEDIUM⚡cloudflare/wasm-wrangler.toml49# =============================================================================COMMENT
MEDIUMcloudflare/wasm-wrangler.toml63# =============================================================================COMMENT
MEDIUMcloudflare/wasm-wrangler.toml65# =============================================================================COMMENT
MEDIUMcloudflare/wrangler.toml9# =============================================================================COMMENT
MEDIUMcloudflare/wrangler.toml11# =============================================================================COMMENT
MEDIUMcloudflare/wrangler.toml31# =============================================================================COMMENT
MEDIUMcloudflare/wrangler.toml33# =============================================================================COMMENT
MEDIUMdocs/sk/self-hosting/hostinger.md57# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/hostinger.md59# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/hostinger.md72# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/hostinger.md74# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/hostinger.md93# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/hostinger.md95# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/hostinger.md117# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/hostinger.md119# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/hostinger.md141# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/hostinger.md143# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/hostinger.md163# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/hostinger.md165# ============================================COMMENT
MEDIUM⚡docs/sk/self-hosting/hostinger.md181# ============================================COMMENT
MEDIUM⚡docs/sk/self-hosting/hostinger.md183# ============================================COMMENT
MEDIUM⚡docs/sk/self-hosting/hostinger.md189# ============================================COMMENT
MEDIUM⚡docs/sk/self-hosting/hostinger.md191# ============================================COMMENT
MEDIUM⚡docs/sk/self-hosting/hostinger.md197# ============================================COMMENT
MEDIUM⚡docs/sk/self-hosting/hostinger.md199# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/apache.md113# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/apache.md115# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/apache.md131# ============================================COMMENT
MEDIUMdocs/sk/self-hosting/apache.md133# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/hostinger.md57# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/hostinger.md59# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/hostinger.md72# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/hostinger.md74# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/hostinger.md93# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/hostinger.md95# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/hostinger.md117# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/hostinger.md119# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/hostinger.md141# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/hostinger.md143# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/hostinger.md163# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/hostinger.md165# ============================================COMMENT
MEDIUM⚡docs/pl/self-hosting/hostinger.md181# ============================================COMMENT
MEDIUM⚡docs/pl/self-hosting/hostinger.md183# ============================================COMMENT
MEDIUM⚡docs/pl/self-hosting/hostinger.md189# ============================================COMMENT
MEDIUM⚡docs/pl/self-hosting/hostinger.md191# ============================================COMMENT
MEDIUM⚡docs/pl/self-hosting/hostinger.md197# ============================================COMMENT
MEDIUM⚡docs/pl/self-hosting/hostinger.md199# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/apache.md113# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/apache.md115# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/apache.md131# ============================================COMMENT
MEDIUMdocs/pl/self-hosting/apache.md133# ============================================COMMENT
MEDIUMdocs/vi/self-hosting/hostinger.md57# ============================================COMMENT
MEDIUMdocs/vi/self-hosting/hostinger.md59# ============================================COMMENT
490 more matches not shown…
Hyper-Verbose Identifiers80 hits · 82 pts
SeverityFileLineSnippetContext
LOWvite.config.ts233function buildCorsProxyAllowedHosts(): Set<string> {CODE
LOWvite.config.ts279function createCorsProxyMiddleware(): Connect.NextHandleFunction {CODE
LOWvite.config.ts447function devPageTranslationsPlugin(): Plugin {CODE
LOWcloudflare/cors-proxy-worker.js205async function hostnameResolvesToPrivate(hostname) {CODE
LOWpublic/sw.js124async function cacheFirstStrategyWithDedup(request, isCDN) {CODE
LOW⚡public/libreoffice-wasm/soffice.js2function GROWABLE_HEAP_I8(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP8}function GROWABLE_HEAP_CODE
LOWpublic/workers/extract-attachments.worker.js23function extractAttachmentsFromPDFsInWorker(fileBuffers, fileNames) {CODE
LOWpublic/workers/edit-attachments.worker.js23function getAttachmentsFromPDFInWorker(fileBuffer, fileName) {CODE
LOWpublic/workers/edit-attachments.worker.js97function editAttachmentsInPDFInWorker(CODE
LOWpublic/workers/json-to-pdf.worker.js23function convertJSONsToPDFInWorker(fileBuffers, fileNames) {CODE
LOWpublic/workers/add-attachments.worker.js45function addAttachmentsToPDFInWorker(CODE
LOWpublic/workers/pdf-to-json.worker.js23function convertPDFsToJSONInWorker(fileBuffers, fileNames) {CODE
LOWpublic/workers/table-of-contents.worker.js23function generateTableOfContentsInWorker(CODE
LOWscripts/include-docs-in-dist.js34function findUnlistedInlineScripts(dir, unlisted = new Set()) {CODE
LOWsrc/js/main.ts1273 function getReservedShortcutWarning(CODE
LOWsrc/js/ui.ts177function initializeOrganizeSortable(containerId: string) {CODE
LOWsrc/js/logic/rotate-custom-page.ts63function updateAllRotationDisplays() {CODE
LOWsrc/js/logic/form-filler-page.ts225async function processAndDownloadForm() {CODE
LOWsrc/js/logic/rotate-pdf-page.ts51function updateAllRotationDisplays() {CODE
LOWsrc/js/logic/pdf-workflow-page.ts1412 function applyConditionalVisibility(CODE
LOWsrc/js/logic/form-creator.ts506function getPreviewBackgroundColor(CODE
LOWsrc/js/logic/form-creator.ts528function clearTransparentWidgetBackground(CODE
LOWsrc/js/logic/form-creator.ts544function clearTransparentFieldWidgetBackgrounds(CODE
LOWsrc/js/logic/form-creator.ts902function applyResizeWithConstraints(CODE
LOWsrc/js/logic/merge-pdf-page.ts52function initializeFileListSortable() {CODE
LOWsrc/js/logic/merge-pdf-page.ts75function initializePageThumbnailsSortable() {CODE
LOWsrc/js/logic/merge-pdf-page.ts103async function renderPageMergeThumbnails() {CODE
LOWsrc/js/logic/validate-signature-pdf.ts621function getSignatureAlgorithmName(oid: string): string {CODE
LOWsrc/js/logic/validate-signature-pdf.ts1012async function performCryptoVerification(CODE
LOWsrc/js/logic/bookmark-pdf.ts1415async function renderPageWithDestination(CODE
LOWsrc/js/logic/page-dimensions-page.ts253function analyzeAndDisplayDimensions() {CODE
LOWsrc/js/logic/ocr-pdf-page.ts92function updateLanguageAvailabilityNotice() {CODE
LOWsrc/js/logic/duplicate-organize.ts23function initializePageGridSortable() {CODE
LOWsrc/js/logic/duplicate-organize.ts89export async function renderDuplicateOrganizeThumbnails() {CODE
LOWsrc/js/logic/duplicate-organize.ts189export async function processAndSave() {CODE
LOWsrc/js/logic/compare-pdfs-page.ts84function getEffectiveCategoryFilter(): CompareCategoryFilterState {CODE
LOWsrc/js/logic/compare-pdfs-page.ts179function updateOverlayScopeButtons() {CODE
LOWsrc/js/logic/compare-pdfs-page.ts198function updateExportMenuForViewMode() {CODE
LOWsrc/js/logic/compare-pdfs-page.ts211function updateOverlayPreviewState() {CODE
LOWsrc/js/utils/tesseract-language-availability.ts40export function resolveConfiguredTesseractAvailableLanguages(CODE
LOWsrc/js/utils/tesseract-language-availability.ts51export function getAvailableTesseractLanguageEntries(CODE
LOWsrc/js/utils/tesseract-language-availability.ts67export function getUnavailableTesseractLanguages(CODE
LOWsrc/js/utils/tesseract-language-availability.ts82export function formatTesseractLanguageList(codes: string[]): string {CODE
LOWsrc/js/utils/tesseract-language-availability.ts86function buildUnsupportedLanguageMessage(CODE
LOWsrc/js/utils/tesseract-language-availability.ts121export function assertTesseractLanguagesAvailable(CODE
LOWsrc/js/utils/shortcuts-init.ts3export function initializeGlobalShortcuts() {CODE
LOWsrc/js/utils/load-pdf-document.ts52export async function removeUnreferencedObjects(CODE
LOWsrc/js/utils/sanitize.ts240function removeEmbeddedFilesFromDoc(pdfDoc: PDFDocument) {CODE
LOWsrc/js/utils/sanitize.ts314function createOptionalContentVisibility(pdfDoc: PDFDocument) {CODE
LOWsrc/js/utils/sanitize.ts834function removeStructureTreeFromDoc(pdfDoc: PDFDocument) {CODE
LOWsrc/js/utils/helpers.ts252export function resetAndReloadTool(preResetCallback?: () => void) {CODE
LOWsrc/js/utils/pdf-content-tokens.ts55function skipWhitespaceAndComments(bytes: Uint8Array, pos: number): number {CODE
LOWsrc/js/utils/disabled-tools.ts64export function getEditorDisabledCategories(): string[] {CODE
LOWsrc/js/utils/password-prompt.ts128function validatePasswordWithPdfjs(CODE
LOWsrc/js/utils/password-prompt.ts805export async function loadPdfWithPasswordPrompt(CODE
LOWsrc/js/utils/wasm-provider.ts42function collectBuiltinTrustedHosts(): Set<string> {CODE
LOWsrc/js/utils/freetext-flatten.ts187export async function flattenFreeTextToPageText(CODE
LOWsrc/js/utils/images-to-pdf-lib.ts11export async function normalizeImageToEmbeddable(CODE
LOWsrc/js/utils/tesseract-runtime.ts36function getDefaultTesseractAssetEnv(): TesseractAssetEnv {CODE
LOW⚡src/js/utils/tesseract-runtime.ts52export function resolveTesseractAssetConfig(CODE
20 more matches not shown…
Structural Annotation Overuse36 hits · 57 pts
SeverityFileLineSnippetContext
LOWTRANSLATION.md87### Step 1: Create Translation FilesCOMMENT
LOWTRANSLATION.md97### Step 2: Translate the JSON FilesCOMMENT
LOWTRANSLATION.md133### Step 3: Register the LanguageCOMMENT
LOWTRANSLATION.md150### Step 4: Update Vite ConfigurationCOMMENT
LOWTRANSLATION.md173### Step 5: Test Your TranslationCOMMENT
LOWTRANSLATION.md183### Step 6: Build and Verify Static FilesCOMMENT
LOWdocs/contributing.md48### Step 1: Create the Logic FileCOMMENT
LOWdocs/contributing.md61### Step 2: Create the HTML PageCOMMENT
LOWdocs/contributing.md65### Step 3: Register the ToolCOMMENT
LOWdocs/contributing.md78### Step 4: Add to Build ConfigCOMMENT
LOWdocs/contributing.md86### Step 5: Add TranslationsCOMMENT
LOW⚡docs/self-hosting/netlify.md11### Step 1: Connect RepositoryCOMMENT
LOW⚡docs/self-hosting/netlify.md18### Step 2: Configure Build SettingsCOMMENT
LOW⚡docs/self-hosting/netlify.md26### Step 3: DeployCOMMENT
LOWdocs/self-hosting/nginx.md11## Step 1: Build the ProjectCOMMENT
LOWdocs/self-hosting/nginx.md26## Step 2: Copy FilesCOMMENT
LOWdocs/self-hosting/nginx.md34## Step 3: Nginx ConfigurationCOMMENT
LOWdocs/self-hosting/nginx.md114## Step 4: Enable the SiteCOMMENT
LOWdocs/self-hosting/nginx.md122## Step 5: SSL with Let's EncryptCOMMENT
LOWdocs/self-hosting/vercel.md11### Step 1: Fork the RepositoryCOMMENT
LOWdocs/self-hosting/vercel.md15### Step 2: Import to VercelCOMMENT
LOWdocs/self-hosting/vercel.md28### Step 3: Environment Variables (Optional)COMMENT
LOWdocs/self-hosting/vercel.md40### Step 4: DeployCOMMENT
LOWdocs/self-hosting/hostinger.md10## Step 1: Build the ProjectCOMMENT
LOWdocs/self-hosting/hostinger.md21## Step 2: Upload to HostingerCOMMENT
LOWdocs/self-hosting/hostinger.md45## Step 3: Create .htaccess FileCOMMENT
LOWdocs/self-hosting/aws.md11## Step 1: Create S3 BucketCOMMENT
LOWdocs/self-hosting/aws.md23## Step 2: Build and UploadCOMMENT
LOWdocs/self-hosting/aws.md55## Step 3: Create CloudFront DistributionCOMMENT
LOWdocs/self-hosting/aws.md127## Step 4: S3 Bucket PolicyCOMMENT
LOWdocs/self-hosting/aws.md153## Step 5: Custom Error PagesCOMMENT
LOWdocs/self-hosting/apache.md11## Step 1: Build the ProjectCOMMENT
LOWdocs/self-hosting/apache.md26## Step 2: Copy FilesCOMMENT
LOWdocs/self-hosting/apache.md34## Step 3: Apache ConfigurationCOMMENT
LOW⚡docs/self-hosting/apache.md142## Step 5: Enable Required ModulesCOMMENT
LOW⚡docs/self-hosting/apache.md152## Step 6: Enable the SiteCOMMENT
Over-Commented Block17 hits · 17 pts
SeverityFileLineSnippetContext
LOWtsconfig.json1// {COMMENT
LOWdocker-compose.yml1services:COMMENT
LOWcloudflare/wasm-wrangler.toml1name = "bentopdf-wasm-proxy"COMMENT
LOWcloudflare/wasm-wrangler.toml21COMMENT
LOWcloudflare/wasm-wrangler.toml41# =============================================================================COMMENT
LOWcloudflare/wasm-wrangler.toml61id = "b88e030b308941118cd484e3fcb3ae49"COMMENT
LOWcloudflare/wrangler.toml1name = "bentopdf-cors-proxy"COMMENT
LOWcloudflare/wrangler.toml21# - Limits: 60 requests per IP per minuteCOMMENT
LOWcloudflare/wrangler.toml41# ]COMMENT
LOWscripts/prepare-airgap.sh1#!/usr/bin/env bashCOMMENT
LOWsrc/css/styles.css1421}COMMENT
LOWsrc/css/edit-pdf-text.css1801COMMENT
LOWsrc/js/logic/md-to-pdf.ts1// // note: this is a work in progressCOMMENT
LOWsrc/js/logic/md-to-pdf.ts21// showAlert('Input Required', 'Please enter some Markdown text.');COMMENT
LOWsrc/js/logic/md-to-pdf.ts41// body { font-family: Helvetica, Arial, sans-serif; line-height: 1.6; font-size: 12px; }COMMENT
LOWsrc/js/logic/md-to-pdf.ts61// // @ts-expect-error TS(2339) FIXME: Property 'jspdf' does not exist on type 'Window & ... Remove this comment to COMMENT
LOWsrc/js/logic/md-to-pdf.ts81// position = position - pageHeight;COMMENT
Fake / Example Data6 hits · 8 pts
SeverityFileLineSnippetContext
LOWsrc/tests/content-segments.test.ts129 expect(input?.getAttribute('placeholder')).toBe('Werkzeuge suchen');CODE
LOW⚡src/tests/edit-pdf-redaction.test.ts91 viewer.mark('doc', { id: 'a', kind: 'text', text: 'Jane Doe' });CODE
LOW⚡src/tests/edit-pdf-redaction.test.ts98 viewer.mark('doc', { id: 'a', kind: 'text', text: 'Jane Doe' });CODE
LOW⚡src/tests/edit-pdf-redaction.test.ts103 expect(tracker.appliedTexts('doc')).toEqual(['Jane Doe', undefined]);CODE
LOW⚡src/tests/edit-pdf-redaction.test.ts111 viewer.mark('doc', { id: 'b', kind: 'text', text: 'Acme Corp' });CODE
LOWsrc/tests/edit-pdf-redaction.test.ts160 ).toEqual(['John Smith', 'Acme Corp', 'John']);CODE
Slop Phrases2 hits · 4 pts
SeverityFileLineSnippetContext
MEDIUM⚡public/libreoffice-wasm/soffice.js2function GROWABLE_HEAP_I8(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP8}function GROWABLE_HEAP_CODE
LOW⚡public/libreoffice-wasm/soffice.js2function GROWABLE_HEAP_I8(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP8}function GROWABLE_HEAP_CODE
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOW⚡scripts/prepare-airgap.sh13# Usage:COMMENT
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMpackage-lock.json10181 "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",CODE
Overly Generic Function Names1 hit · 2 pts
SeverityFileLineSnippetContext
LOW⚡public/libreoffice-wasm/soffice.js2function GROWABLE_HEAP_I8(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP8}function GROWABLE_HEAP_CODE
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWscripts/prepare-airgap.sh719 # Check if image exists or tar existsCOMMENT