Locked by default.
A breach in a starter is a breach in every product that ships on top of it. Every defensive default is paid once in the catalog and recovered every time a subscriber ships.
- Content-Security-Policy must
CSP header set by the app's Worker entry; `default-src 'self'`; no `unsafe-inline` scripts in shipping config.
- HSTS must
Strict-Transport-Security set with `max-age=31536000; includeSubDomains` on every response.
- No client-side secrets must
Build output scanned for secret-shaped tokens (`*_SECRET`, `*_KEY`, provider keys). Server-only env vars never reach the bundle.
- Validated boundaries must
Every API request and response is Zod-validated; no `JSON.parse` of remote data without a schema.
- Safe rich-text rendering must
No `dangerouslySetInnerHTML` without a sanitizer (DOMPurify or equivalent); user-supplied markdown rendered through a vetted pipeline.
- Hardened auth cookies must
Auth cookies set `httpOnly`, `Secure`, `SameSite=Lax` (or stricter); never readable from JS.
- Deferred Stripe.js should
Stripe.js (or equivalent payments SDK) is loaded only when checkout initiates, not on every page.
- No high/critical CVEs at ship should
Dependabot or `npm audit` reports zero high or critical advisories at release.
- CSP violation reporting should
CSP `report-to` directive points at a collector so violations in the wild are visible, not silent.