Greenlit

greenlit.sh

Ship

Score 100/100 · 3 findings

Target https://github.com/greenlit-sh/greenlit-sh
Commit 89fca6a8876c6d806d0bdd594baa4e77393832bf
Scanned 2026-09-22 16:47 UTC
Served at greenlit.sh/self-report

If this went live

Semantic pass skipped — no plain-English narrative for this scan.

Fix these first

  1. medium dangerouslySetInnerHTML renders a non-literal value as raw HTML. If the value is ever user-influenced this is XSS.
    web/src/app/page.tsx:86-89
  2. low Empty catch block silently swallows errors. Failures (including security failures) disappear without a trace.
    web/src/app/admin/route.ts:48-67
  3. low Empty catch block silently swallows errors. Failures (including security failures) disappear without a trace.
    web/src/lib/analytics.ts:49-53

Category breakdown

CategoryFindingsWorst severity
Auth & access0—
Secrets0—
Data flow0—
Dependencies0—
Missing basics0—
AI smells3medium

All findings (3)

medium

1. dangerouslySetInnerHTML renders a non-literal value as raw HTML. If the value is ever user-influenced this is XSS.

web/src/app/page.tsx:86-89
AI smells · confidence 0.60 · semgrep (ai.smell.dangerously-set-inner-html)
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(JSON_LD).replace(/</g, "\\u003c") }}
Fix: Render text via JSX (auto-escaped), or sanitise the HTML with DOMPurify before passing it in.
low

2. Empty catch block silently swallows errors. Failures (including security failures) disappear without a trace.

web/src/app/admin/route.ts:48-67
AI smells · confidence 0.80 · semgrep (ai.smell.empty-catch)
try {
const raw = JSON.parse(await fs.readFile(path.join(dir, name), "utf8")) as {
scan_id?: string;
Fix: Handle the error or at minimum log it; rethrow anything you cannot handle.
low

3. Empty catch block silently swallows errors. Failures (including security failures) disappear without a trace.

web/src/lib/analytics.ts:49-53
AI smells · confidence 0.80 · semgrep (ai.smell.empty-catch)
try {
umami?.track(event, data);
} catch {
Fix: Handle the error or at minimum log it; rethrow anything you cannot handle.