Repository Analysis

ether/etherpad

Etherpad: A modern really-real-time collaborative document editor.

1.1 Likely human-written View on GitHub
1.1
Adjusted Score
1.1
Raw Score
100%
Time Factor
2026-05-29
Last Push
18,386
Stars
TypeScript
Language
183,754
Lines of Code
945
Files
142
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 2HIGH 0MEDIUM 12LOW 128

Pattern Findings

142 matches across 11 categories. Click a row to expand file-level details.

Over-Commented Block105 hits · 105 pts
SeverityFileLineSnippet
LOWpackaging/nfpm.yaml121# adduser is needed by preinst (which creates the etherpad user before
LOWpackaging/apt/generate-signing-key.sh1#!/usr/bin/env bash
LOWbin/installer.sh1#!/bin/sh
LOWbin/safeRun.sh1#!/bin/sh
LOWbin/createRelease.sh1#!/bin/bash
LOWbin/run-frontend-tests-with-disables.sh1#!/usr/bin/env bash
LOWbin/run-frontend-tests-with-disables.sh21# right to skip.
LOWbin/tsconfig.json1{
LOWbin/tsconfig.json21 // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory func
LOWbin/tsconfig.json41 // "customConditions": [], /* Conditions to set in addition to the resolver-specific defau
LOWbin/tsconfig.json61 // "importHelpers": true, /* Allow importing helper functions from tslib once per project
LOWbin/tsconfig.json81 // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlate
LOWbin/setup-trusted-publishers.sh1#!/bin/sh
LOWbin/setup-trusted-publishers.sh21# package call inside the same minute. The TOTP code typically expires
LOWbin/plugins/lib/npmpublish.yml61 git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
LOWbin/plugins/lib/npmpublish.yml81 -
LOWadmin/src/vite-env.d.ts1/// <reference types="vite/client" />
LOWadmin/src/components/settings/comments.ts1// admin/src/components/settings/comments.ts
LOWadmin/src/api/client.ts1// admin/src/api/client.ts
LOW.github/workflows/load-test.yml101 # Etherpad core dependencies must be installed after installing the
LOW.github/workflows/snap-build.yml1# Snap build verification — runs on every PR (and on develop) that
LOW.github/workflows/deb-package.yml301 done
LOW.github/workflows/deb-package.yml401 # Layout: apt/dists/<suite>/main/binary-{amd64,arm64}/
LOW.github/workflows/frontend-tests.yml201 # ep_cursortrace's `aceEditEvent` hook fires on every keyboard
LOW.github/workflows/releaseEtherpad.yml41 # Use `npm publish` directly (not the `pnpm` wrapper) because OIDC
LOW.github/workflows/snap-publish.yml1# Builds and publishes the Etherpad snap on tagged releases.
LOWsnap/snapcraft.yaml1# snap/snapcraft.yaml — Snap recipe for Etherpad
LOWsnap/tests/test-service-bootstrap.sh1#!/bin/bash
LOWsrc/playwright.config.ts81
LOWsrc/tests/frontend/specs/responsiveness.js1'use strict';
LOWsrc/tests/backend/specs/messages.ts241 it('changeset that would strand the trailing \\n is rejected', async function () {
LOWsrc/tests/backend/specs/clientvar_rev_consistency.ts81 // Reproduces the original "mismatched apply" race condition:
LOWsrc/tests/backend/specs/setup-trusted-publishers.ts1'use strict';
LOWsrc/tests/backend/specs/npmpublish-workflow.ts1'use strict';
LOWsrc/tests/backend/specs/hooks.ts661 }
LOWsrc/tests/backend/specs/compactPad.ts161
LOWsrc/tests/backend/specs/admin/anonymizeAuthorSocket.ts61 socket.emit(evt, payload);
LOWsrc/tests/backend/specs/api/pad.ts661 // 3. Add some bold text (but no italic text!) to the source pad. This should add a bold
LOWsrc/tests/container/specs/api/adminSettings_7819.ts101 after(function () {
LOWsrc/tests/frontend-new/admin-spec/admini18n.spec.ts1import {expect, test, Page} from "@playwright/test";
LOW…/frontend-new/specs/html10n_form_controls_aria.spec.ts61
LOWsrc/tests/frontend-new/specs/collab_client.spec.ts41 // insertText (single input event) instead of per-key keyboard.type
LOWsrc/tests/frontend-new/specs/enter.spec.ts61
LOWsrc/tests/frontend-new/specs/undo_redo_scroll.spec.ts1import {expect, test} from "@playwright/test";
LOWsrc/tests/frontend-new/specs/undo_redo_scroll.spec.ts21 // WITH_PLUGINS load — even with the per-Enter value-wait that
LOW…ckend-new/specs/backend-tests-flake-mitigation.test.ts1'use strict';
LOWsrc/static/js/pad_mode.ts1// Copyright 2026 Etherpad contributors
LOWsrc/static/js/contentcollector.ts81 .replace(/[\n\r ]/g, ' ')
LOWsrc/static/js/contentcollector.ts261 // The following splitting of the attribute name is a workaround
LOWsrc/static/js/pad.ts801
LOWsrc/static/js/ace2_inner.ts3121 selectionInfo.selFocusAtStart);
LOWsrc/static/js/ace2_inner.ts3401 $(targetBody).on('auxclick', (e) => {
LOWsrc/static/js/Changeset.ts481 // mutate a set of attributes, and this affects whether an empty value
LOWsrc/static/js/pad_editbar.ts301 openedModule = module;
LOWsrc/static/js/pad_editbar.ts381 $('body').addClass('mobile-layout');
LOWsrc/static/js/ace.ts341 // aria-describedby. Three things matter for AT to actually announce it:
LOWsrc/static/js/vendors/jquery.ts881 newContext = context;
LOWsrc/static/js/vendors/jquery.ts1021 * @param {Boolean} disabled true for :disabled; false for :enabled
LOWsrc/static/js/vendors/jquery.ts1161
LOWsrc/static/js/vendors/jquery.ts1301
45 more matches not shown…
Decorative Section Separators7 hits · 21 pts
SeverityFileLineSnippet
MEDIUMpackaging/nfpm.yaml47# ---------------------------------------------------------------------------
MEDIUMpackaging/nfpm.yaml50# ---------------------------------------------------------------------------
MEDIUMsrc/node/hooks/express/adminsettings.ts152 // ── 1. Pattern filter (cheap, by name only) ─────────────────────
MEDIUMsrc/node/hooks/express/adminsettings.ts159 // ── 2. Resolve filter chip ──────────────────────────────────────
MEDIUMsrc/node/hooks/express/adminsettings.ts194 // ── 4. Filter chip — applied to hydrated metadata ────────────────
MEDIUMsrc/node/hooks/express/adminsettings.ts222 // ── 6. Clamp offset/limit ──────────────────────────────────────
MEDIUMsrc/node/hooks/express/adminsettings.ts235 // ── 7. Sort + slice ────────────────────────────────────────────
Hallucination Indicators2 hits · 20 pts
SeverityFileLineSnippet
CRITICALsrc/static/js/ace2_inner.ts3638 return Number(editorInfo.frame.parentNode.style.height.replace(/[^0-9]/g, '') || 0);
CRITICALsrc/static/js/vendors/jquery.ts7976 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
Verbosity Indicators11 hits · 20 pts
SeverityFileLineSnippet
LOWsrc/tests/backend/specs/undo_clear_authorship.ts132 // Step 1: Connect User A
LOWsrc/tests/backend/specs/undo_clear_authorship.ts137 // Step 2: User A types "hello" with their author attribute
LOWsrc/tests/backend/specs/undo_clear_authorship.ts146 // Step 3: Connect User B (after User A's text is committed)
LOWsrc/tests/backend/specs/undo_clear_authorship.ts151 // Step 4: User B types " world" with their author attribute
LOWsrc/tests/backend/specs/undo_clear_authorship.ts168 // Step 5: User B clears authorship colors (sets author to '' on all text)
LOWsrc/tests/backend/specs/undo_clear_authorship.ts177 // Step 6: User B undoes the clear authorship
LOWsrc/static/js/MergingOpAssembler.ts15 // This variable stores the length of yyy and any other newline-less
LOWsrc/node/hooks/express/webaccess.ts70 // Step 1: Check the preAuthorize hook for early permit/deny (permit is only allowed for non-admin
LOWsrc/node/hooks/express/webaccess.ts139 // Step 2: Try to just access the thing. If access fails (perhaps authentication has not yet
LOWsrc/node/hooks/express/webaccess.ts152 // Step 3: Authenticate the user. (Or, if already logged in, reauthenticate with different
LOWsrc/node/hooks/express/webaccess.ts215 // Step 4: Try to access the thing again. If this fails, give the user a 403 error. Plugins can
AI Slop Vocabulary4 hits · 12 pts
SeverityFileLineSnippet
MEDIUM.github/workflows/frontend-tests.yml204 # harness's `writeToPad` bursts (insertText + Enter loops) that
MEDIUMsrc/tests/frontend-new/specs/language.spec.ts13// .nice-select` is robust to plugins (ep_headings2, ep_font_size, etc.)
MEDIUMsrc/static/js/vendors/jquery.ts10666// understands anonymous AMD modules. A named AMD is safest and most robust
MEDIUMsrc/node/prometheus.ts26// Added for the #7756 scaling dive: lets the load-test harness attribute
Example Usage Blocks3 hits · 4 pts
SeverityFileLineSnippet
LOWbin/installer.sh5# Usage:
LOWbin/run-frontend-tests-with-disables.sh28# Usage:
LOWbin/setup-trusted-publishers.sh12# Usage:
Redundant / Tautological Comments3 hits · 4 pts
SeverityFileLineSnippet
LOWbin/safeRun.sh30# Check if a logfile parameter is set
LOWbin/safeRun.sh39 # Check if the file is writeable
LOWbin/push-after-release.sh6# Check if the file exists
Self-Referential Comments1 hit · 3 pts
SeverityFileLineSnippet
MEDIUMbin/run.sh33## Create the admin ui
Hyper-Verbose Identifiers3 hits · 3 pts
SeverityFileLineSnippet
LOWsrc/static/js/vendors/jquery.ts8879 function addToPrefiltersOrTransports( structure ) {
LOWsrc/static/js/vendors/jquery.ts8913 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
LOWsrc/node/handler/PadMessageHandler.ts111function getActivePadCountFromSessionInfos() {
Fake / Example Data2 hits · 2 pts
SeverityFileLineSnippet
LOW…superpowers/plans/2026-04-25-auto-update-pr1-notify.md995 adminEmail: 'admin@example.com',
LOWsrc/tests/backend-new/specs/updater/Notifier.test.ts6 adminEmail: 'admin@example.com',
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippet
LOWsrc/static/js/vendors/jquery.ts4140 function getData( data ) {