Repository Analysis

penpot/penpot

Penpot: The open-source design tool for design and code collaboration

1.1 Likely human-written View on GitHub
1.1
Adjusted Score
1.1
Raw Score
100%
Time Factor
2026-05-29
Last Push
48,620
Stars
Clojure
Language
353,490
Lines of Code
1490
Files
278
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 0HIGH 0MEDIUM 36LOW 242

Pattern Findings

278 matches across 10 categories. Click a row to expand file-level details.

Fake / Example Data152 hits · 182 pts
SeverityFileLineSnippet
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js75 // "Lorem ipsum" as a paragraph with a text span.
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js77 const paragraph = createParagraphWith("Lorem ipsum");
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js83 expect(paragraph.firstChild.firstChild.textContent).toBe("Lorem ipsum");
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js85 // ["Lorem ipsum"] as a paragraph with a text span.
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js87 const paragraph = createParagraphWith(["Lorem ipsum"]);
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js93 expect(paragraph.firstChild.firstChild.textContent).toBe("Lorem ipsum");
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js95 // ["Lorem ipsum","\n","dolor sit amet"] as a paragraph with multiple text spans.
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js95 // ["Lorem ipsum","\n","dolor sit amet"] as a paragraph with multiple text spans.
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js97 const paragraph = createParagraphWith(["Lorem ipsum", "\n", "dolor sit amet"]);
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js97 const paragraph = createParagraphWith(["Lorem ipsum", "\n", "dolor sit amet"]);
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js103 expect(paragraph.children.item(0).firstChild.textContent).toBe("Lorem ipsum");
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js108 expect(paragraph.children.item(2).firstChild.textContent).toBe("dolor sit amet");
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js186 createTextSpan(new Text("Lorem ipsum sit")),
LOW…end/text-editor/src/editor/content/dom/Content.test.js49 "Lorem ipsum",
LOW…end/text-editor/src/editor/content/dom/Content.test.js50 "Dolor sit amet",
LOW…end/text-editor/src/editor/content/dom/Content.test.js55 "<div>Lorem ipsum</div><div>Dolor sit amet</div><div>Sed iaculis blandit odio ornare sagittis.</div>",
LOW…end/text-editor/src/editor/content/dom/Content.test.js55 "<div>Lorem ipsum</div><div>Dolor sit amet</div><div>Sed iaculis blandit odio ornare sagittis.</div>",
LOW…end/text-editor/src/editor/content/dom/Content.test.js75 "Lorem ipsumDolor sit ametSed iaculis blandit odio ornare sagittis.",
LOW…end/text-editor/src/editor/content/dom/Content.test.js75 "Lorem ipsumDolor sit ametSed iaculis blandit odio ornare sagittis.",
LOW…tor/src/editor/controllers/SelectionController.test.js339 expect(textEditorMock.root.textContent).toBe("Lorem ipsum dolor");
LOW…tor/src/editor/controllers/SelectionController.test.js464 expect(textEditorMock.root.textContent).toBe("Lorem ipsum dolor");
LOW…tor/src/editor/controllers/SelectionController.test.js1251 ["Lorem ipsum"],
LOW…tor/src/editor/controllers/SelectionController.test.js1252 ["dolor sit amet"],
LOW…ontend/playwright/ui/specs/dashboard-libraries.spec.js22 const libraryItem = page.getByTitle(/Lorem Ipsum/);
LOWfrontend/playwright/ui/specs/workspace.spec.js409 await page.evaluate(() => navigator.clipboard.writeText("Lorem ipsum dolor"));
LOWfrontend/playwright/ui/specs/workspace.spec.js414 .getByText("Lorem ipsum dolor");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js79 await workspace.clickLeafLayer("Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js82 await page.keyboard.type(" dolor sit amet");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js84 await workspace.waitForSelectedShapeName("Lorem ipsum dolor sit amet");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js84 await workspace.waitForSelectedShapeName("Lorem ipsum dolor sit amet");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js96 await workspace.clickLeafLayer("Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js99 await page.keyboard.type("Dolor sit amet ");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js101 await workspace.waitForSelectedShapeName("Dolor sit amet Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js101 await workspace.waitForSelectedShapeName("Dolor sit amet Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js113 await workspace.clickLeafLayer("Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js116 await page.keyboard.type(" dolor sit amet");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js118 await workspace.waitForSelectedShapeName("Lorem dolor sit amet ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js124 const textToPaste = " dolor sit amet";
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js134 await workspace.clickLeafLayer("Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js139 await workspace.waitForSelectedShapeName("Lorem ipsum dolor sit amet");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js139 await workspace.waitForSelectedShapeName("Lorem ipsum dolor sit amet");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js145 const textToPaste = "Dolor sit amet ";
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js155 await workspace.clickLeafLayer("Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js168 const textToPaste = "Dolor sit amet";
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js175 await workspace.clickLeafLayer("Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js184 await workspace.waitForSelectedShapeName("Dolor sit amet ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js190 const textToPaste = "dolor sit amet";
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js197 await workspace.clickLeafLayer("Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js206 await workspace.waitForSelectedShapeName("Lorem dolor sit amet");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js212 const textToPaste = "dolor sit amet";
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js219 await workspace.clickLeafLayer("Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js228 await workspace.waitForSelectedShapeName("Lordolor sit ametsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js17 const initialText = "Lorem ipsum";
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js31 const textToPaste = "Lorem ipsum";
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js53 const textToPaste = "Lorem ipsum";
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js241 await workspace.clickLeafLayer("Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js261 await workspace.clickLeafLayer("Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js281 await workspace.clickLeafLayer("Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js300 await workspace.doubleClickLeafLayer("Lorem ipsum");
LOWfrontend/playwright/ui/specs/text-editor-v2.spec.js312 await workspace.clickLeafLayer("Lorem ipsum");
92 more matches not shown…
Decorative Section Separators28 hits · 88 pts
SeverityFileLineSnippet
MEDIUMtools/gh.py40# ─────────────────────────────────────────────
MEDIUMtools/gh.py42# ─────────────────────────────────────────────
MEDIUMtools/gh.py74# ─────────────────────────────────────────────
MEDIUMtools/gh.py76# ─────────────────────────────────────────────
MEDIUMtools/gh.py177# ─────────────────────────────────────────────
MEDIUMtools/gh.py179# ─────────────────────────────────────────────
MEDIUMtools/gh.py317# ─────────────────────────────────────────────
MEDIUMtools/gh.py319# ─────────────────────────────────────────────
MEDIUMtools/gh.py400# ─────────────────────────────────────────────
MEDIUMtools/gh.py402# ─────────────────────────────────────────────
MEDIUMtools/gh.py533# ─────────────────────────────────────────────
MEDIUMtools/gh.py535# ─────────────────────────────────────────────
MEDIUMtools/taiga.py41# ── URL Parsing ──────────────────────────────────────────────────────────────
MEDIUMtools/taiga.py57# ── API call ─────────────────────────────────────────────────────────────────
MEDIUMtools/taiga.py81# ── Output formatting ────────────────────────────────────────────────────────
MEDIUMtools/taiga.py184# ── CLI ───────────────────────────────────────────────────────────────────────
MEDIUMfrontend/packages/tokenscript/schemas.js580 "script": "// OKHSL to OKLab Conversion\n// Reference: Björn Ottosson - \"A perceptual color picker: OKHSL a
MEDIUMfrontend/packages/tokenscript/schemas.js590 "script": "// OKHSV to OKLab Conversion\n// Reference: Björn Ottosson - \"A perceptual color picker: OKHSL a
MEDIUMfrontend/packages/tokenscript/schemas.js708 "script": "// OKLab to OKHSL Conversion\n// Reference: Björn Ottosson - \"A perceptual color picker: OKHSL a
MEDIUMfrontend/packages/tokenscript/schemas.js767 "script": "// OKLab to OKHSV Conversion\n// Reference: Björn Ottosson - \"A perceptual color picker: OKHSL a
MEDIUMmcp/packages/server/src/tools/CljCheckParentheses.ts150 // ── Newline ──────────────────────────────────────────────────────
MEDIUMmcp/packages/server/src/tools/CljCheckParentheses.ts158 // ── Escape: skip next character ──────────────────────────────────
MEDIUMmcp/packages/server/src/tools/CljCheckParentheses.ts164 // ── Inside comment: skip until newline ───────────────────────────
MEDIUMmcp/packages/server/src/tools/CljCheckParentheses.ts167 // ── Inside string literal ────────────────────────────────────────
MEDIUMmcp/packages/server/src/tools/CljCheckParentheses.ts174 // ── Outside string / comment ─────────────────────────────────────
MEDIUMmcp/packages/server/src/tools/CljCheckParentheses.ts188 // ── Opening delimiter ────────────────────────────────────────────
MEDIUMmcp/packages/server/src/tools/CljCheckParentheses.ts222 // ── Closing delimiter ────────────────────────────────────────────
MEDIUMmcp/packages/server/src/tools/CljCheckParentheses.ts234 // ── EOF: no mismatch was found, but the stack is not empty ──────────
Over-Commented Block58 hits · 58 pts
SeverityFileLineSnippet
LOWdocker/devenv/files/serena_config.yml1language_backend: LSP
LOWdocker/devenv/files/serena_config.yml21# window being updated. Since we can't control how agno or Claude Desktop start Serena,
LOWdocker/devenv/files/serena_config.yml41
LOWdocker/devenv/files/serena_config.yml81# list of regex patterns which, when matched, mark a memory entry as read‑only.
LOWdocker/devenv/files/serena_config.yml121
LOWdocker/images/docker-compose.yaml1## Common flags:
LOWdocker/images/docker-compose.yaml61 # image: traefik:v3.3
LOWdocker/images/docker-compose.yaml141 ## unless the valkey container has different parameters or different name.
LOWdocker/images/files/config.js1// Frontend configuration
LOWfrontend/vitest.shims.d.ts1/// <reference types="@vitest/browser/providers/playwright" />
LOWfrontend/resources/styles/main-default.scss21// Layouts
LOWfrontend/resources/styles/common/refactor/themes.scss1// This Source Code Form is subject to the terms of the Mozilla Public
LOWfrontend/playwright/scripts/MockWebSocket.js21 }
LOWfrontend/packages/mousetrap/index.js561 // if a sequence name is not specified, but this is a sequence at
LOWfrontend/packages/mousetrap/index.js641 maxLevel = Math.max(maxLevel, callbacks[i].level);
LOWfrontend/packages/mousetrap/index.js681
LOWfrontend/packages/mousetrap/index.js801 // weird race condition if a sequence ends with the key
LOWfrontend/src/app/util/path/arc_to_curve.js41
LOWfrontend/src/app/main/ui/auth/login.scss1// This Source Code Form is subject to the terms of the Mozilla Public
LOW…nd/src/app/main/ui/workspace/sidebar/options/page.scss1// This Source Code Form is subject to the terms of the Mozilla Public
LOW…/src/app/main/ui/workspace/sidebar/common/sidebar.scss1// This Source Code Form is subject to the terms of the Mozilla Public
LOW…/src/app/main/ui/workspace/sidebar/common/sidebar.scss61 grid-template-columns: repeat(#{$column-number}, #{$column-width});
LOW…/src/app/main/ui/workspace/sidebar/common/sidebar.scss81// But two blocks don’t fit perfectly:
LOWplugins/apps/poc-tokens-plugin/src/plugin.ts261 // if (token && selection) {
LOW.serena/project.yml1# the name by which the project can be referenced within Serena
LOW.serena/project.yml21# Note:
LOW.serena/project.yml41# Possible values: unset (use global setting), "lf", "crlf", or "native" (platform default)
LOW.serena/project.yml61# list of additional paths to ignore in this project.
LOW.serena/project.yml81# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools.
LOW.serena/project.yml121# Matching memories will not appear in list_memories or activate_project output
LOWmcp/.serena/project.yml1
LOWmcp/.serena/project.yml21# (contrary to the memories, which are loaded on demand).
LOWmcp/.serena/project.yml41# This setting can, in turn, be overridden by CLI parameters (--mode).
LOWmcp/.serena/project.yml61# al angular ansible bash clojure
LOWmcp/.serena/project.yml81# - For SCSS / Sass / plain CSS, use scss (some-sass-language-server handles all three)
LOWmcp/.serena/project.yml101# Note: the backend is fixed at startup. If a project with a different backend
LOWmcp/.serena/project.yml121
LOWcommon/src/app/common/svg/path/arc_to_bezier.js41 dot = -1.0;
LOW.github/workflows/commit-checker.yml41 # pattern: '^[^#].{74}'
LOW.github/workflows/plugins-deploy-packages.yml141 # with:
LOWrender-wasm/src/shapes.rs201 deleted: bool,
LOWrender-wasm/src/shapes.rs821 /// - The base bounds (selection rectangle)
LOWrender-wasm/src/render.rs81 ///
LOWrender-wasm/src/render.rs141 /// Calculates the clip bounds for shadow rendering of a given shape.
LOWrender-wasm/src/render.rs201/// Focus mode allows selectively highlighting or isolating specific shapes (UUIDs)
LOWrender-wasm/src/render.rs361 pub focus_mode: FocusMode,
LOWrender-wasm/src/render.rs3641 .map_or(Vec::new(), |t| t.iter().copied().collect());
LOWrender-wasm/src/render.rs3881 Ok(())
LOWrender-wasm/src/main.rs321 } else {
LOWrender-wasm/src/mem.rs1use crate::{error::Result, performance};
LOWrender-wasm/src/wasm/mem.rs1use std::alloc::{alloc, Layout};
LOWrender-wasm/src/render/surfaces.rs401
LOWrender-wasm/src/render/surfaces.rs1081 /// `scratch`, then returns the sub-region `[0, out_w) × [0, out_h)` as an image.
LOWrender-wasm/src/render/filters.rs61 }
LOWrender-wasm/src/render/text.rs321 let layer_rec = SaveLayerRec::default().paint(&opacity_paint);
LOWrender-wasm/src/render/text.rs621 .surfaces
LOWrender-wasm/src/render/text.rs641// shadows::render_text_path_stroke_shadows(
LOWrender-wasm/src/state/shapes_pool.rs21/// A pool allocator for `Shape` objects that attempts to minimize memory reallocations.
Hyper-Verbose Identifiers15 hits · 15 pts
SeverityFileLineSnippet
LOWtools/gh.py166def load_existing_issue_numbers(filepath: str) -> set[int]:
LOWfrontend/text-editor/src/editor/content/dom/Style.js120function getStyleDefaultsDeclaration() {
LOWfrontend/text-editor/src/editor/content/dom/Content.js29function isContentFragmentFromDocumentTextSpan(document) {
LOWfrontend/text-editor/src/editor/content/dom/Content.js56export function mapContentFragmentFromDocument(document, root, styleDefaults) {
LOWfrontend/text-editor/src/editor/content/dom/Content.js201export function mapContentFragmentFromHTML(
LOWfrontend/text-editor/src/editor/content/dom/Content.js228export function mapContentFragmentFromString(string, styleDefaults) {
LOWfrontend/text-editor/src/editor/clipboard/paste.js21function getFormattedFragmentFromClipboardData(
LOWfrontend/text-editor/src/editor/clipboard/paste.js37function getPlainFragmentFromClipboardData(selectionController, clipboardData) {
LOWfrontend/text-editor/src/editor/clipboard/paste.js50function getFormattedOrPlainFragmentFromClipboardData(
LOWfrontend/scripts/find-unused-translations.js51async function findExecutionTimeTranslations() {
LOWfrontend/scripts/_worker.js42function configureModulesProcessor(options) {
LOWfrontend/packages/draft-js/index.js201export function removeBlurSelectionEntity(state) {
LOW…ns/libs/plugins-runtime/src/lib/api/plugin-api.spec.ts8 function generateMockPluginManager() {
LOWplugins/apps/poc-state-plugin/src/plugin.ts579function combineSelectedAsVariants() {
LOWmcp/types-generator/prepare_api_docs.py134 def _convert_strings_to_block(self, obj):
Excessive Try-Catch Wrapping6 hits · 14 pts
SeverityFileLineSnippet
MEDIUMtools/taiga.py66 print(f"Error: HTTP {e.code} — {e.reason}", file=sys.stderr)
MEDIUMtools/taiga.py74 print(f"Error: {e.reason}", file=sys.stderr)
MEDIUMtools/taiga.py77 print(f"Error: invalid JSON response — {e}", file=sys.stderr)
MEDIUMtools/taiga.py242 print(f"Error: ref must be a number, got '{ref_str}'", file=sys.stderr)
LOWbackend/scripts/manage.py70 except Exception as cause:
MEDIUMbackend/scripts/manage.py62def run_cmd(params):
Slop Phrases4 hits · 10 pts
SeverityFileLineSnippet
MEDIUMdocker/devenv/files/serena_config.yml77# Same syntax as gitignore, so you can use * and **.
LOWplugins/libs/plugins-runtime/vite.config.ts49 // Don't forget to update your package.json as well.
MEDIUM.serena/project.yml62# Same syntax as gitignore, so you can use * and **.
MEDIUMmcp/.serena/project.yml6# Same syntax as gitignore, so you can use * and **.
Verbosity Indicators5 hits · 6 pts
SeverityFileLineSnippet
LOWfrontend/packages/tokenscript/schemas.js560 "script": "// XYZ-D65 to OKLab Conversion\n// Uses ColorJS-compatible matrices (recalculated for consistent
LOWfrontend/packages/tokenscript/schemas.js580 "script": "// OKHSL to OKLab Conversion\n// Reference: Björn Ottosson - \"A perceptual color picker: OKHSL a
LOWfrontend/packages/tokenscript/schemas.js590 "script": "// OKHSV to OKLab Conversion\n// Reference: Björn Ottosson - \"A perceptual color picker: OKHSL a
LOWfrontend/packages/tokenscript/schemas.js708 "script": "// OKLab to OKHSL Conversion\n// Reference: Björn Ottosson - \"A perceptual color picker: OKHSL a
LOWfrontend/packages/tokenscript/schemas.js767 "script": "// OKLab to OKHSV Conversion\n// Reference: Björn Ottosson - \"A perceptual color picker: OKHSL a
Redundant / Tautological Comments4 hits · 6 pts
SeverityFileLineSnippet
LOW.serena/project.yml90# Set this to [] to disable base modes for this project.
LOW.serena/project.yml91# Set this to a list of mode names to always include the respective modes for this project.
LOWmcp/.serena/project.yml31# Set this to [] to disable base modes for this project.
LOWmcp/.serena/project.yml32# Set this to a list of mode names to always include the respective modes for this project.
Deep Nesting5 hits · 5 pts
SeverityFileLineSnippet
LOWtools/gh.py240
LOWtools/gh.py472
LOWbackend/scripts/manage.py38
LOWmcp/types-generator/prepare_api_docs.py23
LOWmcp/types-generator/prepare_api_docs.py205
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippet
LOWmcp/types-generator/prepare_api_docs.py50 # for links, just return the text