a34a47fe22
"Gathering the good news…" waits on the home's startup API calls, which were all DYNAMIC → a round-trip to the residential origin every load (the occasional 2-3s linger). These responses depend only on the URL, never the session, so they're safe to share at the edge: - /api/moods, /api/categories (static config) → public, s-maxage=900 - /api/lanes, /api/families (global, data-derived counts) → public, s-maxage=120 - /api/feed → public, s-maxage=45 ONLY when shareable (no following / prefs / exclude); the following feed (reads the session) and personal filters stay private, no-store. Hard personalization boundary, explicit per-endpoint (no blanket /api/* rule). Pairs with a Cloudflare cache rule (added separately) making these paths eligible. Tests assert the global endpoints are public+s-maxage and the feed boundary (default/topic public; following/prefs/exclude private). 227 pytest. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>