Static Site Generation vs. Server-Side Rendering – edge CDN compared to server rack

    SSR or Pre-Rendering? What We Evaluated for Mykeythai vs. Our Default Approach

    17. Mai 20265 min read
    Till Freitag

    TL;DR: „For a villa platform like Mykeythai, pre-rendering remains the right default. Use SSR only where it truly needs to be dynamic – availability, inquiries, agent portal."

    — Till Freitag

    Context: On May 13th, Lovable released Discoverability – including real server-side rendering via TanStack Start. Right after, we sat down with the Mykeythai team and asked: do we switch? Here's the answer.

    The Starting Point

    Mykeythai is a curated villa platform for Thailand: villa detail pages, destination hubs, things-to-do, a journal, SEO landing pages, agent PDFs. A classic content-heavy travel setup with selective dynamics (availability, inquiries, pricing).

    So far the site runs – like all our builds – on our Playwright SSG pipeline: React SPA, rendered to static HTML per route at build time, JSON-LD and meta tags injected, deployed to the edge network.

    With the Lovable release, a real SSR path suddenly became available. So: evaluate.

    The Quick Comparison

    Pre-Rendering / SSG Server-Side Rendering (SSR)
    Speed Very fast Often slower
    Hosting cost Low Higher
    Scaling Easy More complex
    SEO Very good Very good
    Core Web Vitals Usually better More variable
    Dynamic content Worse Excellent
    Cacheability Excellent More complex
    Failure modes Few More
    TTFB Very low Higher
    Hydration issues Fewer More common

    On paper this looks like a clear-cut decision. In practice it depends entirely on the use case.

    Why Mykeythai Is SSG-Friendly

    Let's look at what makes the site:

    • Villa detail pages – change maybe weekly
    • Journal articles – one publish event per piece
    • Destination hubs – curated content, rarely updated
    • Things-to-do – editorially maintained
    • Areas / regions – static content
    • SEO landing pages – optimized for search intent, stable
    • About / Brand – changes quarterly

    This is textbook content for pre-rendering. Content doesn't change by the second, SEO and performance matter more than real-time data, every single page has a clear URL and a clear search intent.

    That's exactly why references like Plum Guide, Le Collectionist or Airbnb's SEO landing pages feel so fast: aggressive static rendering plus a global CDN. Nobody renders a villa detail page live on a Node server when the content is identical 99% of the time.

    Where SSR Still Makes Sense

    There are areas where static rendering isn't enough:

    • Authenticated dashboards – different per user
    • Personalized content – e.g. "Recommended for you"
    • Live availability – calendars, booking slots
    • Search & filter with many combinations
    • Dynamic pricing – season, occupancy, promotion
    • User-specific data – agent portals, saved favorites

    For Mykeythai this concretely means: availability calendar, inquiry forms, pricing requests, agent portal, search/filter, possibly live weather data.

    The Architecture We Chose

    Instead of "all SSR" or "all SSG", we split the site into two zones:

    Pre-Rendered (SSG)

    /                       → Home
    /villas/[slug]          → Villa Detail
    /journal/[slug]         → Journal articles
    /destinations/[slug]    → Destination hubs
    /things-to-do/[slug]    → Activities
    /areas/[slug]           → Regions
    /lp/[slug]              → SEO landing pages
    /agents/pdf/[id]        → Agent PDFs
    /about, /brand          → Brand pages

    → Build-time rendering, JSON-LD injected, delivered from the edge. TTFB < 50ms globally.

    Dynamic (SSR / Edge Functions / Client)

    /api/availability       → Calendar, edge function
    /api/inquiry            → Inquiry form, serverless
    /api/pricing            → Pricing request, edge
    /agent/portal/*         → SSR (auth-gated)
    /search                 → Client-side against edge search

    → Only these routes need a live server. The rest stays static.

    This is the dynamic islands logic: 95% of the site is static, small interactive islands (calendar, pricing box) fetch their data client-side. No reason to SSR-render an entire villa detail page just because there's an availability calendar at the bottom.

    The Typical Mistake in the Lovable/Vercel/Supabase Stack

    In audits we regularly see the same pattern: projects render way too much via SSR. The symptoms are always the same:

    • higher TTFB
    • white screens on load
    • duplicate requests (SSR + client refetch)
    • "page disappears and reloads" after hydration
    • inconsistent Cache-Control headers
    • worse Lighthouse scores despite strong hardware

    This matches observations the Mykeythai team had already made on other platforms: temporary white screen, reload, inconsistent caching headers. Classic symptoms of SSR + client hydration mismatches, unnecessary runtime requests, or streaming/edge mismatches.

    With the Lovable release, SSR is now easy to enable – but that doesn't make it the right choice automatically.

    Why This Matters for GEO / AI Search Too

    LLMs and AI crawlers (ChatGPT, Perplexity, Claude, Google AI Overviews) prefer stable, fast, immediately available HTML content. They don't wait for hydration. They don't follow useEffect chains. They see what's in the first response.

    Pre-rendering is structurally favored here: complete HTML, deterministic, with JSON-LD in <head>. Exactly what we treat as the default in our SEO master strategy and what we describe in detail in the Vibe Coding SEO guide.

    The Decision for Mykeythai

    We stick with the pre-rendering default and add selectively:

    1. All content routes stay on Playwright SSG (unchanged)
    2. Availability / pricing as edge functions called client-side
    3. Agent portal as an isolated SSR route (auth-gated, separate bundle)
    4. Search client-side against an edge search index (Typesense / Algolia / Cloudflare)

    This keeps Core Web Vitals high, hosting costs low, and crawler output clean – without giving up dynamic features where they're actually needed.

    Takeaways for Other Projects

    • SSR is not an upgrade. It's a trade-off. More dynamism, more complexity, higher cost, more failure modes.
    • The default should be SSG. Only add SSR when a concrete use case breaks static rendering.
    • Think in zones, not in "the whole app". Most pages are 95% static.
    • Lovable makes both easy. The release is great – but you still have to make the architecture decision yourself.

    If you're facing the same question right now: we'll show the pipeline live at TokenMade in Hamburg – including the Mykeythai architecture as a case.

    👉 Free SEO audit for your Vibe Coding app →

    TeilenLinkedInWhatsAppE-Mail

    Related Articles

    Lovable app with structured HTML, visible to Google, ChatGPT and Perplexity
    May 13, 20267 min

    Lovable SEO/AEO: Every App Discoverable by Google and ChatGPT From Day 1

    Lovable ships server-side rendering, pre-rendering for existing apps, Semrush directly in the builder chat, and an on-de…

    Read more
    Prerendering pipeline visualization: SPA, Playwright, Schema.org and edge deploy
    April 29, 20263 min

    Prerendering: How to Turn a React SPA Into a Google-Friendly Site

    React SPAs are invisible to crawlers. Prerendering fixes that – without Next.js, without an SSR server. How our Playwrig…

    Read more
    GPTBot, ClaudeBot and PerplexityBot reading static HTML from an edge server – log evidence visualization
    May 17, 20265 min

    GPTBot, ClaudeBot, PerplexityBot: What AI Crawlers Really See With Prerendering

    We analyzed three months of edge logs: who actually crawls, who executes JavaScript, and who relies entirely on the HTML…

    Read more
    Rocket made of code elements launching through search result pages with Lighthouse Score 100
    April 14, 20266 min

    Vibe Coding & SEO: Why AI-Generated Apps Stay Invisible – And How We Fix It

    Lovable, Bolt, v0 – Vibe Coding tools produce SPAs that Google can't see. Our playbook makes them SEO-ready: SSG, Schema…

    Read more
    AI Website Builder Comparison – Framer, Webflow AI, Wix AI, Durable, and Lovable Stack SEO test
    April 10, 20266 min

    AI Website Builder Compared: Framer vs. Webflow AI vs. Wix AI vs. Durable vs. Lovable Stack

    Five ways to build a website compared on SEO: Framer, Webflow AI, Wix AI, Durable – and the Lovable + GitHub + Vercel st…

    Read more
    Headless browser rendering SPA pages as static HTML for search engines
    April 14, 20266 min

    Playwright SSG Tutorial: How to Make Lovable Apps Visible to Google

    SPAs are invisible to search engines. With Playwright, you can render any Lovable app into static HTML – automated, on e…

    Read more
    Evolution of web architecture from static sites to edge-first cloud
    April 4, 20264 min

    Jamstack 2026: Dead, Alive, or Transformed?

    Nobody talks about Jamstack anymore. But its principles are everywhere – just under different names. A status check: wha…

    Read more
    Lovable Cloud vs Supabase comparison – pink cloud with heart versus green Supabase database
    March 4, 20264 min

    Lovable Cloud vs. Supabase – Why We (Almost) Always Use Supabase Directly

    Lovable Cloud is built on Supabase – but when does using Supabase directly make more sense? We explain why we almost alw…

    Read more
    Cambrian explosion of vibe coding tools – many tools, six categories
    April 8, 20267 min

    The Vibe Coding Explosion: 138 Tools – and Why Only 7 Categories Matter

    138+ vibe coding tools on the market – and more every week. We sort the chaos into 7 categories and analyze which ones w…

    Read more