→HTTP headers in `next.config.mjs`: CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, Cross-Origin-Opener-Policy (`same-origin`), Cross-Origin-Resource-Policy (`same-origin`). Framework fingerprinting suppressed via `poweredByHeader: false`.
→Row Level Security (RLS) enabled on all Supabase tables. `project_assets` restricted to published-project assets only — draft assets are not exposed via the anon key.
→Rate-limiting via Upstash Redis (sliding window) on sensitive endpoints: contact (5 req/10 min), testimonials (3 req/24h), cache invalidation (10 req/min), health check (30 req/min), CSP reports (20 req/min), admin panel (10 req/5 min — brute-force protection). When Redis is unavailable, the limiter fails closed in production.
→Honeypot fields on contact and testimonial forms — bots filling hidden fields receive a silent 200 response.
→Origin validation: API requests from unknown origins are rejected in production.
→Debug routes disabled in production: `/api/redis-test` returns 404 outside of development mode.
→CORS restricted: `/api/health` scoped to the site origin only — monitoring tools call server-to-server, no browser CORS needed.
→security.txt at `/.well-known/security.txt` (RFC 9116) — responsible disclosure contact.
→No secrets in `NEXT_PUBLIC_*` — all sensitive keys (service role, Redis token, admin credentials) remain strictly server-side.