AI Slop Code Risk Monitor

streetwriters/notesnook

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

A fully open source & end-to-end encrypted note taking alternative to Evernote.

0.5 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for streetwriters/notesnook, a TypeScript project with 14,864 GitHub stars. SynthScan examined 455,548 lines of code across 2022 source files, recording 200 pattern matches distributed across 9 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
14.9K
Stars
TypeScript
Language
455.5K
Lines of Code
2.0K
Files
200
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.8/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.6/100 · LOW

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

Agent Over-Engineering Ratio 1.2/100 · LOW

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

PR Review Velocity Impact 2.7/100 · LOW

Which changes need focused human review? 200 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 2HIGH 0MEDIUM 16LOW 182

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

Over-Commented Block77 hits · 77 pts
SeverityFileLineSnippetContext
LOWextensions/web-clipper/webpack.config.js161 force: trueCOMMENT
LOWextensions/web-clipper/webpack.config.js181 cache: falseCOMMENT
LOWpackages/core/__e2e__/user-manager.test.js121// const usermanager = new UserManager(db);COMMENT
LOWpackages/core/__e2e__/sync.test.js321);COMMENT
LOWpackages/core/__e2e__/sync.test.js341// if (type === "upload" && current === half) {COMMENT
LOWpackages/core/__e2e__/sync.test.js361// });COMMENT
LOWpackages/core/__e2e__/sync.test.js381// async () => {COMMENT
LOWpackages/core/__e2e__/sync.test.js401// const noteId = await deviceA.notes.add({COMMENT
LOWpackages/core/__e2e__/sync.test.js421// await expect(deviceA.sync(true)).rejects.toThrow();COMMENT
LOWpackages/core/__e2e__/sync.test.js721// initializeDevice("deviceA"),COMMENT
LOWpackages/core/__e2e__/sync.test.js741// await deviceB.sync({ type: "full" });COMMENT
LOWpackages/core/__e2e__/sync.test.js761// console.timeEnd("adding devices");COMMENT
LOWpackages/core/__e2e__/sync.test.js781// await Promise.all(COMMENT
LOWpackages/core/__tests__/vault.test.js321// const vault = await db.vaults.default();COMMENT
LOWpackages/core/__benches__/relations.bench.ts21import { databaseTest } from "../__tests__/utils/index.js";COMMENT
LOWpackages/core/__benches__/relations.bench.ts41 // }COMMENT
LOWpackages/core/src/database/sql-cached-collection.ts181COMMENT
LOWpackages/core/src/database/sql-cached-collection.ts201 // items(map?: (item: T) => T | undefined) {COMMENT
LOWpackages/core/src/database/sql-cached-collection.ts221 // }COMMENT
LOWpackages/core/src/database/migrations.ts361 }COMMENT
LOWpackages/core/src/api/index.ts181 // return;COMMENT
LOWpackages/core/src/collections/note-history.ts41 }COMMENT
LOWpackages/core/src/collections/note-history.ts241 // const items = await this.collection.getItems(sessionIds);COMMENT
LOWpackages/core/src/collections/shortcuts.ts161 // (shortcut) =>COMMENT
LOWpackages/clipper/playwright.config.ts81 // ...devices["Desktop Firefox"]COMMENT
LOWpackages/clipper/playwright.config.ts101 // use: {COMMENT
LOWpackages/editor-mobile/src/setupTests.js21// allows you to do things like:COMMENT
LOWpackages/editor/src/extensions/table/component.tsx61 }, [node, cellMinWidth]);COMMENT
LOW…r/src/extensions/table/prosemirror-tables/copypaste.ts1// Utilities used for copy/paste handling.COMMENT
LOW…ckages/editor/src/extensions/react/react-node-view.tsx361 // return false;COMMENT
LOW…ckages/editor/src/extensions/react/react-node-view.tsx381COMMENT
LOWapps/web/playwright.config.ts81 // }COMMENT
LOWapps/web/__e2e__/user.test.ts101 expect(await app.navigation.findItem("Notes")).toBeDefined();COMMENT
LOWapps/web/__e2e__/user.test.ts121// password: currentPasswordCOMMENT
LOWapps/web/__e2e__/user.test.ts141COMMENT
LOWapps/web/__e2e__/user.test.ts161// await page.click(getTestId("step-recovery-key"));COMMENT
LOWapps/web/__e2e__/user.test.ts181// let newPassword = USER.NEW.password;COMMENT
LOWapps/web/__e2e__/user.test.ts201// await page.click(getTestId("submitButton"));COMMENT
LOWapps/web/__e2e__/user.test.ts221COMMENT
LOWapps/web/__e2e__/user.test.ts241COMMENT
LOWapps/web/__e2e__/user.test.ts281COMMENT
LOWapps/web/__e2e__/user.test.ts301// const cKey = currentKey;COMMENT
LOWapps/web/__e2e__/importer.test.js21// const { getTestId, isTestAll, loginUser } = require("./utils");COMMENT
LOWapps/web/__e2e__/importer.test.js41// await page.click(getTestId("navitem-settings"));COMMENT
LOWapps/web/__e2e__/importer.test.js61// }COMMENT
LOWapps/web/__e2e__/notebooks.test.ts181// const notebook = await notebooks.createNotebook(NOTEBOOK);COMMENT
LOWapps/web/src/components/virtualized-table/index.tsx101 );COMMENT
LOWapps/web/src/components/virtualized-table/index.tsx121 // height: virtualizer.getTotalSize() + headerSizeCOMMENT
LOWapps/web/src/components/virtualized-table/index.tsx141 // }}COMMENT
LOWapps/web/src/components/split-pane/index.tsx241 // TODO: responsivenessCOMMENT
LOWapps/web/src/common/db.ts101 const limit = await getFeatureLimit(getFeature("maxNoteVersions"));COMMENT
LOWapps/web/src/dialogs/settings/index.tsx201COMMENT
LOWapps/web/src/dialogs/buy-dialog/types.ts101COMMENT
LOWapps/web/src/dialogs/buy-dialog/types.ts181 // payments: Payments;COMMENT
LOWapps/web/src/views/email-confirmed.tsx221 </Button> */}COMMENT
LOWapps/web/src/views/email-confirmed.tsx241// "Privacy is our basic right"COMMENT
LOWapps/web/src/views/email-confirmed.tsx261//COMMENT
LOWapps/web/src/views/email-confirmed.tsx281// </Button>COMMENT
LOWapps/desktop/__tests__/electron-test/base-test.ts61// builtins: Builtins;COMMENT
LOWapps/monograph/app/components/footer.tsx161 borderRadius: "default"COMMENT
17 more matches not shown…
Hyper-Verbose Identifiers75 hits · 76 pts
SeverityFileLineSnippetContext
LOWpackages/core/__e2e__/user-keys.test.ts75async function storeKeysNewerThanMasterKey(db: any) {CODE
LOWpackages/core/__tests__/sql-migrations.test.ts52async function createMigrationProviderBefore(migrationName: string) {CODE
LOWpackages/core/__tests__/notes.test.ts36async function createAndAddNoteToNotebook(CODE
LOWpackages/core/src/migrations.ts616function replaceDateEditedWithDateModified(removeDateEditedProperty = false) {CODE
LOWpackages/core/src/migrations.ts642function removeToxClassFromChecklist(html: string): string {CODE
LOWpackages/core/src/common.ts60export function sendMigrationProgressEvent(CODE
LOWpackages/core/src/utils/date.ts40export function getWeekGroupFromTimestamp(timestamp: number, locale?: string) {CODE
LOW…/core/src/utils/__tests__/virtualized-grouping.test.ts36function createVirtualizedGrouping(CODE
LOWpackages/core/src/collections/reminders.ts287export function createUpcomingReminderTimeQuery(unix = "now") {CODE
LOWpackages/core/src/collections/reminders.ts334export function createIsReminderActiveQuery(now = "now") {CODE
LOWpackages/clipper/src/index.ts269function injectNodeSelectionControls(CODE
LOWpackages/common/src/utils/date-time.ts48export function getFormattedHistorySessionDate(session: HistorySession) {CODE
LOW…s/editor/src/toolbar/floating-menus/search-replace.tsx26export function SearchReplaceFloatingMenu(props: FloatingMenuProps) {CODE
LOWpackages/editor/src/utils/prosemirror.ts152export function findParentNodeClosestToPos(CODE
LOWpackages/editor/src/extensions/embed/component.tsx194function getIframeAllowPermissions(src: string) {CODE
LOWpackages/editor/src/extensions/heading/heading.ts384function findEndOfCollapsedSection(CODE
LOW…src/extensions/math/plugin/plugins/math-paste-rules.ts67function texFromMediaWikiFallbackImage(root: Element): false | string {CODE
LOW…c/extensions/table/prosemirror-tables/cellselection.ts408function isTextSelectionAcrossCells({ $from, $to }: TextSelection) {CODE
LOW…/extensions/table/prosemirror-tables/columnresizing.ts370export function createColumnResizeHandles(CODE
LOW…c/extensions/table/prosemirror-tables/utils/convert.ts29export function convertTableNodeToArrayOfRows(CODE
LOW…c/extensions/table/prosemirror-tables/utils/convert.ts70export function convertArrayOfRowsToTableNode(CODE
LOW…ions/table/prosemirror-tables/utils/selection-range.ts23export function getSelectionRangeInColumn(CODE
LOW…ditor/src/extensions/clipboard/clipboard-dom-parser.ts106export function convertBrToSingleSpacedParagraphs(dom: HTMLElement | Document) {CODE
LOW…ditor/src/extensions/clipboard/clipboard-dom-parser.ts156export function convertGoogleDocsChecklist(dom: HTMLElement | Document) {CODE
LOWapps/web/__e2e__/models/utils.ts127export async function fillConfirmPasswordDialog(page: Page, password: string) {CODE
LOWapps/web/src/index.html42 (async function validateServiceWorkerTrack() {CODE
LOWapps/web/src/app-effects.tsx102 function handleDownloadUploadProgress(CODE
LOWapps/web/src/app-effects.tsx219function getProcessingStatusFromType(type: ProcessingType) {CODE
LOWapps/web/src/utils/feature-check.ts29export function isTransferableStreamsSupported() {CODE
LOWapps/web/src/utils/stream-saver/index.ts54function checkSupportsTransferable() {CODE
LOWapps/web/src/components/list-container/index.tsx54>(function CustomScrollbarsVirtualList(props, ref) {CODE
LOW…ps/web/src/components/list-container/list-profiles.tsx126export function getListItemPlaceholderData(CODE
LOWapps/web/src/components/navigation-menu/index.tsx1109async function getSidebarItemsAsMenuItems(): Promise<MenuItem[]> {CODE
LOWapps/web/src/components/pdf-preview/links-plugin.tsx28function findAndReplaceLinkAnnotations(e: PluginOnAnnotationLayerRender) {CODE
LOWapps/web/src/components/theme-provider/index.tsx98export function FixedColorSchemeThemeProvider(CODE
LOWapps/web/src/components/editor/index.tsx428function DownloadAttachmentProgress(props: DownloadAttachmentProgressProps) {CODE
LOWapps/web/src/common/toasts.ts25export function showFeatureNotAllowedToast(CODE
LOWapps/web/src/common/notices.ts89export async function shouldAddAutoBackupsDisabledNotice() {CODE
LOWapps/web/src/common/notices.ts112export async function shouldAddRecoveryKeyBackupNotice() {CODE
LOWapps/web/src/common/notices.ts125export async function shouldAddConfirmEmailNotice() {CODE
LOWapps/web/src/common/index.ts435export function totalSubscriptionConsumed(user: User) {CODE
LOWapps/web/src/common/index.ts494export function createSetDefaultHomepageMenuItem(CODE
LOWapps/web/src/common/index.ts602export async function scheduleExpiredNotesDeletion() {CODE
LOWapps/web/src/hooks/use-keyboard-list-navigation.ts40export function useKeyboardListNavigation(CODE
LOWapps/web/src/dialogs/confirm.tsx178export function showMultiDeleteConfirmation(length: number) {CODE
LOWapps/web/src/dialogs/confirm.tsx189export function showMultiPermanentDeleteConfirmation(length: number) {CODE
LOWapps/web/src/dialogs/confirm.tsx216export function showClearSessionsConfirmation() {CODE
LOWapps/web/src/dialogs/confirm.tsx225export async function showUpdateAvailableNotice({CODE
LOWapps/web/src/dialogs/edit-note-creation-date-dialog.tsx48 function EditNoteCreationDateDialog({CODE
LOWapps/web/src/dialogs/command-palette/commands.ts351async function getActiveNotebookCommands() {CODE
LOWapps/web/src/dialogs/buy-dialog/plan-list.tsx653export function formatRecurringPeriodShort(period: Period) {CODE
LOWapps/mobile/worker.js244function isEntityInAttributeInvalidEnd(code) {CODE
LOWapps/mobile/worker.js6507function hasDependsOnCurrentElement(selector) {CODE
LOWapps/mobile/worker.js10463function requireCSSValueExpression() {CODE
LOWapps/mobile/worker.js11422function requireCSSStyleDeclaration() {CODE
LOWapps/mobile/app/screens/settings/theme-selector.tsx609export default function ThemeSelectorWithQueryClient() {CODE
LOWapps/mobile/app/screens/manage-tags/index.tsx50async function updateInitialSelectionState(items: string[]) {CODE
LOWapps/mobile/app/screens/link-notebooks/index.tsx60async function updateInitialSelectionState(items: string[]) {CODE
LOWapps/mobile/app/common/database/encryption.ts82export async function encryptDatabaseKeyWithPassword(appLockPassword: string) {CODE
LOWapps/mobile/app/common/database/encryption.ts95export async function restoreDatabaseKeyToKeyChain(appLockPassword: string) {CODE
15 more matches not shown…
Decorative Section Separators11 hits · 33 pts
SeverityFileLineSnippetContext
MEDIUMpackages/crypto/__tests__/crypto.test.ts30// ─── Key Derivation ────────────────────────────────────────────────COMMENT
MEDIUMpackages/crypto/__tests__/crypto.test.ts87// ─── Symmetric Encryption Round-Trip ───────────────────────────────COMMENT
MEDIUMpackages/crypto/__tests__/crypto.test.ts166// ─── Multi-Encryption ──────────────────────────────────────────────COMMENT
MEDIUMpackages/crypto/__tests__/crypto.test.ts190// ─── Password Hashing ──────────────────────────────────────────────COMMENT
MEDIUMpackages/crypto/__tests__/crypto.test.ts224// ─── Streaming Encryption ──────────────────────────────────────────COMMENT
MEDIUMpackages/core/__tests__/encryption-verification.test.ts25// ─── verifyPassword ────────────────────────────────────────────────COMMENT
MEDIUMpackages/core/__tests__/encryption-verification.test.ts68// ─── verifyEncryptionKey ───────────────────────────────────────────COMMENT
MEDIUMpackages/core/__tests__/password-change.test.ts87// ─── _updatePassword (change) ──────────────────────────────────────COMMENT
MEDIUMpackages/core/__tests__/password-change.test.ts240// ─── _updatePassword (reset) ───────────────────────────────────────COMMENT
MEDIUMpackages/core/__tests__/password-change.test.ts287// ─── Key migration scenarios ───────────────────────────────────────COMMENT
MEDIUMpackages/core/__tests__/password-change.test.ts388// ─── getDataEncryptionKeys ─────────────────────────────────────────COMMENT
Fake / Example Data28 hits · 30 pts
SeverityFileLineSnippetContext
LOWpackages/core/__tests__/encryption-verification.test.ts221 access_token: "fake-token",CODE
LOWpackages/core/__tests__/encryption-verification.test.ts254 access_token: "fake-token",CODE
LOWpackages/core/__tests__/encryption-verification.test.ts274 "fake-token"CODE
LOWpackages/core/__tests__/encryption-verification.test.ts293 access_token: "fake-token",CODE
LOWpackages/core/__tests__/password-change.test.ts60 access_token: "fake-token",CODE
LOWpackages/core/__tests__/password-change.test.ts298 access_token: "fake-token", t: Date.now(), expires_in: 3600,CODE
LOWpackages/core/__tests__/password-change.test.ts341 access_token: "fake-token", t: Date.now(), expires_in: 3600,CODE
LOWpackages/core/__tests__/user-keys.test.ts136 access_token: "fake-token",CODE
LOWpackages/core/__tests__/user-keys.test.ts351 access_token: "fake-token",CODE
LOWpackages/core/__tests__/user-keys.test.ts359 access_token: "fake-token",CODE
LOW⚡packages/core/__tests__/notes.test.ts219 "<p><strong>head</strong><em>line</em>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam rutrum ex ac eCODE
LOW⚡packages/core/__tests__/notes.test.ts219 "<p><strong>head</strong><em>line</em>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam rutrum ex ac eCODE
LOW⚡packages/core/__tests__/notes.test.ts220 "headlineLorem ipsum dolor sit amet, consectetur adipiscing e"CODE
LOW⚡packages/core/__tests__/notes.test.ts220 "headlineLorem ipsum dolor sit amet, consectetur adipiscing e"CODE
LOWpackages/core/__tests__/utils/index.ts96 "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standaCODE
LOWpackages/theme/v1.schema.json244 "placeholder": {CODE
LOWpackages/theme/v1.schema.json281 "placeholder",CODE
LOWpackages/theme/v1.schema.json354 "placeholder": {CODE
LOWpackages/theme/src/theme-engine/types.ts312 "placeholder",CODE
LOWpackages/theme/src/theme-engine/types.ts322 "placeholder",CODE
LOWpackages/theme/src/theme/variants/input.ts44 color: "placeholder"CODE
LOWpackages/theme/src/theme/variants/input.ts64 color: "placeholder"CODE
LOWapps/web/src/components/editor/title-box.tsx130 color: "placeholder"CODE
LOWapps/mobile/worker.js11876 return this.getAttribute("placeholder");CODE
LOWapps/mobile/worker.js11879 this.setAttribute("placeholder", value);CODE
LOWapps/mobile/worker.js12285 return this.getAttribute("placeholder");CODE
LOWapps/mobile/worker.js12288 this.setAttribute("placeholder", value);CODE
LOW…bile/app/components/side-menu/side-menu-list-empty.tsx66 key={"placeholder" + i}CODE
Hallucination Indicators2 hits · 20 pts
SeverityFileLineSnippetContext
CRITICALpackages/editor/src/extensions/code-block/code-block.ts709 document.body.firstElementChild.style.fontFamily.includes("monospace") &&CODE
CRITICALpackages/editor/src/extensions/code-block/code-block.ts710 document.body.firstElementChild.style.whiteSpace.includes("pre"));CODE
AI Slop Vocabulary4 hits · 10 pts
SeverityFileLineSnippetContext
MEDIUMpackages/core/__tests__/__fixtures__/backup.v5.2.json267 "data": "<header class=\"header-container header-chrome\"><form class=\"minerva-header\" action=\"https://en.m.wikCODE
MEDIUMpackages/core/__tests__/__fixtures__/backup.v5.2.json267 "data": "<header class=\"header-container header-chrome\"><form class=\"minerva-header\" action=\"https://en.m.wikCODE
MEDIUMpackages/core/src/content-types/tiptap.ts452 // so the dumb length comparison is the most robust way to get the correct value.COMMENT
MEDIUM…ditor/src/extensions/table/prosemirror-tables/input.ts228 // is robust regardless of what domAtPos returns (text node, <p>, etc.).COMMENT
Slop Phrases1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUM…ckages/core/src/content-types/__tests__/tiptap.test.js72 codeblocks: `<p>Typescript is one of those languages that appear to be very simple. It's often described as "JavascripCODE
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippetContext
LOWapps/monograph/app/entry.server.tsx30export default function handleRequest(CODE
Verbosity Indicators1 hit · 1 pts
SeverityFileLineSnippetContext
LOW…a/com/streetwriters/notesnook/BootRecieverService.java36 We need to check if app is in foreground otherwise the app will crash.CODE