v0.12.0Security hardening, product catalog, and status page redesign
Sep 2, 20269 changes
Security hardening, product catalog, and status page redesign
- AddedProduct catalog endpoints — GET /api/v1/products and GET /api/v1/products/{slug} for the Shopify-integrated shop.
- AddedNewsletter confirm and unsubscribe endpoints are now public (no X-Poxyram-Client-Key required) so email links work without credentials.
- ImprovedAPI responses no longer include Sanity-internal fields (_type, _key, _ref) in ContentBlock responses — cleaner payloads for frontend consumers.
- ImprovedSubscriber IDs are now opaque random UUIDs instead of email-derived values — unsubscribe links no longer expose the subscriber's email address.
- ImprovedSecurity hardening across all API routes: host-based auth bypass fixed, input validation enforced on all slug/token/origin parameters, Content-Type validation on POST routes, bot protection (honeypot) on forms, and rate limiting is now fail-closed in production.
- ImprovedContent-Security-Policy and Permissions-Policy headers added to all responses.
- ImprovedStatus page redesigned with 90-day check-level uptime history, degraded partial credit, average latency per service, and a day-by-day incident timeline.
- FixedHealth-check cron endpoint now requires authentication (fail-closed) — previously accepted unauthenticated requests when CRON_SECRET was not configured.
- FixedContact API no longer double-counts checks — GET and POST probes are merged into a single result per day.