diff --git a/README.md b/README.md index 549c9e5..fd8d361 100644 --- a/README.md +++ b/README.md @@ -52,9 +52,9 @@ only where the platform leaves a gap (see [AGENTS.md](AGENTS.md)). > `config/menu.ts` override + branding), the **Ory stack** (Postgres, Kratos + the session→JWT > tokenizer, Keto, Hydra), the **auth** wiring that consumes it (themed sign-in / register / reset / > SSO, the session→JWT hot path, the users/groups/roles admin screens) and **Hydra's login / consent -> / logout handlers** — all driven end-to-end by the Playwright suites. What's left is mainly -> **production & ops hardening** (the prod compose profile, security headers, observability, a -> key-rotation runbook) — tracked in `todo.md` (§9). +> / logout handlers** — all driven end-to-end by the Playwright suites, plus **production & ops +> hardening** (the prod compose profile, response security headers). What's left is mainly +> **observability and a key-rotation runbook** — tracked in `todo.md` (§9). ## The MVP — "clone, one command, hack on a plugin" @@ -578,6 +578,14 @@ Before going live, supply the production secrets and any SSO credentials — the manual prep ([What you must supply](#what-you-must-supply-the-only-manual-prep)); the rest is auto-generated. +Every response carries security headers (`src/security-headers.ts`, set once per request): a +strict `Content-Security-Policy` (the core is **zero-JS** — `script-src 'self'`, no inline +scripts, so an injected `