Static Site Generators

How Hugo, Jekyll, Eleventy, Hexo, Gatsby, and Astro pre-build every page into static HTML — bypassing Google's JS rendering queue so content is indexable on the first fetch.

First published: Jun 26, 2026 · Last updated: Jul 19, 2026 · Advanced
demand #5 in Platform SEO#53 in Technical SEO#73 on the site
1 evidence signal on this page

A static site generator (SSG) builds every page into finished HTML at build time, so your content is already in the raw HTML before a crawler ever asks for it — no JavaScript rendering queue, no Wave 2 delay, immediately indexable. That's the core SEO advantage over client-side frameworks. Hugo, Jekyll, Eleventy, Hexo, Gatsby, and Astro all share it; they differ in language, how much JS they ship to the browser, and built-in image/sitemap tooling. The one real gotcha is build freshness: a static site is only as current as its last build, so content changes need a rebuild and redeploy to reach search engines. I built this site (and patrickstox.com) with Astro for exactly these reasons.

TL;DR — An SSG pre-renders every route to static HTML at build time, so the content exists in the response before the first crawler request — no Web Rendering Service, no rendering queue, no “Wave 2” delay. That’s the single biggest indexability advantage you can give a site. SSGs differ from CSR frameworks (which build the page in the browser) and from meta-frameworks (which can SSR per request). The six in this cluster — Hugo, Jekyll, Eleventy, Hexo, Gatsby, Astro — all ship static HTML; they vary in language, JS payload, and built-in sitemap/image tooling. The real failure mode isn’t rendering, it’s build freshness: a static site is only as current as its last build, so changed content that doesn’t trigger a rebuild silently serves stale HTML to search engines. I run this site on Astro for exactly this set of trade-offs.

What “static” actually means

A static site generator runs your content and templates through a build step and emits a folder of finished HTML, CSS, and assets. The crucial part for SEO is when the HTML is produced: at build time, once, for everyone — not per request, and not in the browser. Google’s JavaScript guidance describes crawling, rendering, and indexing as distinct processing stages. An SSG removes client-side rendering from the critical path for its generated content because the HTML is already complete. Evidence for this claim Google processes JavaScript through crawling, rendering, and indexing, while pre-rendered HTML is present before client execution. Scope: Google Search JavaScript processing; indexing is not guaranteed. Confidence: high · Verified: Google: JavaScript SEO basics

This is why static sites are the safest possible architecture for getting indexed. The content is in the first byte of the response. There’s no parity gap between raw and rendered HTML, no dependency on the renderer succeeding, no stateless-Chrome quirks to design around.

SSG vs. client-side rendering vs. meta-frameworks

Three architectures, three different moments the HTML comes into existence:

  • Static site generation (SSG). HTML is built once, at build time, before any request. Served as flat files (often from a CDN). Content is in the raw HTML. This is Hugo, Jekyll, Eleventy, Hexo — and Gatsby and Astro in their default static mode.
  • Client-side rendering (CSR). The server sends a minimal shell; JavaScript builds the page in the browser at request/runtime. Content depends on rendering succeeding. This is a default-CSR React or Vue SPA — the riskiest setup for SEO (see JavaScript SEO).
  • Meta-frameworks (SSR / hybrid). Frameworks like Next.js, Nuxt, and SvelteKit can render HTML per request on the server (SSR), pre-render some routes (SSG), or mix both. Content is in the HTML, but produced at request time, which adds server cost and latency you don’t have with a pure SSG.

The line blurs at the edges — Gatsby and Astro are sometimes called meta-frameworks because they’re component-based and can do more than emit flat files. But in their bread-and-butter mode they’re static generators, and that’s how you should treat them for SEO. The mental model that matters: the earlier the HTML exists, the less can go wrong before a crawler sees it. SSG is the earliest.

The six generators, compared

All six produce indexable static HTML. Here’s how they differ on the axes that actually affect an SEO decision:

GeneratorLanguage / built inJS shipped to browserSitemapImage optimizationBest for
HugoGoNone by defaultBuilt-in (sitemap.xml auto-generated)Built-in image processing (resize, WebP)Large content sites that need fast builds
JekyllRubyNone by defaultPlugin (jekyll-sitemap)Plugins (jekyll-picture-tag etc.)GitHub Pages blogs; the original SSG
Eleventy (11ty)JavaScript (Node)None by defaultTemplate/plugin (you generate it)Plugin (@11ty/eleventy-img)JS devs who want zero-JS output and flexibility
HexoJavaScript (Node)None by default (theme-dependent)Plugin (hexo-generator-sitemap)PluginsBlogs, especially in the Node/Asia ecosystem
GatsbyJavaScript / ReactReact bundle (hydrates)Plugin (gatsby-plugin-sitemap)Built-in (gatsby-plugin-image, strong)React teams wanting a data-driven static site
AstroJS/TS, any UI frameworkNone by default (islands only)Official (@astrojs/sitemap)Built-in (astro:assets)Content sites wanting components without the JS tax

