Released: June 11, 2026
Config-level performance pass from the 2026-06-11 audit (devnotes/audits/2026-06-11.md): cut Sentry trace/telemetry overhead, restored ISR on /talks, protected the spread-reading route from Vercel's 10s timeout, and deduplicated detail-page database queries. Zero functionality changes.
- Sentry sampling reduced — client traces 100% → 10%, server/edge 100% → 20%. Errors are still always captured; session replay stays at 10% sampling + 100% on errors.
- Sentry tunnelRoute removed — browser telemetry now goes directly to sentry.io instead of routing through
/monitoringon our own Vercel functions (saves one function invocation per event). /talksback on ISR — removedforce-dynamicthat was cancellingrevalidate = 3600; the listing now serves from CDN cache like/cardsand/themes. Admin edits still bust the cache via existingrevalidatePath('/talks')calls.- Spread-reading timeout protection — added
maxDuration = 60to the one heavy route that lacked it (4 sequential Gemini/YouTube calls vs the 10s Hobby default). - Detail-query dedup —
getCardWithMappingsandgetTalkWithMappedCardswrapped in Reactcache(), halving DB roundtrips per card/talk detail render (generateMetadata+ page were each running the same queries).
devnotes/audits/2026-06-11.md- Performance audit report (P1-P10 ranked findings; P5-P10 remain open)
instrumentation-client.ts- tracesSampleRate 1 → 0.1sentry.server.config.ts- tracesSampleRate 1 → 0.2sentry.edge.config.ts- tracesSampleRate 1 → 0.2next.config.ts- removedtunnelRoute: "/monitoring"app/talks/page.tsx- removedexport const dynamic = 'force-dynamic'app/api/spreads/spread-reading/route.ts- addedexport const maxDuration = 60lib/db/queries/cards.ts-getCardWithMappingswrapped in Reactcache()lib/db/queries/talks.ts-getTalkWithMappedCardswrapped in Reactcache()
- Vercel build succeeded, including the
/talksprerender step (deploy confirmed) -
curl -sI https://tarottalks.app/talkstwice — second response showsx-vercel-cache: HIT - No
/monitoringreferences in page payload; devtools shows Sentry events going to*.ingest.us.sentry.iodirectly - Hit
https://tarottalks.app/api/sentry-example-api— error appears in Sentry dashboard (capture survived sampling change) - Vercel dashboard → Functions:
api/spreads/spread-readingshows 60s max duration - Complete a live 3-card spread reading on https://tarottalks.app — full reading, no timeout
- Card + talk detail pages unchanged: correct
<title>, og:image meta, mappings render -
/api/admin/healthOK; admin-diagnostics script all green - Within 24–48h: Sentry tracing ingest volume drops ~80–90%;
/monitoringinvocations go to zero
- If
/talksever fails at build-time prerender (the original reason forforce-dynamic), re-addexport const dynamic = 'force-dynamic';toapp/talks/page.tsxand redeploy. All other changes stand alone.