AI Slop Code Risk Monitor

apify/crawlee

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

Crawlee—A web scraping and browser automation library for Node.js to build reliable crawlers. In JavaScript and TypeScript. Extract data for AI, LLMs, RAG, or GPTs. Download HTML, PDF, JPG, PNG, and other files from websites. Works with Puppeteer, Playwright, Cheerio, JSDOM, and raw HTTP. Both headful and headless mode. With proxy rotation.

0.7 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for apify/crawlee, a TypeScript project with 26,303 GitHub stars. SynthScan examined 178,703 lines of code across 1973 source files, recording 97 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 0.7 (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.

0.7
Adjusted Signal
0.7
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
26.3K
Stars
TypeScript
Language
178.7K
Lines of Code
2.0K
Files
97
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 2.4/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.8/100 · LOW

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

Agent Over-Engineering Ratio 2.2/100 · LOW

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

PR Review Velocity Impact 3.4/100 · LOW

Which changes need focused human review? 97 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 4MEDIUM 3LOW 90

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 97 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.

Hyper-Verbose Identifiers69 hits · 69 pts
SeverityFileLineSnippetContext
LOWtest/core/enqueue-links/enqueue-links.test.ts113async function runPlaywrightEnqueueLinks(CODE
LOWtest/core/enqueue-links/click-elements.test.ts30function isPuppeteerTargetRelevant(page: PPPage, target: Target): boolean {CODE
LOW…/fs-storage/request-queue/request-queue-access.test.ts20 async function seedQueueWithDanglingLock(dir: string) {CODE
LOWtest/browser-pool/remote-browser.test.ts59function createMockPlaywrightLibrary(browser = createMockBrowser()) {CODE
LOWtest/browser-pool/remote-browser.test.ts69function createMockPuppeteerLibrary(browser = createMockBrowser()) {CODE
LOWwebsite/blog/2025/07-14-scrape-youtube/index.md271 async def handle_transcript_request(route: PlaywrightRoute, request: PlaywrightRequest) -> None:CODE
LOWwebsite/src/theme/Navbar/MobileSidebar/Layout/index.js5export default function NavbarMobileSidebarLayout({CODE
LOWwebsite/src/theme/Navbar/MobileSidebar/Header/index.js29export default function NavbarMobileSidebarHeader() {CODE
LOW…te/src/theme/BlogPostItem/Footer/ReadMoreLink/index.js15export default function BlogPostItemFooterReadMoreLink(props) {CODE
LOWwebsite/src/theme/BlogPostItem/Header/Authors/index.js7export default function BlogPostItemHeaderAuthors({ className }) {CODE
LOWwebsite/src/pages/index.js20function LanguageGetStartedSection() {CODE
LOWdocs/public-api/crawlee-playwright.api.md187function enqueueLinksByClickingElements(options: EnqueueLinksByClickingElementsOptions): Promise<BatchAddRequestsResult>CODE
LOWdocs/public-api/crawlee-playwright.api.md214function handleCloudflareChallenge(page: Page, url: string, options?: HandleCloudflareChallengeOptions): Promise<ResponsCODE
LOWdocs/public-api/crawlee-playwright.api.md217export function handleCloudflareChallengeHook(options?: HandleCloudflareChallengeOptions): PlaywrightHook;CODE
LOWdocs/public-api/crawlee-puppeteer.api.md40function addInterceptRequestHandler(page: Page, handler: InterceptHandler): Promise<void>;CODE
LOWdocs/public-api/crawlee-puppeteer.api.md75function enqueueLinksByClickingElements(options: EnqueueLinksByClickingElementsOptions): Promise<BatchAddRequestsResult>CODE
LOWdocs/public-api/crawlee-puppeteer.api.md232function removeInterceptRequestHandler(page: Page, handler: InterceptHandler): Promise<void>;CODE
LOWpackages/core/src/service-locator.ts339export function bindMethodsToServiceLocator(CODE
LOWpackages/core/src/storages/request-loader.ts41export function joinRequestSourceStatuses(a: RequestSourceStatus, b: RequestSourceStatus): RequestSourceStatus {CODE
LOWpackages/core/src/storages/utils.ts188 function getOrCreate(): Promise<TItem[]> {CODE
LOWpackages/core/src/storages/request-list.ts60function buildRequestListStateCodec(list: {CODE
LOWpackages/core/src/storages/transaction.ts457export function currentStorageTransaction(): StorageTransaction | undefined {CODE
LOWpackages/core/src/storages/transaction.ts481export function rejectOperationInTransaction(operation: string, reason = 'it cannot be rolled back.'): void {CODE
LOWpackages/core/src/storages/transaction.ts494export function operationRejectedInTransaction(operation: string, reason = 'it cannot be rolled back.'): Error {CODE
LOWpackages/core/src/storages/key-value-store-codec.ts128function isContentTypeStringifiable(contentType: string): boolean {CODE
LOWpackages/http-crawler/src/internals/utils.ts15export function processHttpRequestOptions({CODE
LOWpackages/http-crawler/src/internals/utils.ts69export function extractCharsetFromHtmlBytes(bytes: Buffer): string | undefined {CODE
LOWpackages/http-crawler/src/internals/utils.ts80export function parseContentTypeFromResponse(response: Response): { type: string; charset: BufferEncoding } {CODE
LOWpackages/utils/src/internals/validation.ts11export function assertBrowserPoolNotConfigured(crawlerName: string, ignoredOptions: Dictionary): void {CODE
LOWpackages/utils/src/internals/general.ts54 function replaceShadowDomsWithHtml(rootElement: any) {CODE
LOWpackages/cli/src/commands/create-project-command.ts69async function downloadTemplateFilesToDisk(template: Template, destinationDirectory: string) {CODE
LOWpackages/browser-pool/src/fingerprinting/hooks.ts29export function createFingerprintPreLaunchHook(browserPool: BrowserPool<any, any, any, any, any>) {CODE
LOWpackages/basic-crawler/src/internals/request-timeout.ts42export function remainingNavigationWindowMillis(ctx: object, windowMillis: number): number {CODE
LOWpackages/basic-crawler/src/internals/cookie-utils.ts27export function getDefaultCookieExpirationDate(maxAgeSecs: number) {CODE
LOWpackages/basic-crawler/src/internals/cookie-utils.ts37export function toughCookieToBrowserPoolCookie(toughCookie: Cookie): CookieObject {CODE
LOWpackages/basic-crawler/src/internals/cookie-utils.ts61export function browserPoolCookieToToughCookie(cookieObject: CookieObject, maxAgeSecs?: number) {CODE
LOWpackages/basic-crawler/src/internals/cookie-utils.ts88export function cookieStringToToughCookie(cookieString: string) {CODE
LOW…asic-crawler/src/internals/session-pool/fingerprint.ts31export function createDefaultSessionFingerprint(): SessionFingerprint {CODE
LOW…sic-crawler/src/internals/session-pool/session-pool.ts80function buildSessionPoolStateCodec(pool: {CODE
LOW…c-crawler/src/internals/enqueue-links/enqueue-links.ts158export function resolveBaseUrlForEnqueueLinksFiltering({CODE
LOW…c-crawler/src/internals/enqueue-links/enqueue-links.ts209export function buildEnqueueStrategyPatterns(baseUrl: string, strategy: EnqueueStrategyOption): UrlPatternObject[] {CODE
LOW…es/basic-crawler/src/internals/enqueue-links/shared.ts82export function updateEnqueueLinksPatternCache(CODE
LOW…es/basic-crawler/src/internals/enqueue-links/shared.ts98export function constructGlobObjectsFromGlobs(globs: readonly GlobInput[]): GlobObject[] {CODE
LOW…es/basic-crawler/src/internals/enqueue-links/shared.ts148export function constructRegExpObjectsFromRegExps(regexps: readonly RegExpInput[]): RegExpObject[] {CODE
LOW…es/basic-crawler/src/internals/enqueue-links/shared.ts181export function constructUrlPatternObjects(patterns: readonly UrlPatternInput[]): UrlPatternObject[] {CODE
LOW…es/basic-crawler/src/internals/enqueue-links/shared.ts201export function filterRequestOptionsByPatterns(CODE
LOW…es/basic-crawler/src/internals/enqueue-links/shared.ts305function createPatternObjectMatcher(urlPatternObject: UrlPatternObject) {CODE
LOW…/src/internals/utils/puppeteer-request-interception.ts161export async function addInterceptRequestHandler(page: Page, handler: InterceptHandler): Promise<void> {CODE
LOW…/src/internals/utils/puppeteer-request-interception.ts204export async function removeInterceptRequestHandler(page: Page, handler: InterceptHandler): Promise<void> {CODE
LOW…/src/internals/utils/puppeteer-request-interception.ts235async function disableRequestInterception(page: Page): Promise<void> {CODE
LOW…-crawler/src/internals/enqueue-links/click-elements.ts214export async function enqueueLinksByClickingElements(CODE
LOW…-crawler/src/internals/enqueue-links/click-elements.ts305export async function clickElementsAndInterceptNavigationRequests(CODE
LOW…-crawler/src/internals/enqueue-links/click-elements.ts339function createInterceptRequestHandler(page: Page, requests: Set<string>): (req: PuppeteerRequest) => Promise<void> {CODE
LOW…-crawler/src/internals/enqueue-links/click-elements.ts366function isTopFrameNavigationRequest(page: Page, req: PuppeteerRequest): boolean {CODE
LOW…-crawler/src/internals/enqueue-links/click-elements.ts373function createTargetCreatedHandler(page: Page, requests: Set<string>): (target: Target) => Promise<void> {CODE
LOW…-crawler/src/internals/enqueue-links/click-elements.ts404function createFrameNavigatedHandler(page: Page, requests: Set<string>): (frame: Frame) => void {CODE
LOW…-crawler/src/internals/enqueue-links/click-elements.ts500function updateElementCssToEnableMouseClick(el: Element, zIndex: number): void {CODE
LOW…-crawler/src/internals/enqueue-links/click-elements.ts574async function restoreHistoryNavigationAndSaveCapturedUrls(page: Page, requests: Set<string>): Promise<void> {CODE
LOW…t-crawler/src/internals/adaptive-playwright-crawler.ts1067export function createAdaptivePlaywrightRouter(routesOrSchemas?: any): any {CODE
LOW…playwright-crawler/src/internals/playwright-crawler.ts354export function handleCloudflareChallengeHook(options?: HandleCloudflareChallengeOptions): PlaywrightHook {CODE
9 more matches not shown…
Magic Placeholder Names3 hits · 18 pts
SeverityFileLineSnippetContext
HIGHwebsite/blog/2026/02-06/index.md41 apiKey: 'your-api-key', // Your OpenAI API key (or use OPENAI_API_KEY env var)CODE
HIGHpackages/stagehand-crawler/README.md19 apiKey: 'your-api-key', // LLM API key for LOCAL envCODE
HIGH…s/stagehand-crawler/src/internals/stagehand-crawler.ts67 * apiKey: 'your-api-key',COMMENT
Excessive Try-Catch Wrapping9 hits · 11 pts
SeverityFileLineSnippetContext
LOW…e/blog/2025/03-20-scrape-bluesky-using-python/index.md344 except Exception:CODE
LOW…e/blog/2025/03-20-scrape-bluesky-using-python/index.md582 except Exception as e:CODE
LOWwebsite/blog/2024/12-02-scrape-google-search/index.md243 except Exception as e:CODE
LOW…og/2024/12-13-scrape-google-maps-using-python/index.md304 except Exception as e:CODE
LOW…og/2024/12-13-scrape-google-maps-using-python/index.md356 except Exception as e:CODE
LOW…og/2024/12-13-scrape-google-maps-using-python/index.md402 except Exception as e:CODE
MEDIUM…og/2024/12-13-scrape-google-maps-using-python/index.md403 print(f"Error in scraping: {str(e)}")CODE
LOW…og/2024/12-13-scrape-google-maps-using-python/index.md428 except Exception as e:CODE
MEDIUM…og/2024/12-13-scrape-google-maps-using-python/index.md429 print(f"Error running scraper: {str(e)}")CODE
Fake / Example Data7 hits · 10 pts
SeverityFileLineSnippetContext
LOWtest/utils/open-graph-parser.test.ts28 <meta property="article:author" content="Jane Doe"/>CODE
LOWtest/utils/open-graph-parser.test.ts96 author: 'Jane Doe',CODE
LOW⚡test/shared/data/lipsum.txt1Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce aliquet, nibh sit amet volutpat rhoncus, nisl eros sagittCODE
LOW⚡test/shared/data/lipsum.txt1Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce aliquet, nibh sit amet volutpat rhoncus, nisl eros sagittCODE
LOW⚡test/shared/data/lipsum.txt7Cras sit amet sem sit amet mi pulvinar varius non sed dolor. Nulla eu libero ultricies, aliquam mi eget, elementum velitCODE
LOW⚡test/shared/data/lipsum.txt9Sed elit arcu, aliquam et tempor vel, ultrices sit amet turpis. Nullam et lorem magna. Nulla at risus nec dui aliquet orCODE
LOW⚡test/shared/data/lipsum.txt9Sed elit arcu, aliquam et tempor vel, ultrices sit amet turpis. Nullam et lorem magna. Nulla at risus nec dui aliquet orCODE
AI Response Leakage1 hit · 8 pts
SeverityFileLineSnippetContext
HIGHwebsite/blog/2025/09-15/index.md330 # In this example, "https://news.ycombinator.com/login" will be skippedCOMMENT
Over-Commented Block5 hits · 5 pts
SeverityFileLineSnippetContext
LOWpnpm-workspace.yaml21 "@puppeteer/browsers": "^3.0.4"COMMENT
LOWtest/core/request-list.test.ts701 [['x', [], []], 'Invalid input: expected object'],COMMENT
LOWtest/core/request-list.test.ts721 // }COMMENT
LOWtest/core/storages/key-value-store.test.ts401 const record = await store.getRecord('buf');COMMENT
LOWpackages/http-crawler/src/internals/http-crawler.ts361export class HttpCrawler<COMMENT
Self-Referential Comments1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMwebsite/src/pages/home_page_example.py11 # Define the default request handler, which will be called for every request.COMMENT
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWpackages/http-crawler/src/internals/file-download.ts58 * ## Example usageCOMMENT
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippetContext
LOW…/src/internals/utils/puppeteer-request-interception.ts67async function handleRequest(request: PuppeteerRequest, interceptRequestHandlers?: InterceptHandler[]): Promise<void> {CODE