devto 2026-07-04 원문 보기 ↗
I recently launched OYNAVA, a free HTML5 game portal with 6,000+ games. Here's the architecture, the cost traps I hit in production, and how I fixed them. If you're building a content-heavy site, a few of these will probably bite you too.
My i18n read the locale from headers(), which forced every page to render dynamically (ƒ). Every request hit the origin, and Vercel's "Fast Origin Transfer" quota (10 GB) filled in days.
Fix: make content pages static/ISR with export const revalidate = 3600 + generateStaticParams, and move locale to URL prefixes with client-side chrome translation. Origin transfer dropped to almost zero.
Every game card fetched its like-count individually — ~180 requests on a single homepage view. That maxed out serverless CPU.
Fix: an 80 ms client-side batcher that collapses them into one /api/likes/batch call. Then I went further and removed live counts from cards completely — they only matter on the detail page.
Two things bit me at once:
noeviction, writes were rejected but reads looked fine — so likes "worked" in dev and silently failed in prod.Fix: TTLs on cache keys (a translation cache was the culprit), plus an admin cleanup endpoint. Lesson: always give cache keys a TTL.
/en-iyi-araba-oyunlari, /ates-ve-su-oyunlari …)noindex for thin onesVideoGame / FAQPage / ItemList JSON-LD everywhereAfter I reverted server-side translation, all locale URLs served identical Turkish content — but I was still emitting hreflang for 8 languages. Google discovered 8× duplicate URLs and wasted crawl budget on them instead of indexing the real pages. Removing hreflang (canonical only) refocused the crawler.
The site is a PWA (manifest + service worker), packaged as a TWA with PWABuilder and shipped to Google Play. One codebase, and web deploys update the app instantly — no store release needed.
If you want to poke at the result, it's live at oynava.com. Happy to answer questions about any of these in the comments. 🎮