diff --git a/open-next.config.ts b/open-next.config.ts index fa6cb73..b0354e1 100644 --- a/open-next.config.ts +++ b/open-next.config.ts @@ -1,3 +1,12 @@ import { defineCloudflareConfig } from '@opennextjs/cloudflare'; +import r2IncrementalCache from '@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache'; -export default defineCloudflareConfig({}); +// Without an incrementalCache, OpenNext has nowhere to persist a rendered page, +// so every prerendered route is regenerated from Supabase on EVERY request. +// Measured 2026-08-10 on courses.opengolfapi.org: `x-nextjs-cache: MISS` on six +// consecutive requests, TTFB 3.8-4.1s each, despite the response carrying +// `x-nextjs-prerender: 1` and `s-maxage=3600`. The page was already prerendered; +// there was simply no store to read it back out of. +export default defineCloudflareConfig({ + incrementalCache: r2IncrementalCache, +}); diff --git a/wrangler.toml b/wrangler.toml index a6118a9..1176cf2 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -9,6 +9,13 @@ directory = ".open-next/assets" binding = "ASSETS" run_worker_first = true +# Incremental cache store for OpenNext. The binding name is not arbitrary: +# @opennextjs/cloudflare's r2-incremental-cache override reads exactly +# NEXT_INC_CACHE_R2_BUCKET. +[[r2_buckets]] +binding = "NEXT_INC_CACHE_R2_BUCKET" +bucket_name = "opengolfapi-next-cache" + # Set production secrets via: # wrangler secret put NEXT_PUBLIC_SUPABASE_URL # wrangler secret put NEXT_PUBLIC_SUPABASE_ANON_KEY