A few things worth pulling out of that table:

  • JS payload is the SEO-adjacent differentiator. Hugo, Jekyll, Eleventy, and Hexo ship essentially no JavaScript unless you add it. Gatsby rehydrates a full React bundle on the client — still indexable (the HTML is static), but it carries a Core Web Vitals cost the others don’t. Astro splits the difference with islands architecture: static HTML by default, JavaScript only for the specific interactive components (“islands”) that need it.
  • Build speed scales differently. Hugo (Go) is famously fast and handles tens of thousands of pages comfortably. The Node-based generators are slower at large scale, and Gatsby’s build times have historically been its biggest complaint.
  • Sitemaps and image optimization are mostly solved everywhere — but Hugo and Astro give you the most out of the box, while Jekyll/Eleventy/Hexo lean on (well-maintained) plugins.
  • Gatsby’s release cadence has slowed noticeably. The project isn’t archived and still ships patches, but as of July 2026 its GitHub repo shows only a handful of commits over the trailing 90 days and one minor release since February. That’s worth weighing against a more actively-developed option if you’re picking a generator today, on top of the hydration/CWV cost above.

Why I built this on Astro

I built this site — and patrickstox.com — with Astro, and the reasoning is straight out of this page. I wanted to author in Markdown/MDX with real components, but I did not want to pay the JavaScript tax on every page just to get them. Astro’s default is zero client-side JS: the pages you’re reading ship as static HTML, and the only JavaScript that loads is for the handful of interactive pieces (like the lens tabs and the quiz). That gets me the indexability of a classic SSG and good Core Web Vitals, without giving up a component-based authoring experience. If I needed blistering build speed across a huge content set with zero interactivity, Hugo would be the obvious call; for a React data layer, Gatsby. For this — a content-heavy site with a few interactive flourishes — Astro is the right trade.

The one real gotcha: build freshness

Everything above is the upside. Here’s the catch that bites people.

A static site is only as current as its last build. The HTML is a snapshot frozen at build time. Change a price, correct a fact, publish a post, update a title tag — none of it reaches search engines until you rebuild and redeploy. There’s no live server assembling the page from a database on each request, so there’s nothing to pick up your change automatically. Evidence for this claim Static build output remains a snapshot until the project is rebuilt and redeployed. Scope: Astro static build workflow as a representative example. Confidence: high · Verified: Astro: Build and deploy

In practice this means:

  • Content edits must trigger a build. If you author in a headless CMS or Git, wire up a webhook so a publish kicks off a deploy. A manual-only build process is how stale prices and “ghost” 404s sneak into the index.
  • Frequently-changing data is awkward. Inventory, prices, live counts — if it changes faster than you rebuild, the static copy lags. That’s where incremental builds, scheduled rebuilds, or a hybrid (a meta-framework with SSR/ISR for the volatile routes) earn their keep.
  • Time-sensitive pages need a cadence. If “today’s deals” is baked at build time, the build has to run at least daily, or the page lies.

None of this is a dealbreaker — it’s a discipline. The whole reason SSGs are great for SEO (HTML decided ahead of time) is the same reason you have to be deliberate about re-deciding it when content changes.

Where to go next: the static site generators cluster

This hub is the map. Each generator below is its own deep dive — language, JS payload, sitemap/image tooling, the framework-specific SEO gotchas, and how to keep builds fresh:

  • Hugo SEO — Go-powered, zero-JS, blazing builds; the auto-generated sitemap, built-in image processing, and managing huge content sets.
  • Jekyll SEO — the original SSG and the GitHub Pages default; jekyll-seo-tag, jekyll-sitemap, and the plugin-on-GitHub-Pages limitation.
  • Eleventy (11ty) SEO — JavaScript-based, zero-JS output; generating sitemaps from templates and eleventy-img for responsive images.
  • Hexo SEO — the Node blog generator; sitemap/feed plugins, theme JS, and permalink/canonical hygiene.
  • Gatsby SEO — React-based static generation; the hydration/CWV trade-off, gatsby-plugin-image, gatsby-plugin-sitemap, and build-time data sourcing.
  • Astro SEO — zero-JS by default, islands architecture, @astrojs/sitemap, astro:assets, View Transitions, and Server Islands fallback behavior.

Every topic above is nested under this hub and lives in the sidebar too.

For the broader context — how Google renders JavaScript, the parity and interaction failure modes, and which rendering mode to pick when you do need JS — see the parent JavaScript SEO hub.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin an expert quote first.