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 #25 in Platform SEO#168 in Technical SEO#226 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 crawlerA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. request — no Web RenderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. Service, no renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. 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 sitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing./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 generatorA build tool that pre-renders every page into static HTML files at deploy time, so the server delivers complete HTML without executing code per request — eliminating JavaScript rendering delays for search engine crawlers. 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 crawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor., rendering, and indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed. 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 SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript.).
  • 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 crawlerA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. 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 browserSitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing.Image 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 VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data. 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 hydrationActivating server-rendered HTML in the browser by attaching JavaScript handlers./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 VitalsWeb Vitals is Google's initiative (launched May 2020) for unified page-experience quality signals. Core Web Vitals — LCP, INP, and CLS — are the subset used in ranking; the rest (TTFB, FCP, TBT, Speed Index) are diagnostic, not ranking factors., 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 tagThe title tag is the HTML title element in a page's head that specifies the document's title. It's the primary source for the SERP title link and a confirmed light ranking factor — but since August 2021 Google doesn't always show it verbatim. — 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 CMSA headless CMS decouples content storage and editing (the backend) from how that content is rendered and delivered (the frontend), serving content over an API instead of a built-in templated 'head'. Its SEO outcomes come almost entirely from how the separate frontend renders pages. 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 SEOHugo SEO is the practice of optimizing sites built with Hugo, the Go-based static site generator. Hugo outputs finished HTML at build time, so content is in the raw HTML on the first fetch — but that alone doesn't guarantee good Core Web Vitals or rankings, and canonicals, taxonomy duplication, and aliases-vs-301s still need hands-on configuration. — Go-powered, zero-JS, blazing builds; the auto-generated sitemap, built-in image processing, and managing huge content sets.
  • Jekyll SEOJekyll SEO is the set of technical and on-page practices for optimizing sites built with Jekyll — the Ruby static site generator that powers GitHub Pages. Jekyll outputs flat HTML with no rendering delay, so the SEO work is configuration: jekyll-seo-tag for metadata, jekyll-sitemap for sitemaps, clean permalinks, and a manual robots.txt. — 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 SEOHexo SEO is the practice of optimizing sites built with Hexo, the Node.js static site generator. Hexo outputs pure static HTML at build time, so content is crawlable on the first fetch — but sitemaps, robots.txt, meta descriptions, canonicals, and structured data all depend on plugins and theme configuration. — the Node blog generator; sitemap/feed plugins, theme JS, and permalink/canonical hygiene.
  • Gatsby SEOGatsby SEO is the set of practices for getting a Gatsby site found and ranked. By default, Gatsby pre-renders HTML at build time (SSG), putting content in the raw HTML on the first fetch — but Gatsby also supports DSG, SSR, and client-only routes that don't all work that way, and it ships a full React bundle, so canonical tags, sitemaps, and Core Web Vitals still need deliberate work. — React-based static generation; the hydration/CWV trade-off, gatsby-plugin-image, gatsby-plugin-sitemap, and build-time data sourcing.
  • Astro SEOAstro SEO is the practice of optimizing sites built with the Astro web framework for search. Astro prerenders to static HTML by default, so content is in the raw HTML on first crawl for that route — no rendering queue — which makes it a strong starting point for SEO, though the default can be overridden per route and doesn't guarantee crawlability or rankings on its own. — 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 SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript. hub.

Add an expert note

Pin an expert quote

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