Two deliverables from one typed dataset:
- The turn-in — one
{Breach}/folder per exploited breach, each with an exact-bytesflagand a binary-freeResources/(request.http,payload.txt,response.txt,notes.md). - The report —
report/index.html, a single self-contained, offline, accessible (WCAG 2.1 AA) and GDPR-clean "SOC console" dashboard of the findings.
Flags are
PENDING — capture on live VMuntil captured byte-for-byte on the live target. Values are never invented (seeCLAUDE.md,en.subject.txt).
src/
types.ts # the Breach / BonusDeepDive schema (single source of truth)
data.ts # the 14 breaches + bonus + audit metadata
breaches.generated.ts # 12 schema-validated breach objects (typed, re-checked vs Breach)
html.ts # tiny safe HTML templating (escapes payloads → no self-XSS)
render.ts # build-time render: dataset → accessible HTML (works without JS)
charts.ts/icons.ts/theme.ts # dependency-free SVG/CSS charts + inline icons
styles.css # Dark-OLED design system (focus rings, reduced-motion, AA contrast)
enhance.ts # progressive enhancement only (copy / expand / filter)
scripts/build.ts # dataset → report/index.html (font base64-inlined) + {Breach}/ folders
tests/ # Playwright e2e + axe WCAG AA + RGPD (no-network / no-cookies)
bench/bench.ts # measured perf budget (bytes / CLS / zero external requests)
docker/Dockerfile # the single CI image (Node + Playwright browsers)
Makefile # pure-Docker orchestration
Key decisions
- One dataset → both outputs. The folders and the report are generated from
src/data.ts, so they cannot drift (same flags, names, severities). - Build-time render + progressive enhancement. Content is real HTML, so the report is readable offline and without JavaScript;
enhance.tsonly adds copy/expand/filter. Zero CLS. - Self-hosted font. JetBrains Mono is base64-inlined into the single
index.html— no Google Fonts CDN (the pattern German courts ruled a GDPR violation). No network at runtime. - Pure Docker. The host needs only Docker + make. The image provides Node + browsers; deps install into a gitignored
node_modules. - Strict everywhere.
tsconfigenables the full strict set (noUncheckedIndexedAccess,exactOptionalPropertyTypes, …) and ESLint runsstrictTypeChecked. The generated breach data is re-validated against theBreachtype at compile time.
make image # build the CI image (once)
make build # generate report/index.html + the {Breach}/ folders
make typecheck # strict tsc
make lint # eslint strictTypeChecked
make test # Playwright e2e + axe WCAG AA + RGPD
make bench # performance budget (size / CLS / zero network)
make all # typecheck → lint → build → test → benchOpen the report: report/index.html in any browser (no server, no build step, no network).