AI Slop Code Risk Monitor

webstudio-is/webstudio

SlopCodeMonitor badge for webstudio-is/webstudio Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

Open source website builder and Webflow alternative. Webstudio is an advanced visual builder that connects to any headless CMS, supports all CSS properties, and can be hosted anywhere, including with us.

0.5 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for webstudio-is/webstudio, a TypeScript project with 9,134 GitHub stars. SynthScan examined 810,744 lines of code across 3295 source files, recording 173 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 0.5 (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.5
Adjusted Signal
0.5
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
9.1K
Stars
TypeScript
Language
810.7K
Lines of Code
3.3K
Files
173
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 0.4/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.3/100 · LOW

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

Agent Over-Engineering Ratio 1.5/100 · LOW

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

PR Review Velocity Impact 2.1/100 · LOW

Which changes need focused human review? 173 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 85LOW 88

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 173 distinct pattern matches across 11 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 Separators82 hits · 250 pts
SeverityFileLineSnippetContext
MEDIUMrelease.sh5# -----------------------------COMMENT
MEDIUM…evcontainer/library-scripts/docker-in-docker-debian.sh2#-------------------------------------------------------------------------------------------------------------COMMENT
MEDIUM…evcontainer/library-scripts/docker-in-docker-debian.sh5#-------------------------------------------------------------------------------------------------------------COMMENT
MEDIUM…evcontainer/library-scripts/docker-in-docker-debian.sh474#-------------------------------------------------------------------------------------------------------------COMMENT
MEDIUM…evcontainer/library-scripts/docker-in-docker-debian.sh477#-------------------------------------------------------------------------------------------------------------COMMENT
MEDIUMpackages/plans/src/dev-plan.server.test.ts13// ─── applyDevPlan ─────────────────────────────────────────────COMMENT
MEDIUMpackages/css-engine/src/color.ts11// ─── Color space registration ────────────────────────────────────────────────COMMENT
MEDIUMpackages/css-engine/src/color.ts40// ─── Shared utilities ────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/css-engine/src/color.ts76// ─── Color helpers ───────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/css-data/src/parse-css.test.ts2023// ─── Comprehensive var() substitution in shorthands ───────────────────────────COMMENT
MEDIUMpackages/css-data/src/parse-css.test.ts2509 // ── background ────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/css-data/src/parse-css.test.ts2555 // ── border ────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/css-data/src/parse-css.test.ts2599 // ── margin / padding ──────────────────────────────────────────────────────COMMENT
MEDIUMpackages/css-data/src/parse-css.test.ts2633 // ── transition ────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/css-data/src/parse-css.test.ts2660 // ── font ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/css-data/src/parse-css.test.ts2686 // ── flex ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/css-data/src/parse-css.test.ts2697 // ── gap ───────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/css-data/src/parse-css.test.ts2712 // ── multi-token cross-rule var ────────────────────────────────────────────COMMENT
MEDIUMpackages/css-data/src/parse-css.test.ts2778 // ── multiple rules: cssVars doesn't bleed between rules ───────────────────COMMENT
MEDIUMpackages/design-system/src/components/color-picker.tsx47// ─── Color utilities ─────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/design-system/src/components/color-picker.tsx105// ─── ColorThumb ──────────────────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/marketplace/db.server.test.ts26// ─── getItems ─────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/db/user.server.test.ts37// ─── getUserById ───────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/db/user.server.test.ts65// ─── createOrLoginWithDev ──────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/db/user.server.test.ts155// ─── createOrLoginWithOAuth ───────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/db/user.server.test.ts192// ─── updateUserProjectsTags ───────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/sync/command-queue.test.ts18 // ── dequeueAll ────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/sync/command-queue.test.ts42 // ── enqueue: setDetails ───────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/sync/command-queue.test.ts92 // ── enqueue: transactions merging ─────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/sync/command-queue.test.ts214 // ── Mixed command ordering ────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/polling-client.ts115 // ── Scheduling ─────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/polling-client.ts129 // ── Core fetch ─────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/polling-client.ts176 // ── Visibility ─────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/polling-client.ts186 // ── Public API ─────────────────────────────────────────────────COMMENT
MEDIUM⚡apps/builder/app/shared/polly/cross-tab-manager.ts27// ── Channel message types ────────────────────────────────────────COMMENT
MEDIUM⚡apps/builder/app/shared/polly/cross-tab-manager.ts36// ── Defaults ─────────────────────────────────────────────────────COMMENT
MEDIUM⚡apps/builder/app/shared/polly/cross-tab-manager.ts42// ── Options ──────────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.ts77// ── Factory ──────────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.ts91 // ── State ────────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.ts106 // ── Helpers ──────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.ts126 // ── Dispatch to local listeners ──────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.ts145 // ── Leader lifecycle ─────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.ts210 // ── Watchdog (follower) ──────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.ts230 // ── Channel message handler ──────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.ts298 // ── Election on startup ──────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.ts307 // ── Public API (same shape as PollingManager) ────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/polling-manager.ts78 // ── Subscription bookkeeping ───────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/polling-manager.ts95 // ── Dispatch ───────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/polling-manager.ts117 // ── Polling client lifecycle ───────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/polling-manager.ts145 // ── Public API ─────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/types.ts28// ── 1. Registry ──────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/types.ts42// ── 2. Derived helpers ───────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/types.ts69// ── 3. Wire types ────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.test.ts5// ── Mock BroadcastChannel ────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.test.ts70// ── Helpers ──────────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.test.ts92// ── Tests ────────────────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.test.ts107 // ── Leader election ────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.test.ts161 // ── Follower receives data ─────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.test.ts190 // ── Leader failover ────────────────────────────────────────────COMMENT
MEDIUMapps/builder/app/shared/polly/cross-tab-manager.test.ts279 // ── Topic sync ─────────────────────────────────────────────────COMMENT
22 more matches not shown…
Fake / Example Data46 hits · 52 pts
SeverityFileLineSnippetContext
LOWdocs/university/mcp.md1266 "name": "placeholder",CODE
LOWdocs/university/core-components/collection.md30 { title: "Lorem ipsum" },CODE
LOWpackages/project-build/src/mcp.test.ts10043 'email: Invalid email address (format:email). Example: "user@example.com".'CODE
LOWpackages/project-build/src/mcp.test.ts10050 example: "user@example.com",CODE
LOWpackages/project-build/src/mcp.ts2633 name: "placeholder",CODE
LOWpackages/project-build/src/runtime/errors.test.ts56 example: "user@example.com",CODE
LOWpackages/project-build/src/runtime/props.ts357 'Atomic batch of direct prop updates. Every item must be valid or the batch is rejected; split unrelated updates iCODE
LOWpackages/project-build/src/runtime/errors.ts210 email: "user@example.com",CODE
LOW⚡packages/project-build/src/runtime/props.test.ts317 name: "placeholder",CODE
LOW⚡packages/project-build/src/runtime/props.test.ts323 name: "placeholder",CODE
LOW⚡packages/project-build/src/runtime/props.test.ts329 name: "placeholder",CODE
LOWpackages/project-build/src/runtime/styles.test.ts1746 { instanceId: "box", styleSourceId: "placeholder", name: "Local Copy" },CODE
LOW…ject-build/src/runtime/webflow/instances-properties.ts286 addProp("placeholder", data.attr.placeholder);CODE
LOW…ject-build/src/runtime/webflow/instances-properties.ts299 addProp("placeholder", data.attr.placeholder);CODE
LOWpackages/protocol/src/schema.test.ts65 user: { email: "user@example.com", username: "Site Owner" },CODE
LOWpackages/protocol/src/schema.test.ts71 user: { email: "user@example.com", username: "Site Owner" },CODE
LOWpackages/protocol/src/builder-api/operation-docs.ts412 'Create or update direct element prop values; match value to type, for example textarea placeholder uses { "name":CODE
LOWpackages/cli/src/commands/man.test.ts304 name: "placeholder",CODE
LOWpackages/html-data/bin/possible-standard-names.ts122 placeholder: "placeholder",CODE
LOWpackages/sdk/src/email-resource.test.ts62 ["non-string", { address: "user@example.com" }],CODE
LOWpackages/sdk/src/email-resource.test.ts70 ["non-string", ["user@example.com"]],CODE
LOW⚡packages/sdk/src/schema/breakpoints.ts39 { id: "placeholder", label: "Base" },CODE
LOW⚡packages/sdk/src/schema/breakpoints.ts40 { id: "placeholder", label: "Tablet", maxWidth: 991 },CODE
LOW⚡packages/sdk/src/schema/breakpoints.ts41 { id: "placeholder", label: "Mobile landscape", maxWidth: 767 },CODE
LOW⚡packages/sdk/src/schema/breakpoints.ts42 { id: "placeholder", label: "Mobile portrait", maxWidth: 479 },CODE
LOWpackages/sdk-components-react-radix/src/select.ws.ts62 initialProps: ["placeholder"],CODE
LOWpackages/sdk-components-react-radix/src/select.tsx67 Omit<ComponentPropsWithoutRef<typeof Value>, "placeholder"> & {CODE
LOWpackages/design-system/src/components/input-field.tsx35export const inputFieldColors = ["placeholder", "set", "error"] as const;CODE
LOWpackages/design-system/src/components/combobox.tsx469 | "placeholder"CODE
LOWpackages/sdk-components-react/src/input.ws.ts24 "placeholder",CODE
LOWpackages/sdk-components-react/src/textarea.ws.ts29 "placeholder",CODE
LOW…ared/copy-paste/plugin-webflow/plugin-webflow.test.tsx1253 v: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolCODE
LOW…ared/copy-paste/plugin-webflow/plugin-webflow.test.tsx1253 v: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolCODE
LOW…ared/copy-paste/plugin-webflow/plugin-webflow.test.tsx1503 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmodCODE
LOW…ared/copy-paste/plugin-webflow/plugin-webflow.test.tsx1503 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmodCODE
LOW…er/app/dashboard/workspace/transfer-project-dialog.tsx276 placeholder="user@example.com"CODE
LOW…builder/features/settings-panel/resource-panel.test.ts1056 element.getAttribute("placeholder") === "New form submission"CODE
LOW…el/props-section/animation/animation-panel-content.tsx121 | "placeholder"CODE
LOW…el/props-section/animation/animation-panel-content.tsx131 placeholder?: React.ComponentProps<typeof CssValueInput>["placeholder"];CODE
LOW…/features/settings-panel/controls/controls.stories.tsx114 propName="placeholder"CODE
LOW…/app/builder/features/pages/social-preview.stories.tsx34 ogDescription="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut laboCODE
LOW…/app/builder/features/pages/social-preview.stories.tsx34 ogDescription="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut laboCODE
LOW⚡apps/builder/app/routes/_ui.error.tsx33 "Unknown error Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been theCODE
LOW⚡apps/builder/app/routes/_ui.error.tsx40 "Unknown error Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been theCODE
LOW⚡apps/builder/app/routes/_ui.error.tsx44 "Unknown error Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been theCODE
LOW⚡apps/builder/app/routes/_ui.error.tsx46 "Unknown error Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been theCODE
Structural Annotation Overuse18 hits · 32 pts
SeverityFileLineSnippetContext
LOWdocs/university/integrations/airtable-form-webhook.md27## Step 1: Configure your Webstudio FormCOMMENT
LOWdocs/university/integrations/airtable-form-webhook.md39## Step 2: Set up webhooks in Airtable and WebstudioCOMMENT
LOWdocs/university/integrations/airtable-form-webhook.md61## Step 3: Map data to the right fieldsCOMMENT
LOW⚡…ow-tos/using-filters-to-dynamically-display-content.md21## Step 1: Create the Search FormCOMMENT
LOW⚡…ow-tos/using-filters-to-dynamically-display-content.md27## Step 2: Create the Results CollectionCOMMENT
LOW⚡…ow-tos/using-filters-to-dynamically-display-content.md33## Step 3: Set Up the API ResourceCOMMENT
LOW⚡…ow-tos/using-filters-to-dynamically-display-content.md41## Step 4: Add Dynamic FilteringCOMMENT
LOW…ow-tos/using-filters-to-dynamically-display-content.md65## Step 5: Bind Collection DataCOMMENT
LOWdocs/university/core-components/content-block.md35### Step 1: Add Content BlockCOMMENT
LOWdocs/university/core-components/content-block.md41### Step 2: Add templatesCOMMENT
LOWdocs/university/core-components/content-block.md62### Step 3: Add an initial setup (optional)COMMENT
LOWdocs/university/core-components/content-block.md313### Step 1: Locate the region you want to changeCOMMENT
LOWdocs/university/core-components/content-block.md325### Step 2: Add template instancesCOMMENT
LOWdocs/university/core-components/content-block.md344### Step 3: Delete instancesCOMMENT
LOWapps/builder/app/shared/style-object-model.ts400 // Step 1: Compute parent's value without the pseudo-element stateCOMMENT
LOW⚡apps/builder/app/shared/style-object-model.ts412 // Step 2: Use parent's computed value as the inherited value for the pseudo-elementCOMMENT
LOW⚡apps/builder/app/shared/style-object-model.ts419 // Step 3: Get cascaded value for the pseudo-element itselfCOMMENT
LOWapps/builder/app/shared/style-object-model.ts433 // Step 4: Resolve specified value with inheritance from parentCOMMENT
Over-Commented Block13 hits · 13 pts
SeverityFileLineSnippetContext
LOWrelease.sh1#!/bin/bashCOMMENT
LOWrelease.sh21# USAGE:COMMENT
LOWpackages/project-build/src/runtime/html.ts961 continue;COMMENT
LOWpackages/cli/templates/cloudflare/wrangler.toml1#:schema node_modules/wrangler/config-schema.jsonCOMMENT
LOWpackages/cli/templates/cloudflare/wrangler.toml21# [[d1_databases]]COMMENT
LOWpackages/cli/templates/cloudflare/wrangler.toml41# Docs: https://developers.cloudflare.com/pages/functions/bindings/#queue-producersCOMMENT
LOW…ges/sdk-components-react-radix/src/select.template.tsx121 `}COMMENT
LOWapps/builder/app/shared/nano-states/canvas.ts101 rowCount: number;COMMENT
LOW…uilder/app/canvas/features/text-editor/text-editor.tsx241 return;COMMENT
LOWapps/builder/app/canvas/shared/styles.ts121 // 1. Some TextEditor elements might appear empty for a few cycles after creation. (depends on existance of initial chCOMMENT
LOWapps/builder/app/canvas/shared/styles.ts161 cursor: initial;COMMENT
LOW…builder/features/style-panel/shared/filter-content.tsx21 CssValueInputContainer,COMMENT
LOW…s/builder/app/builder/shared/calc-canvas-width.test.ts501// and cleanup logic). It's primarily tested through integration tests and component tests ratherCOMMENT
Verbosity Indicators4 hits · 8 pts
SeverityFileLineSnippetContext
LOWapps/builder/app/shared/style-object-model.ts400 // Step 1: Compute parent's value without the pseudo-element stateCOMMENT
LOW⚡apps/builder/app/shared/style-object-model.ts412 // Step 2: Use parent's computed value as the inherited value for the pseudo-elementCOMMENT
LOW⚡apps/builder/app/shared/style-object-model.ts419 // Step 3: Get cascaded value for the pseudo-element itselfCOMMENT
LOWapps/builder/app/shared/style-object-model.ts433 // Step 4: Resolve specified value with inheritance from parentCOMMENT
Self-Referential Comments2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMrelease.sh101# Create the branch in main repoCOMMENT
MEDIUMrelease.sh105# Create an empty commit with release messageCOMMENT
Redundant / Tautological Comments3 hits · 4 pts
SeverityFileLineSnippetContext
LOWrelease.sh82 # Check if submodule is on main or master branchCOMMENT
LOWsubmodules.sh18 # Check if the branch exists in the remoteCOMMENT
LOW…evcontainer/library-scripts/docker-in-docker-debian.sh194# Check if distro is supportedCOMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMpackages/project-build/src/runtime/redirect-parsers.ts363 // Use papaparse for robust CSV parsingCOMMENT
Slop Phrases2 hits · 2 pts
SeverityFileLineSnippetContext
LOW…er/app/shared/project-settings/section-marketplace.tsx322 {`Don't forget to publish your project after every change to make yourCODE
LOWapps/builder/app/builder/features/publish/publish.tsx1696 <Text variant="regularBold">Don't forget to publish</Text>CODE
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOW.github/workflows/migrate.yaml24 # Example usage:COMMENT
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippetContext
LOW…templates/react-router-cloudflare/app/entry.server.tsx6export default async function handleRequest(CODE