← Back to scan
File as GitHub Issue repo: 2anki/server

Push this scan report to 2anki/server

Click the green button below to open GitHub’s new-issue form, pre-filled with the report title, summary table, top findings, and an embedded score-card image. No authentication needed — you review on GitHub before submitting. Repobility is credited as the scanner.

Embedded score card image

This image will render at the top of the issue body. Hosted on Repobility, refreshes automatically after re-scans.

Repobility score card

Issue title

Async function without await — fire-and-forget Promise (AI mistake)

Curate findings to include

Pick exactly which findings appear in the issue body. By default the top 5 are included. Uncheck noise, check what matters.

Top 5 (default)
Severity Rule Title File:line
HIGH SEC135 [SEC135] Auth/permission check missing on AI-generated endpoint: Mutating HTTP endpoint g… web/mock-server/server.js:188
HIGH SEC040 [SEC040] innerHTML XSS — template literal with server-supplied data: Setting .innerHTML w… src/services/NotionService/helpers/getP…:11
HIGH SEC040 [SEC040] innerHTML XSS — template literal with server-supplied data: Setting .innerHTML w… src/services/NotionService/blocks/lists…:40
HIGH SEC040 [SEC040] innerHTML XSS — template literal with server-supplied data: Setting .innerHTML w… src/infrastracture/adapters/fileConvers…:16
HIGH SEC128 [SEC128] Async function without await — fire-and-forget Promise (AI mistake): Async call … src/routes/MindmapRouter.ts:110
HIGH SEC128 [SEC128] Async function without await — fire-and-forget Promise (AI mistake): Async call … src/routes/AnkifySessionProxyRouter.ts:93
HIGH SEC128 [SEC128] Async function without await — fire-and-forget Promise (AI mistake): Async call … src/controllers/DownloadController.ts:225
HIGH SEC029 [SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input: Outbound HTT… src/controllers/ErrorEventController.ts:43
HIGH SEC029 [SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input: Outbound HTT… scripts/digitalocean/config.ts:17
HIGH SEC029 [SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input: Outbound HTT… scripts/deploy-blue-green.sh:45
HIGH MINED004 [MINED004] Weak Crypto: MD5/SHA1/DES/RC4 used for security context (not just checksums). src/usecases/chat/ChatDeckUseCase.ts:29
HIGH MINED004 [MINED004] Weak Crypto: MD5/SHA1/DES/RC4 used for security context (not just checksums). create_deck/helpers/get_model_id.py:22
HIGH MINED004 [MINED004] Weak Crypto: MD5/SHA1/DES/RC4 used for security context (not just checksums). create_deck/create_io_deck.py:83
HIGH MINED012 [MINED012] Curl Pipe Bash: curl ... | sh / bash — runs unverified network code. .claude/hooks/pre-bash-curl-pipe.py:3
HIGH SEC085 [SEC085] JS: child_process.exec with non-literal: child_process.exec with user-derived in… src/services/ApkgPreviewService/renderT…:108
HIGH SEC085 [SEC085] JS: child_process.exec with non-literal: child_process.exec with user-derived in… src/routes/AnkifySessionProxyRouter.ts:82
HIGH SEC085 [SEC085] JS: child_process.exec with non-literal: child_process.exec with user-derived in… .claude/caveman/hooks/caveman-mode-trac…:41
HIGH MINED115 Action `actions/checkout` pinned to mutable ref `@v6` .github/workflows/server.yml:38
HIGH MINED115 Action `actions/checkout` pinned to mutable ref `@v6` .github/workflows/server.yml:22
HIGH MINED115 Action `actions/checkout` pinned to mutable ref `@v6` .github/workflows/web.yml:57
HIGH MINED115 Action `actions/cache` pinned to mutable ref `@v5` .github/workflows/web.yml:43
HIGH MINED115 Action `actions/checkout` pinned to mutable ref `@v6` .github/workflows/web.yml:35
HIGH MINED115 Action `actions/checkout` pinned to mutable ref `@v6` .github/workflows/web.yml:24
HIGH MINED115 Action `anthropics/claude-code-action` pinned to mutable ref `@v1` .github/workflows/claude.yml:35
HIGH MINED115 Action `actions/checkout` pinned to mutable ref `@v6` .github/workflows/claude.yml:29
HIGH MINED115 Action `actions/checkout` pinned to mutable ref `@v6` .github/workflows/weekly-retro.yml:18
HIGH MINED115 Action `appleboy/ssh-action` pinned to mutable ref `@v1.2.5` .github/workflows/deploy.2anki.net.yml:19
HIGH MINED115 Action `actions/upload-artifact` pinned to mutable ref `@v7` .github/workflows/playwright.yml:63
HIGH MINED115 Action `actions/cache` pinned to mutable ref `@v5` .github/workflows/playwright.yml:51
HIGH MINED115 Action `actions/cache` pinned to mutable ref `@v5` .github/workflows/playwright.yml:42
HIGH MINED115 Action `actions/checkout` pinned to mutable ref `@v6` .github/workflows/playwright.yml:38
HIGH MINED115 Action `anthropics/claude-code-action` pinned to mutable ref `@v1` .github/workflows/claude-code-review.yml:34
HIGH MINED115 Action `actions/checkout` pinned to mutable ref `@v6` .github/workflows/claude-code-review.yml:28
HIGH MINED115 Action `actions/setup-python` pinned to mutable ref `@v6` .github/workflows/create_deck.yml:42
HIGH MINED115 Action `actions/checkout` pinned to mutable ref `@v6` .github/workflows/create_deck.yml:41
HIGH MINED115 Action `actions/setup-python` pinned to mutable ref `@v6` .github/workflows/create_deck.yml:18
HIGH MINED115 Action `actions/checkout` pinned to mutable ref `@v6` .github/workflows/create_deck.yml:17
HIGH MINED122 package.json dep `xlsx` pulled from URL/Git package.json:1
HIGH GHSA-8x6r-g9mw-2r78 react-router: GHSA-8x6r-g9mw-2r78 web/pnpm-lock.yaml
HIGH GHSA-v39h-62p7-jpjc fast-uri: GHSA-v39h-62p7-jpjc web/pnpm-lock.yaml
HIGH GHSA-q3j6-qgpj-74h6 fast-uri: GHSA-q3j6-qgpj-74h6 web/pnpm-lock.yaml
HIGH GHSA-fv7c-fp4j-7gwp @babel/plugin-transform-modules-systemjs: GHSA-fv7c-fp4j-7gwp web/pnpm-lock.yaml
HIGH GHSA-5pgg-2g8v-p4x9 xlsx: GHSA-5pgg-2g8v-p4x9 pnpm-lock.yaml
HIGH GHSA-4r6h-8v6p-xvw6 xlsx: GHSA-4r6h-8v6p-xvw6 pnpm-lock.yaml
HIGH GHSA-jvwf-75h9-cwgg protobufjs: GHSA-jvwf-75h9-cwgg pnpm-lock.yaml
HIGH GHSA-75px-5xx7-5xc7 protobufjs: GHSA-75px-5xx7-5xc7 pnpm-lock.yaml
HIGH GHSA-685m-2w69-288q protobufjs: GHSA-685m-2w69-288q pnpm-lock.yaml
HIGH GHSA-66ff-xgx4-vchm protobufjs: GHSA-66ff-xgx4-vchm pnpm-lock.yaml
HIGH GHSA-r5fr-rjxr-66jc lodash-es: GHSA-r5fr-rjxr-66jc pnpm-lock.yaml
HIGH GHSA-x6wf-f3px-wcqx @xmldom/xmldom: GHSA-x6wf-f3px-wcqx pnpm-lock.yaml
HIGH GHSA-j759-j44w-7fr8 @xmldom/xmldom: GHSA-j759-j44w-7fr8 pnpm-lock.yaml
HIGH GHSA-f6ww-3ggp-fr8h @xmldom/xmldom: GHSA-f6ww-3ggp-fr8h pnpm-lock.yaml
HIGH GHSA-2v35-w6hq-6mfw @xmldom/xmldom: GHSA-2v35-w6hq-6mfw pnpm-lock.yaml
HIGH JRN009 Secret-like setting is echoed into a password input value web/src/pages/LoginPage/components/Logi…:177
HIGH JRN009 Secret-like setting is echoed into a password input value web/src/components/forms/RegisterForm.t…:186
HIGH SEC013 [SEC013] Path Traversal — User Input in File Path: User-controlled input used in file pat… src/controllers/OpsErrorsController.ts:103
HIGH MINED113 Express PATCH /api/chat/conversations/:id has no auth src/routes/ChatRouter.ts:430
HIGH MINED113 Express POST /api/chat/tag-cards has no auth src/routes/ChatRouter.ts:312
HIGH AUC003 [AUC003] Object-level route lacks visible authorization: A route with an object id-like p… src/routes/UserRouter.ts:371
HIGH AUC003 [AUC003] Object-level route lacks visible authorization: A route with an object id-like p… src/routes/NotionRouter.ts:576
HIGH AUC003 [AUC003] Object-level route lacks visible authorization: A route with an object id-like p… src/routes/DownloadRouter.ts:161
HIGH AUC003 [AUC003] Object-level route lacks visible authorization: A route with an object id-like p… src/routes/DownloadRouter.ts:122
HIGH AUC003 [AUC003] Object-level route lacks visible authorization: A route with an object id-like p… src/routes/DownloadRouter.ts:89
HIGH AUC003 [AUC003] Object-level route lacks visible authorization: A route with an object id-like p… src/routes/AnkifyRouter.ts:476
MED SEC046 [SEC046] Client-side open redirect — window.location = server-supplied URL: Assigning win… web/src/pages/DownloadsPage/components/…:39
MED SEC046 [SEC046] Client-side open redirect — window.location = server-supplied URL: Assigning win… web/src/pages/DownloadsPage/components/…:111
MED SEC046 [SEC046] Client-side open redirect — window.location = server-supplied URL: Assigning win… web/src/components/UpsellCard/UpsellCar…:89
MED SEC105 [SEC105] Cookie missing HttpOnly/Secure flag: Session cookie missing HttpOnly (allows JS … src/routes/middleware/anonIdMiddleware.…:25
MED SEC031 [SEC031] Catastrophic Backtracking Regex (ReDoS): Regex contains nested quantifiers like … .claude/hooks/safety.py:80
MED SEC045 [SEC045] eval()/exec() on stored or user-supplied data: eval() and exec() on data — even … src/routes/AnkifySessionProxyRouter.ts:82
MED SEC045 [SEC045] eval()/exec() on stored or user-supplied data: eval() and exec() on data — even … .claude/hooks/pre-write-secret-scan.py:72
MED SEC045 [SEC045] eval()/exec() on stored or user-supplied data: eval() and exec() on data — even … .claude/caveman/hooks/caveman-mode-trac…:41
MED SEC136 [SEC136] AI-typical over-broad exception handler swallowing all errors: Catch-all excepti… .claude/hooks/pre-push-typecheck.py:63
MED SEC136 [SEC136] AI-typical over-broad exception handler swallowing all errors: Catch-all excepti… .claude/caveman/hooks/caveman-config.js:165
MED ERR002 [ERR002] Empty Catch Block: Empty catch blocks hide errors. src/usecases/apkg/ImportApkgToNotionUse…:158
MED ERR002 [ERR002] Empty Catch Block: Empty catch blocks hide errors. .claude/caveman/hooks/caveman-mode-trac…:97
MED ERR002 [ERR002] Empty Catch Block: Empty catch blocks hide errors. .claude/caveman/hooks/caveman-activate.…:22
MED MINED111 Bare except continues silently .claude/hooks/pre-push-typecheck.py:72
MED MINED111 Bare except continues silently .claude/hooks/safety.py:70
MED AUC001 [AUC001] No Repobility access matrix policy found: The repository uses web/API frameworks…
MED DEPCUR-NPM npm package `pdf-parse` is 1 major version(s) behind (1.1.1 -> 2.4.5) package.json
MED MINED124 requirements.txt: `mock` has no version pin create_deck/requirements.txt:8
MED MINED124 requirements.txt: `pytest` has no version pin create_deck/requirements.txt:7
MED GHSA-q8mj-m7cp-5q26 qs: GHSA-q8mj-m7cp-5q26 web/pnpm-lock.yaml
MED GHSA-q8mj-m7cp-5q26 qs: GHSA-q8mj-m7cp-5q26 pnpm-lock.yaml
MED GHSA-q6x5-8v7m-xcrf protobufjs: GHSA-q6x5-8v7m-xcrf pnpm-lock.yaml
MED GHSA-jggg-4jg4-v7c6 protobufjs: GHSA-jggg-4jg4-v7c6 pnpm-lock.yaml
MED GHSA-fx83-v9x8-x52w protobufjs: GHSA-fx83-v9x8-x52w pnpm-lock.yaml
MED GHSA-2pr8-phx7-x9h3 protobufjs: GHSA-2pr8-phx7-x9h3 pnpm-lock.yaml
MED GHSA-mwcw-c2x4-8c55 nanoid: GHSA-mwcw-c2x4-8c55 pnpm-lock.yaml
MED GHSA-xxjr-mmjv-4gpg lodash-es: GHSA-xxjr-mmjv-4gpg pnpm-lock.yaml
MED GHSA-f23m-r3pf-42rh lodash-es: GHSA-f23m-r3pf-42rh pnpm-lock.yaml
MED GHSA-v9jr-rg53-9pgp dompurify: GHSA-v9jr-rg53-9pgp pnpm-lock.yaml
MED GHSA-v2wj-7wpq-c8vv dompurify: GHSA-v2wj-7wpq-c8vv pnpm-lock.yaml
MED GHSA-h8r8-wccr-v5f2 dompurify: GHSA-h8r8-wccr-v5f2 pnpm-lock.yaml
MED GHSA-h7mw-gpvr-xq4m dompurify: GHSA-h7mw-gpvr-xq4m pnpm-lock.yaml
MED GHSA-crv5-9vww-q3g8 dompurify: GHSA-crv5-9vww-q3g8 pnpm-lock.yaml
MED GHSA-cjmm-f4jc-qw8r dompurify: GHSA-cjmm-f4jc-qw8r pnpm-lock.yaml
MED GHSA-cj63-jhhr-wcxv dompurify: GHSA-cj63-jhhr-wcxv pnpm-lock.yaml
MED GHSA-39q2-94rc-95cp dompurify: GHSA-39q2-94rc-95cp pnpm-lock.yaml
MED GHSA-q6x5-8v7m-xcrf @protobufjs/utf8: GHSA-q6x5-8v7m-xcrf pnpm-lock.yaml
MED WEB003 Public web service has no security.txt .well-known/security.txt
MED AGT006 React interval is created without an explicit cleanup src/lib/inactivity/jobs/scheduleInactiv…:29
MED AGT006 React interval is created without an explicit cleanup src/lib/inactivity/jobs/scheduleInactiv…:29
MED AGT006 React interval is created without an explicit cleanup src/lib/ankify/jobs/scheduleAnkifyPolli…:53
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/ApkgRouter.ts:152
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyWebhookRouter.ts:53
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyRouter.ts:806
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyRouter.ts:792
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyRouter.ts:778
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyRouter.ts:773
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyRouter.ts:743
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyRouter.ts:712
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyRouter.ts:679
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyRouter.ts:635
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyRouter.ts:630
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyRouter.ts:625
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyRouter.ts:585
MED JRN003 Frontend API reference is not matched by discovered backend routes src/routes/AnkifyRouter.ts:539
MED JRN003 Frontend API reference is not matched by discovered backend routes src/config/swagger.ts:574
MED WEB015 Public web app has no Content Security Policy index.html
MED AUC009 [AUC009] Sensitive function route lacks elevated authorization evidence: A route appears … src/routes/UploadRouter.ts:454
MED AUC009 [AUC009] Sensitive function route lacks elevated authorization evidence: A route appears … src/routes/FavoriteRouter.ts:124
MED AUC009 [AUC009] Sensitive function route lacks elevated authorization evidence: A route appears … src/routes/ChecksRouter.ts:44
MED AUC009 [AUC009] Sensitive function route lacks elevated authorization evidence: A route appears … src/routes/OpsErrorsRouter.ts:128
MED AUC009 [AUC009] Sensitive function route lacks elevated authorization evidence: A route appears … src/routes/OpsErrorsRouter.ts:125
MED AUC009 [AUC009] Sensitive function route lacks elevated authorization evidence: A route appears … src/routes/OpsErrorsRouter.ts:84
MED AUC009 [AUC009] Sensitive function route lacks elevated authorization evidence: A route appears … src/routes/OpsErrorsRouter.ts:57
MED AUC009 [AUC009] Sensitive function route lacks elevated authorization evidence: A route appears … src/routes/ShowcaseRouter.ts:26
MED AUC009 [AUC009] Sensitive function route lacks elevated authorization evidence: A route appears … web/mock-server/server.js:201
MED AUC009 [AUC009] Sensitive function route lacks elevated authorization evidence: A route appears … web/mock-server/server.js:161
MED AUC004 [AUC004] Admin route does not show super_admin separation: An administrative route was de… src/routes/SettingsRouter.ts:317
MED AUC004 [AUC004] Admin route does not show super_admin separation: An administrative route was de… src/routes/SettingsRouter.ts:293
MED AUC004 [AUC004] Admin route does not show super_admin separation: An administrative route was de… src/routes/SettingsRouter.ts:246
MED AUC004 [AUC004] Admin route does not show super_admin separation: An administrative route was de… src/routes/SettingsRouter.ts:209
MED AUC004 [AUC004] Admin route does not show super_admin separation: An administrative route was de… src/routes/SettingsRouter.ts:183
MED AUC004 [AUC004] Admin route does not show super_admin separation: An administrative route was de… src/routes/SettingsRouter.ts:132
MED AUC004 [AUC004] Admin route does not show super_admin separation: An administrative route was de… src/routes/SettingsRouter.ts:91
LOW SEC132 [SEC132] String concat where the language has interpolation (AI style drift): String buil… .claude/hooks/check-commit-message.py:111
LOW SEC132 [SEC132] String concat where the language has interpolation (AI style drift): String buil… .claude/caveman/hooks/caveman-activate.…:43
LOW COMP001 [COMP001] High cognitive complexity: Function `find_duplicate` has cognitive complexity 9… .claude/hooks/check-duplicate-commit-me…:67
LOW COMP001 [COMP001] High cognitive complexity: Function `main` has cognitive complexity 11 (SonarSo… .claude/hooks/check-commit-message.py:66
LOW COMP001 [COMP001] High cognitive complexity: Function `main` has cognitive complexity 10 (SonarSo… .claude/hooks/check-browser-attestation…:98
LOW DEPCUR-NPM npm package `sql.js` is minor version(s) behind (^1.13.0 -> 1.14.1) package.json
LOW DEPCUR-NPM npm package `pg` is minor version(s) behind (^8.11.3 -> 8.21.0) package.json
LOW DEPCUR-NPM npm package `multer` is minor version(s) behind (^2.0.1 -> 2.1.1) package.json
LOW DEPCUR-NPM npm package `markdown-it` is minor version(s) behind (^14.1.1 -> 14.2.0) package.json
LOW DEPCUR-NPM npm package `mammoth` is minor version(s) behind (^1.8.0 -> 1.12.0) package.json
LOW DEPCUR-NPM npm package `knex` is minor version(s) behind (^3.1.0 -> 3.2.10) package.json
LOW DEPCUR-NPM npm package `google-auth-library` is minor version(s) behind (^10.6.2 -> 10.7.0) package.json
LOW DEPCUR-NPM npm package `find-remove` is minor version(s) behind (^5.0.0 -> 5.1.1) package.json
LOW DEPCUR-NPM npm package `express` is minor version(s) behind (^5.1.0 -> 5.2.1) package.json
LOW DEPCUR-NPM npm package `dotenv` is minor version(s) behind (17.2.3 -> 17.4.2) package.json
LOW DEPCUR-NPM npm package `cheerio` is minor version(s) behind (^1.0.0 -> 1.2.0) package.json
LOW DEPCUR-NPM npm package `better-sqlite3` is minor version(s) behind (^12.9.0 -> 12.10.0) package.json
LOW DEPCUR-NPM npm package `axios` is minor version(s) behind (^1.13.5 -> 1.17.0) package.json
LOW DEPCUR-NPM npm package `@notionhq/client` is minor version(s) behind (^5.18.0 -> 5.22.0) package.json
LOW DEPCUR-NPM npm package `@anthropic-ai/sdk` is minor version(s) behind (^0.100.1 -> 0.101.0) package.json
LOW AIC003 Duplicated implementation block across source files src/routes/AnkifyRouter.ts:89
LOW AIC003 Duplicated implementation block across source files src/lib/parser/xlsx/convertXLSXToHTML.ts:19
LOW AIC003 Duplicated implementation block across source files src/controllers/ShareController.ts:13
LOW AIC003 Duplicated implementation block across source files .claude/hooks/safety.py:11
LOW AIC003 Duplicated implementation block across source files .claude/hooks/safety.py:5
LOW AIC003 Duplicated implementation block across source files .claude/hooks/pre-write-secret-scan.py:10
LOW AIC003 Duplicated implementation block across source files .claude/hooks/pre-write-secret-scan.py:9
LOW AIC003 Duplicated implementation block across source files .claude/hooks/pre-write-secret-scan.py:5
LOW AIC003 Duplicated implementation block across source files .claude/hooks/pre-push-typecheck.py:23
LOW AIC003 Duplicated implementation block across source files .claude/hooks/pre-bash-curl-pipe.py:11
LOW AIC003 Duplicated implementation block across source files .claude/hooks/pre-bash-curl-pipe.py:10
LOW AIC003 Duplicated implementation block across source files .claude/hooks/check-merge-status.py:13
LOW AIC003 Duplicated implementation block across source files .claude/hooks/check-duplicate-commit-me…:13
LOW AIC003 Duplicated implementation block across source files .claude/hooks/check-commit-message.py:27
LOW WEB008 Public docs site has no llms.txt llms.txt
LOW WEB011 Public web app has no humans.txt humans.txt
INFO MINED056 [MINED056] React Key As Index: key={index} in map() — re-renders the wrong elements on re… web/src/pages/Chat/CardPreview.tsx:71
INFO MINED056 [MINED056] React Key As Index: key={index} in map() — re-renders the wrong elements on re… web/src/components/Skeleton/Skeleton.tsx:42
INFO MINED043 [MINED043] Http Not Https: Hardcoded http:// (not localhost) for endpoints that handle cr… web/src/pages/Chat/AssistantMarkdown.tsx:10
INFO MINED043 [MINED043] Http Not Https: Hardcoded http:// (not localhost) for endpoints that handle cr… src/services/ankify/AnkiConnectClient.ts:230
INFO MINED058 [MINED058] React Dangerously Set Html: dangerouslySetInnerHTML bypasses Reacts JSX escapi… src/services/NotionService/helpers/getL…:47
INFO MINED058 [MINED058] React Dangerously Set Html: dangerouslySetInnerHTML bypasses Reacts JSX escapi… src/services/NotionService/blocks/lists…:39
INFO MINED058 [MINED058] React Dangerously Set Html: dangerouslySetInnerHTML bypasses Reacts JSX escapi… src/services/NotionService/blocks/Block…:20
INFO MINED052 [MINED052] Ts Any Typed: : any used as type annotation. Defeats TypeScript type safety. src/services/UsersService.ts:82
INFO MINED052 [MINED052] Ts Any Typed: : any used as type annotation. Defeats TypeScript type safety. src/infrastracture/adapters/fileConvers…:58
INFO MINED052 [MINED052] Ts Any Typed: : any used as type annotation. Defeats TypeScript type safety. src/data_layer/TokenRepository.ts:23
INFO MINED054 [MINED054] Ts As Any: Casting to any (as any) bypasses type checking entirely. src/data_layer/GoogleDriveRepository.ts:66
INFO MINED045 [MINED045] Ts Non Null Assertion: x! asserts not null - bypasses null checks - TypeError … src/services/NotionService/helpers/with…:47
INFO MINED045 [MINED045] Ts Non Null Assertion: x! asserts not null - bypasses null checks - TypeError … src/data_layer/GoogleDriveRepository.ts:66
INFO MINED045 [MINED045] Ts Non Null Assertion: x! asserts not null - bypasses null checks - TypeError … src/controllers/Upload/UploadController…:155
INFO MINED044 [MINED044] Js Console Log Prod: console.log left in code. Should be replaced with logger … scripts/digitalocean/prompt.ts:15
INFO MINED044 [MINED044] Js Console Log Prod: console.log left in code. Should be replaced with logger … scripts/digitalocean/migrate.ts:48
INFO MINED044 [MINED044] Js Console Log Prod: console.log left in code. Should be replaced with logger … scripts/digitalocean/logger.ts:16
INFO DEPCUR-NPM npm package `nodemailer` is patch version(s) behind (^8.0.1 -> 8.0.10) package.json
INFO DEPCUR-NPM npm package `metascraper-logo-favicon` is patch version(s) behind (^5.50.1 -> 5.50.3) package.json
INFO DEPCUR-NPM npm package `metascraper` is patch version(s) behind (^5.50.1 -> 5.50.3) package.json
INFO DEPCUR-NPM npm package `jsonwebtoken` is patch version(s) behind (^9.0.0 -> 9.0.3) package.json
INFO DEPCUR-NPM npm package `get-notion-object-title` is patch version(s) behind (^0.2.0 -> 0.2.9) package.json
INFO DEPCUR-NPM npm package `fflate` is patch version(s) behind (^0.8.0 -> 0.8.3) package.json
INFO DEPCUR-NPM npm package `cookie-parser` is patch version(s) behind (^1.4.6 -> 1.4.7) package.json
INFO DEPCUR-NPM npm package `@sendgrid/mail` is patch version(s) behind (^8.1.3 -> 8.1.6) package.json
INFO DEPCUR-NPM npm package `@2anki/csv-to-apkg` is patch version(s) behind (^1.4.4 -> 1.4.9) package.json
Reset to top 5 200 findings available (after auto-suppression of test files + won't-fix)

Issue body (markdown)

## Code-quality scan: `2anki/server`

**Score: 60/100 (C+)**  ·  278 findings  ·  scanned 2026-06-05 20:15 UTC  ·  216,972 LOC

| Severity | Count |
|---|---|
| CRITICAL | 21 |
| HIGH | 112 |
| MEDIUM | 74 |
| LOW | 36 |

📊 [Full filterable report](https://repobility.com/scan/b025e7bf-6c41-400d-89d0-ece5870610fb/)  ·  ![scorecard](https://repobility.com/scan/b025e7bf-6c41-400d-89d0-ece5870610fb/report.png?v=1780690527-s2)

### Top findings

1. **HIGH** `SEC135` — Auth/permission check missing on AI-generated endpoint
   `web/mock-server/server.js:188` · CWE-862
2. **HIGH** `SEC040` — innerHTML XSS — template literal with server-supplied data
   `src/services/NotionService/helpers/getPlainText.ts:11` · CWE-79 · A03:2021 Injection (XSS)
3. **HIGH** `SEC040` — innerHTML XSS — template literal with server-supplied data
   `src/services/NotionService/blocks/lists/BlockTable.tsx:40` · CWE-79 · A03:2021 Injection (XSS)
4. **HIGH** `SEC040` — innerHTML XSS — template literal with server-supplied data
   `src/infrastracture/adapters/fileConversion/preprocessDocxHTML.ts:16` · CWE-79 · A03:2021 Injection (XSS)
5. **HIGH** `SEC128` — Async function without await — fire-and-forget Promise (AI mistake)
   `src/routes/MindmapRouter.ts:110`

---

**Security note**: this issue is public. If any flagged finding is a real, exploitable vulnerability, please redirect to your `SECURITY.md` policy or open a [private security advisory](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability) instead. We're happy to close this and re-submit privately.

---

_Filed automatically. Close this issue if not useful — we won't refile. Full report: https://repobility.com/scan/b025e7bf-6c41-400d-89d0-ece5870610fb/_
Already filed
This repo publishes a SECURITY.md policy and the scan contains 22 Critical/High security finding(s). Public issue filing would violate coordinated disclosure. Submit privately via the project's security reporting channel.
Megaproject â high spam risk
Could not determine '2anki/server' star count (GitHub API rate-limited or unreachable). When in doubt about repo size, prefer opening a focused PR or a discussion rather than an issue.

The button opens GitHubâs new-issue page in a new tab. You will see the title + body pre-filled â review, edit if you want, then click GitHubâs "Submit new issue" button. Repobility never posts anything on your behalf.

For real security findings on big repos: use the project's SECURITY.md or private advisory flow instead of a public issue.