[{"data":1,"prerenderedAt":1123},["ShallowReactive",2],{"hub:guides-how-to":3},{"path":4,"key":5,"title":6,"h1":7,"description":8,"crumbs":9,"blocks":18},"\u002Fguides\u002Fhow-to\u002F","guides-how-to","How-To Guides for Static Sites in Production","How-to guides","Step-by-step guides for building, speeding up and shipping static sites, each with the configuration used and the measured result, grouped by topic.",[10,13,16],[11,12],"Home","\u002F",[14,15],"Guides","\u002Fguides\u002F",[17,4],"How-tos",[19,22,24,27,55,57,76,115,154,185,212,263,290,329,360,407,438,453,480,523,550,565,567,602,633,664,703,738,781,816,855,890,925,960,1003,1050,1077,1108],{"k":20,"text":21},"p","Most of the site is how-tos, and they share one rule: a guide ends with a number. Configuration alone is cheap to publish and easy to get subtly wrong, so every how-to here shows the setup it was measured on, what changed, and by how much — a versioned Docusaurus build that went from 1 min 50 s to 58 s, a mobile LCP that moved from 2.9 to 1.7 seconds after a migration, a Hugo cold build cut from 131 to 34 seconds.",{"k":20,"text":23},"They are grouped below by topic, in the same order as the sections of the site, so tasks that belong together sit together: caching the build, then deploying only what changed, then rolling back when it goes wrong. Each entry carries its one-line summary so you can tell two similar-looking guides apart before you open either.",{"k":25,"html":26},"fig","\u003Cfigure>\n\u003Csvg viewBox=\"0 0 760 466\" role=\"img\" aria-labelledby=\"hub-how-to-hero-title hub-how-to-hero-desc\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\">\n  \u003Ctitle id=\"hub-how-to-hero-title\">The structure shared by the how-to guides\u003C\u002Ftitle>\n  \u003Cdesc id=\"hub-how-to-hero-desc\">Five layers from top to bottom. Context states the task and who it is for. Prerequisites list what must already be in place. The recipe gives the configuration and commands. Measured impact reports before and after numbers. Pitfalls and rollback say what goes wrong and how to undo it.\u003C\u002Fdesc>\n  \u003Crect x=\"0\" y=\"0\" width=\"760\" height=\"466\" fill=\"#ffffff\"\u002F>\n  \u003Cg style=\"font-family:system-ui, sans-serif;font-size:12px\">\n    \u003Crect x=\"40.0\" y=\"60.0\" width=\"440.0\" height=\"57.2\" rx=\"8\" fill=\"#f8fafc\" stroke=\"#d9e2ef\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Cpath d=\"M260.0 119.2 L260.0 139.2\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:2px;marker-end:url(#hub-how-to-hero-arrow)\"\u002F>\n    \u003Crect x=\"40.0\" y=\"143.2\" width=\"440.0\" height=\"57.2\" rx=\"8\" fill=\"#6a4c93\" opacity=\"0.14\" stroke=\"#6a4c93\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Cpath d=\"M260.0 202.4 L260.0 222.4\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:2px;marker-end:url(#hub-how-to-hero-arrow)\"\u002F>\n    \u003Crect x=\"40.0\" y=\"226.4\" width=\"440.0\" height=\"57.2\" rx=\"8\" fill=\"#1982c4\" opacity=\"0.14\" stroke=\"#1982c4\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Cpath d=\"M260.0 285.6 L260.0 305.6\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:2px;marker-end:url(#hub-how-to-hero-arrow)\"\u002F>\n    \u003Crect x=\"40.0\" y=\"309.6\" width=\"440.0\" height=\"57.2\" rx=\"8\" fill=\"#8ac926\" opacity=\"0.2\" stroke=\"#5a8a16\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Cpath d=\"M260.0 368.8 L260.0 388.8\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:2px;marker-end:url(#hub-how-to-hero-arrow)\"\u002F>\n    \u003Crect x=\"40.0\" y=\"392.8\" width=\"440.0\" height=\"57.2\" rx=\"8\" fill=\"#ffca3a\" opacity=\"0.24\" stroke=\"#a97b00\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Ctext x=\"380.0\" y=\"30.0\" fill=\"#1f2937\" style=\"font-size:16px;text-anchor:middle;font-weight:700\">What every how-to contains\u003C\u002Ftext>\n    \u003Ctext x=\"260.0\" y=\"86.4\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Context\u003C\u002Ftext>\n    \u003Ctext x=\"260.0\" y=\"103.3\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">the task and the site it was done on\u003C\u002Ftext>\n    \u003Ctext x=\"504.0\" y=\"92.6\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:start\">real site, real sizes\u003C\u002Ftext>\n    \u003Ctext x=\"260.0\" y=\"169.5\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Prerequisites\u003C\u002Ftext>\n    \u003Ctext x=\"260.0\" y=\"186.4\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">versions and access needed\u003C\u002Ftext>\n    \u003Ctext x=\"504.0\" y=\"175.8\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:start\">pinned versions\u003C\u002Ftext>\n    \u003Ctext x=\"260.0\" y=\"252.7\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Recipe\u003C\u002Ftext>\n    \u003Ctext x=\"260.0\" y=\"269.6\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">configuration and commands\u003C\u002Ftext>\n    \u003Ctext x=\"504.0\" y=\"259.0\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:start\">copyable, complete\u003C\u002Ftext>\n    \u003Ctext x=\"260.0\" y=\"335.9\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Measured impact\u003C\u002Ftext>\n    \u003Ctext x=\"260.0\" y=\"352.8\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">before and after numbers\u003C\u002Ftext>\n    \u003Ctext x=\"504.0\" y=\"342.2\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:start\">tool named for each\u003C\u002Ftext>\n    \u003Ctext x=\"260.0\" y=\"419.1\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Pitfalls and rollback\u003C\u002Ftext>\n    \u003Ctext x=\"260.0\" y=\"436.0\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">what breaks, how to undo\u003C\u002Ftext>\n    \u003Ctext x=\"504.0\" y=\"425.4\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:start\">every change reversible\u003C\u002Ftext>\n  \u003C\u002Fg>\n  \u003Cdefs>\n    \u003Cmarker id=\"hub-how-to-hero-arrow\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\n      \u003Cpath d=\"M0 0 L10 5 L0 10 z\" fill=\"#556071\"\u002F>\n    \u003C\u002Fmarker>\n  \u003C\u002Fdefs>\n\u003C\u002Fsvg>\n\u003Cfigcaption>The measured-impact table is the part that distinguishes a guide here from a snippet elsewhere.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>",{"k":28,"h":29,"items":30},"group","Accessibility for Static Sites",[31,35,39,43,47,51],{"t":32,"u":33,"d":34},"Accessible Code Blocks in Documentation Sites","\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Faccessible-code-blocks-in-documentation-sites\u002F","Make highlighted code blocks keyboard-scrollable, readable at AA contrast in both themes and labelled for screen readers, using Shiki, Prism or Hugo Chroma.",{"t":36,"u":37,"d":38},"Accessible Dark Mode Toggles for Static Sites","\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Faccessible-dark-mode-toggles-for-static-sites\u002F","Build a theme toggle for a static site that follows the OS setting, has a real name and state, avoids a flash of the wrong theme and keeps AA contrast in both.",{"t":40,"u":41,"d":42},"Accessible SVG Diagrams on Static Sites","\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Faccessible-svg-diagrams-on-static-sites\u002F","Give inline SVG diagrams a name, a useful description and a text alternative, keep labels readable in both themes, and check all of it at build time.",{"t":44,"u":45,"d":46},"Enforcing Alt Text for Markdown Images at Build Time","\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Fenforcing-alt-text-for-markdown-images-at-build-time\u002F","Fail a static site build when Markdown images have missing, placeholder or file-name alt text, with remark and markdown-it plugins and a sensible escape hatch.",{"t":48,"u":49,"d":50},"Keyboard Navigation and Focus Order on Static Sites","\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Fkeyboard-navigation-and-focus-order-on-static-sites\u002F","Make every link, menu and widget on a static site reachable by keyboard, with a visible focus ring and a tab order that follows the page.",{"t":52,"u":53,"d":54},"Skip Links and Landmarks in SSG Layouts","\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Fskip-links-and-landmarks-in-ssg-layouts\u002F","Add a working skip link and a complete set of landmark regions to Astro, Eleventy, Hugo and Jekyll layouts, then test them with axe and a screen reader.",{"k":25,"html":56},"\u003Cfigure>\n\u003Csvg viewBox=\"0 0 760 346\" role=\"img\" aria-labelledby=\"hub-how-to-topics-title hub-how-to-topics-desc\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\">\n  \u003Ctitle id=\"hub-how-to-topics-title\">Number of how-tos per topic, largest first\u003C\u002Ftitle>\n  \u003Cdesc id=\"hub-how-to-topics-desc\">Horizontal bars. Migrating Between Static Site Generators 12, CDN Caching Rules for SSGs 11, Self-Hosting Static Sites on S3, Nginx and Caddy 11, Image Optimization Pipelines in Astro 10, GitHub Actions for Automated SSG Builds 10, Security Headers and Hardening for Static Sites 10, Docs Frameworks: Docusaurus, Starlight and VitePress 9 and Hugo Build Times for Large Repositories 9.\u003C\u002Fdesc>\n  \u003Crect x=\"0\" y=\"0\" width=\"760\" height=\"346\" fill=\"#ffffff\"\u002F>\n  \u003Cg style=\"font-family:system-ui, sans-serif;font-size:12px\">\n    \u003Crect x=\"350.0\" y=\"65.0\" width=\"357.2\" height=\"20.0\" rx=\"3\" fill=\"#1982c4\" opacity=\"0.3\" stroke=\"#1982c4\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"99.0\" width=\"327.4\" height=\"20.0\" rx=\"3\" fill=\"#1982c4\" opacity=\"0.3\" stroke=\"#1982c4\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"133.0\" width=\"327.4\" height=\"20.0\" rx=\"3\" fill=\"#1982c4\" opacity=\"0.3\" stroke=\"#1982c4\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"167.0\" width=\"297.7\" height=\"20.0\" rx=\"3\" fill=\"#1982c4\" opacity=\"0.3\" stroke=\"#1982c4\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"201.0\" width=\"297.7\" height=\"20.0\" rx=\"3\" fill=\"#1982c4\" opacity=\"0.3\" stroke=\"#1982c4\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"235.0\" width=\"297.7\" height=\"20.0\" rx=\"3\" fill=\"#1982c4\" opacity=\"0.3\" stroke=\"#1982c4\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"269.0\" width=\"267.9\" height=\"20.0\" rx=\"3\" fill=\"#1982c4\" opacity=\"0.3\" stroke=\"#1982c4\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"303.0\" width=\"267.9\" height=\"20.0\" rx=\"3\" fill=\"#1982c4\" opacity=\"0.3\" stroke=\"#1982c4\" style=\"stroke-width:1px\"\u002F>\n    \u003Cpath d=\"M350.0 60.0 L350.0 328.0\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Ctext x=\"380.0\" y=\"30.0\" fill=\"#1f2937\" style=\"font-size:16px;text-anchor:middle;font-weight:700\">Topics with the most how-tos\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"79.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Migrating Between Static Site Generators\u003C\u002Ftext>\n    \u003Ctext x=\"715.2\" y=\"79.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">12\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"113.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">CDN Caching Rules\u003C\u002Ftext>\n    \u003Ctext x=\"685.4\" y=\"113.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">11\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"147.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Self-Hosting Static Sites on S3, Nginx…\u003C\u002Ftext>\n    \u003Ctext x=\"685.4\" y=\"147.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">11\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"181.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Image Optimization Pipelines in Astro\u003C\u002Ftext>\n    \u003Ctext x=\"655.7\" y=\"181.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">10\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"215.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">GitHub Actions for Automated SSG Builds\u003C\u002Ftext>\n    \u003Ctext x=\"655.7\" y=\"215.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">10\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"249.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Security Headers and Hardening\u003C\u002Ftext>\n    \u003Ctext x=\"655.7\" y=\"249.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">10\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"283.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Docs Frameworks: Docusaurus, Starlight…\u003C\u002Ftext>\n    \u003Ctext x=\"625.9\" y=\"283.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">9\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"317.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Hugo Build Times for Large Repositories\u003C\u002Ftext>\n    \u003Ctext x=\"625.9\" y=\"317.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">9\u003C\u002Ftext>\n  \u003C\u002Fg>\n\u003C\u002Fsvg>\n\u003Cfigcaption>The 8 topics with the most how-tos, out of 32 topics that have any.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>",{"k":28,"h":58,"items":59},"Astro vs Eleventy for Documentation Sites",[60,64,68,72],{"t":61,"u":62,"d":63},"Loading Remote Content With Astro Content Layer Loaders","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Floading-remote-content-with-astro-content-layer-loaders\u002F","Pull content from an API or CMS into Astro collections with a custom content layer loader, cache it between builds with digests, and validate it with a schema.",{"t":65,"u":66,"d":67},"Sidebar Navigation in Astro and Eleventy","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fsidebar-navigation-in-astro-and-eleventy\u002F","Build a docs sidebar from content in Astro and Eleventy: ordering, nesting, active state, collapsed sections, page weight, and keeping incremental builds fast.",{"t":69,"u":70,"d":71},"Syntax Highlighting with Shiki in Astro and Eleventy","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fsyntax-highlighting-with-shiki-in-astro-and-eleventy\u002F","Highlight code at build time with Shiki in Astro and Eleventy: dual light and dark themes, line annotations, build-time cost and zero runtime JavaScript.",{"t":73,"u":74,"d":75},"Upgrading Eleventy 2 to 3 With ESM Configuration","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fupgrading-eleventy-2-to-3-with-esm-configuration\u002F","Upgrade an Eleventy 2 site to Eleventy 3, convert config and data files to ESM, fix plugin and filter breakage, and diff the output against the old build.",{"k":28,"h":77,"items":78},"Docs Frameworks: Docusaurus, Starlight and VitePress",[79,83,87,91,95,99,103,107,111],{"t":80,"u":81,"d":82},"Adding Local Search to a VitePress Site","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fadding-local-search-to-a-vitepress-site\u002F","Turn on VitePress's built-in local search, tune what it indexes and how it ranks, keep the index small on large docs, and measure its cost to the page.",{"t":84,"u":85,"d":86},"Customizing Starlight Without Forking the Theme","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fcustomizing-starlight-without-forking-the-theme\u002F","Brand a Starlight docs site with CSS custom properties, component overrides and plugins so every upgrade stays a one-line version bump instead of a merge.",{"t":88,"u":89,"d":90},"Generating API Reference Pages in Starlight From OpenAPI","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fgenerating-api-reference-pages-in-starlight-from-openapi\u002F","Build REST API reference pages in Starlight from an OpenAPI spec at build time, link them with the guides, validate the spec in CI and keep pages fast.",{"t":92,"u":93,"d":94},"Internationalizing Starlight Docs","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Finternationalizing-starlight-docs\u002F","Add languages to a Starlight documentation site: locales config, translated UI strings, sidebar labels, fallback notices, per-locale search and build cost.",{"t":96,"u":97,"d":98},"Migrating MkDocs Documentation to VitePress","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmigrating-mkdocs-documentation-to-vitepress\u002F","Move an MkDocs Material site to VitePress: convert admonitions, tabs and nav, keep every URL working, and compare build time and page weight after.",{"t":100,"u":101,"d":102},"Migrating from MkDocs to Starlight","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmigrating-from-mkdocs-to-starlight\u002F","Move a Material for MkDocs site to Starlight: convert admonitions and tabs, rebuild navigation from mkdocs.yml, keep every URL and cut build time by two thirds.",{"t":104,"u":105,"d":106},"Speeding Up Docusaurus Builds With Rspack","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fspeeding-up-docusaurus-builds-with-rspack\u002F","Enable Docusaurus Faster (Rspack, SWC and Lightning CSS) on a large docs site, fix the plugins that break, and measure build time and memory before and after.",{"t":108,"u":109,"d":110},"Versioned Documentation with Docusaurus","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fversioned-documentation-with-docusaurus\u002F","Cut a Docusaurus docs version, keep builds fast as versions pile up, archive old versions to static snapshots and route readers to the right one.",{"t":112,"u":113,"d":114},"Versioning VitePress Documentation Without a Plugin","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fversioning-vitepress-documentation-without-a-plugin\u002F","Publish several versions of VitePress docs side by side using git branches, a version switcher and one deploy, with canonicals pointing at the latest.",{"k":28,"h":116,"items":117},"Hugo Build Times for Large Repositories",[118,122,126,130,134,138,142,146,150],{"t":119,"u":120,"d":121},"How to Benchmark Hugo vs Astro Build Speeds","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fhow-to-benchmark-hugo-vs-astro-build-speeds\u002F","Build a reproducible Hugo-vs-Astro benchmark with hyperfine — identical corpus, pinned containers, production builds only — so numbers reflect the generators, not your laptop.",{"t":123,"u":124,"d":125},"Hugo Image Processing Cache in CI","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fhugo-image-processing-cache-in-ci\u002F","Persist Hugo’s resources cache between CI runs so image resizing and format conversion only run for new images, and keep the cache from growing forever.",{"t":127,"u":128,"d":129},"Hugo Modules and Dependency Caching","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fhugo-modules-and-dependency-caching\u002F","Use Hugo Modules for themes and shared content, vendor or cache them in CI, pin versions with go.sum, and cut module download time from Hugo builds.",{"t":131,"u":132,"d":133},"Hugo partialCached for Faster Builds","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fhugo-partialcached-for-faster-builds\u002F","Find the partials that dominate a Hugo build with template metrics, cache them with partialCached and the right variant keys, and avoid stale output.",{"t":135,"u":136,"d":137},"Parallel Hugo Builds Across CI Jobs","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fparallel-hugo-builds-across-ci-jobs\u002F","Split a very large Hugo site into segments built in parallel CI jobs, merge the output safely, and measure when parallel builds beat a single larger runner.",{"t":139,"u":140,"d":141},"Profiling Hugo Templates With Template Metrics","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fprofiling-hugo-templates-with-template-metrics\u002F","Use hugo --templateMetrics to find which partial is eating your build: read cumulative duration, spot cache misses, and cut a 41 s build to 6 s on 4,000 pages.",{"t":143,"u":144,"d":145},"Sharing a Theme Across Hugo Sites With Modules","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fsharing-a-theme-across-hugo-sites-with-modules\u002F","Move a theme copied into several Hugo sites into one versioned Hugo Module, let sites override safely, roll out updates with Renovate and keep CI fast.",{"t":147,"u":148,"d":149},"Speeding Up Hugo Builds with Render Hooks & Caching","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fspeeding-up-hugo-builds-with-render-hooks-and-caching\u002F","Cut Hugo build time with render hooks, partialCached, a persistent --cacheDir, and the image resource cache — with measured before\u002Fafter seconds from hyperfine.",{"t":151,"u":152,"d":153},"Splitting Large Hugo Sites with Segments","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fsplitting-large-hugo-sites-with-segments\u002F","Use Hugo segments to render only part of a very large site, build sections in parallel CI jobs, and merge the output without breaking links or sitemaps.",{"k":28,"h":155,"items":156},"Internationalization for Static Sites",[157,161,165,169,173,177,181],{"t":158,"u":159,"d":160},"Language Detection and Redirects at the Edge","\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Flanguage-detection-and-redirects-at-the-edge\u002F","Redirect first-time visitors to their language with a Cloudflare Worker on the root URL only, honour a saved choice and keep crawlers and shared links intact.",{"t":162,"u":163,"d":164},"Multilingual Eleventy Sites With the i18n Plugin","\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fmultilingual-eleventy-sites-with-the-i18n-plugin\u002F","Build a multilingual Eleventy site with the official i18n plugin: per-language folders, locale-aware links and dates, translated strings and a switcher.",{"t":166,"u":167,"d":168},"Multilingual Sites with Hugo","\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fmultilingual-sites-with-hugo\u002F","Build a multilingual Hugo site: per-language content directories, translated menus and string tables, translationKey linking and build-time checks per locale.",{"t":170,"u":171,"d":172},"Right-to-Left Layouts on Static Sites","\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fright-to-left-layouts-on-static-sites\u002F","Add Arabic or Hebrew to a static site: dir and lang per locale, logical CSS properties, mirrored icons, LTR code blocks and fonts that keep LCP in budget.",{"t":174,"u":175,"d":176},"Translation Workflows with Git and Crowdin","\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Ftranslation-workflows-with-git-and-crowdin\u002F","Connect a static site repository to Crowdin so source changes flow to translators, translations return as pull requests and stale pages are flagged in CI.",{"t":178,"u":179,"d":180},"hreflang and Language Alternates on Static Sites","\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fhreflang-and-language-alternates-on-static-sites\u002F","Generate reciprocal hreflang alternates from a translation key at build time in Hugo, Astro or Eleventy, and validate every language group in CI.",{"t":182,"u":183,"d":184},"i18n Routing in Astro","\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fi18n-routing-in-astro\u002F","Configure Astro i18n routing: locales, an unprefixed default language, fallbacks, locale-aware links and content collections organised per language.",{"k":28,"h":186,"items":187},"Jekyll Plugin Ecosystem",[188,192,196,200,204,208],{"t":189,"u":190,"d":191},"Custom Domains and HTTPS for Jekyll on GitHub Pages","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fcustom-domains-and-https-for-jekyll-on-github-pages\u002F","Point a custom domain at a Jekyll site on GitHub Pages, get HTTPS enforced, fix certificate and DNS errors, and keep url and baseurl correct in _config.yml.",{"t":193,"u":194,"d":195},"Deploying Jekyll with GitHub Actions","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fdeploying-jekyll-with-github-actions\u002F","Replace the classic GitHub Pages Jekyll builder with a GitHub Actions workflow: any plugin, any Jekyll version, caching, previews and Pages deployment.",{"t":197,"u":198,"d":199},"Replacing Jekyll Plugins When Migrating to Eleventy","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Freplacing-jekyll-plugins-when-migrating-to-eleventy\u002F","Map common Jekyll plugins — jekyll-seo-tag, jekyll-feed, jekyll-paginate, jekyll-picture-tag — to their Eleventy equivalents, with config and measured build impact.",{"t":201,"u":202,"d":203},"Running Jekyll in Docker for Reproducible Builds","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Frunning-jekyll-in-docker-for-reproducible-builds\u002F","Build a Jekyll site in a pinned Docker image so writers, CI and production use the same Ruby, gems and native extensions, with fast cached rebuilds.",{"t":205,"u":206,"d":207},"Running Jekyll on GitHub Pages Without Plugins","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Frunning-jekyll-on-github-pages-without-plugins\u002F","The allowlist blocks most gems. Replace plugin behaviour with Liquid, data files and a build step — or take the Actions route and keep the plugins you actually need.",{"t":209,"u":210,"d":211},"Upgrading Jekyll and Ruby Versions Safely","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fupgrading-jekyll-and-ruby-versions-safely\u002F","Move an old Jekyll 3 site to Jekyll 4 and a supported Ruby without breaking pages: pin versions, upgrade in steps, diff the built output and fix what changes.",{"k":28,"h":213,"items":214},"Migrating Between Static Site Generators",[215,219,223,227,231,235,239,243,247,251,255,259],{"t":216,"u":217,"d":218},"Auditing Content Parity After a Migration","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fauditing-content-parity-after-a-migration\u002F","Prove an SSG migration lost nothing: crawl old and new builds, compare URLs, titles, headings, links, images and metadata page by page, and triage the diffs.",{"t":220,"u":221,"d":222},"Converting Front Matter at Scale During Migration","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fconverting-front-matter-at-scale-during-migration\u002F","Script front matter conversion across thousands of Markdown files between generators: field maps, type fixes, validation against a schema, and reviewable diffs.",{"t":224,"u":225,"d":226},"Keeping Redirects Working After an SSG Migration","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fkeeping-redirects-working-after-an-ssg-migration\u002F","Build a redirect map from production data, emit it in your host’s format, chain nothing, and gate it in CI — so no inbound link breaks when the generator changes.",{"t":228,"u":229,"d":230},"Migrating From Hugo to Astro Without Breaking URLs","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-hugo-to-astro-without-breaking-urls\u002F","Move a Hugo site to Astro content collections while reproducing every permalink: slug mapping, a typed schema, shortcodes as MDX components, and a URL parity gate in CI.",{"t":232,"u":233,"d":234},"Migrating WordPress to a Static Site Generator","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-wordpress-to-a-static-site-generator\u002F","Move a WordPress blog to a static generator: export posts to Markdown, localise media, keep every URL, replace comments and forms, and measure the gain.",{"t":236,"u":237,"d":238},"Migrating a Docs Site From Jekyll to Hugo","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-a-docs-site-from-jekyll-to-hugo\u002F","Convert Jekyll collections, Liquid includes and permalinks to Hugo sections, partials and URL config — with a build that drops from 96 s to 3.4 s on 1,200 pages.",{"t":240,"u":241,"d":242},"Migrating a WordPress Export to Eleventy","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-a-wordpress-export-to-eleventy\u002F","Convert a WordPress XML export into Eleventy Markdown with front matter, images, categories and comments, keep every URL with redirects and verify parity.",{"t":244,"u":245,"d":246},"Migrating from Docusaurus to Starlight","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-docusaurus-to-starlight\u002F","Move a Docusaurus documentation site to Starlight: content and admonition conversion, sidebars, MDX components, versioning decisions, redirects and results.",{"t":248,"u":249,"d":250},"Migrating from Gatsby to Astro","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-gatsby-to-astro\u002F","Move a Gatsby content site to Astro: replace GraphQL queries with content collections, port React components as islands, and keep image quality and URLs.",{"t":252,"u":253,"d":254},"Migrating from Next.js Pages Router to Astro","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-nextjs-pages-router-to-astro\u002F","Move a content-heavy Next.js Pages Router site with getStaticProps to Astro: routes, data fetching, MDX, React islands, images, redirects and the measured result.",{"t":256,"u":257,"d":258},"Porting Shortcodes and Includes Between Generators","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fporting-shortcodes-and-includes-between-generators\u002F","Map Jekyll includes, Hugo shortcodes, Eleventy shortcodes and MDX components onto each other — with a census-first strategy, stub-then-port order, and a rendering test per component.",{"t":260,"u":261,"d":262},"Replacing Gatsby GraphQL Queries During a Migration","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Freplacing-gatsby-graphql-queries-during-a-migration\u002F","Inventory every Gatsby GraphQL query, map each to plain data functions or content collections, and migrate page by page with output checks.",{"k":28,"h":264,"items":265},"Next.js Static Export for Content Sites",[266,270,274,278,282,286],{"t":267,"u":268,"d":269},"Generating Sitemaps and RSS in Next.js Static Export","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fgenerating-sitemaps-and-rss-in-nextjs-static-export\u002F","Produce sitemap.xml, robots.txt and an RSS feed from a Next.js App Router site with output export, using metadata routes and static route handlers.",{"t":271,"u":272,"d":273},"Handling Dynamic Routes in Next.js Static Export","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fhandling-dynamic-routes-in-nextjs-static-export\u002F","generateStaticParams, catch-all segments, trailing slashes and the 404 problem: how to make dynamic routes work under output export without a server.",{"t":275,"u":276,"d":277},"Migrating from Gatsby to Next.js Static Export","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fmigrating-from-gatsby-to-nextjs-static-export\u002F","A concrete recipe for moving a Gatsby content site to a Next.js static export — GraphQL data layer to file reads, plugins to libraries, with measured build and bundle deltas.",{"t":279,"u":280,"d":281},"Optimizing Images in Next.js Static Export","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Foptimizing-images-in-nextjs-static-export\u002F","next\u002Fimage cannot optimise at request time in a static export. Three ways to get responsive, modern-format images back — build-time, loader and CDN — measured.",{"t":283,"u":284,"d":285},"Trailing Slash and basePath in Next.js Static Export","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Ftrailing-slash-and-basepath-in-nextjs-static-export\u002F","Configure trailingSlash, basePath and assetPrefix in a Next.js static export so links, assets, canonicals and host URL handling agree on every static host.",{"t":287,"u":288,"d":289},"Using MDX in Next.js Static Export","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fusing-mdx-in-nextjs-static-export\u002F","Render MDX content in a Next.js App Router static export: @next\u002Fmdx vs next-mdx-remote, frontmatter, remark and rehype plugins, components and build cost.",{"k":28,"h":291,"items":292},"Search for Static Sites",[293,297,301,305,309,313,317,321,325],{"t":294,"u":295,"d":296},"Accessible Search UI for Static Sites","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Faccessible-search-ui-for-static-sites\u002F","Build a static site search dialog that works with keyboards and screen readers: dialog semantics, result lists, live result counts and focus handling.",{"t":298,"u":299,"d":300},"Adding Pagefind to an Astro Site","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fadding-pagefind-to-an-astro-site\u002F","Add Pagefind search to a plain Astro site: post-build indexing, content boundaries, heading weights, a lazy-loaded UI and a CI relevance check.",{"t":302,"u":303,"d":304},"Building a Lunr Index at Build Time in Eleventy","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fbuilding-a-lunr-index-at-build-time-in-eleventy\u002F","Generate a prebuilt Lunr search index from Eleventy collections, keep it small with field boosts and stop words, and load it only when readers search.",{"t":306,"u":307,"d":308},"Customizing the Pagefind UI","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fcustomizing-the-pagefind-ui\u002F","Make Pagefind's search UI match your design system: theme variables, filters, result metadata, a modal trigger, or a custom UI on the JavaScript API.",{"t":310,"u":311,"d":312},"Indexing Hugo Sites with Pagefind","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Findexing-hugo-sites-with-pagefind\u002F","Add fast, serverless search to a Hugo site with Pagefind: template attributes, taxonomy filters, multilingual output, CI integration and measured build cost.",{"t":314,"u":315,"d":316},"Multilingual Search on Static Sites","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fmultilingual-search-on-static-sites\u002F","Build per-language search for a static site: language detection, stemming, compound words, CJK segmentation and keeping each locale's index small.",{"t":318,"u":319,"d":320},"Search Index Size Budgets for Large Docs","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fsearch-index-size-budgets-for-large-docs\u002F","Set a byte budget for static search on large documentation sites, measure first-query cost on real phones, and trim indexes that have quietly grown too big.",{"t":322,"u":323,"d":324},"Self-Hosting Typesense for a Static Site","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fself-hosting-typesense-for-a-static-site\u002F","Run Typesense as search for a large static site: index from the build, scoped search keys, typo tolerance, facets, cost and when Pagefind is enough.",{"t":326,"u":327,"d":328},"Tracking Zero-Result Searches","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Ftracking-zero-result-searches\u002F","Log searches that return nothing on a static site with Pagefind or a search server, respect privacy, and turn the weekly report into synonyms and new content.",{"k":28,"h":330,"items":331},"Technical SEO for Static Sites",[332,336,340,344,348,352,356],{"t":333,"u":334,"d":335},"Adding JSON-LD Structured Data at Build Time","\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fadding-json-ld-structured-data-at-build-time\u002F","Emit valid JSON-LD from frontmatter in Astro, Eleventy and Hugo: build objects not strings, pick the right schema.org types, and validate every page in CI.",{"t":337,"u":338,"d":339},"Canonical URLs and Duplicate Content on Static Sites","\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fcanonical-urls-and-duplicate-content-on-static-sites\u002F","Stop static sites serving one page at many URLs: pick a trailing-slash policy, redirect variants at the host and emit self-referencing canonicals from config.",{"t":341,"u":342,"d":343},"Generating Breadcrumb Structured Data in Astro","\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fgenerating-breadcrumb-structured-data-in-astro\u002F","Generate visible breadcrumbs and matching BreadcrumbList JSON-LD in Astro from the URL or content collections, with readable names, and test both in CI.",{"t":345,"u":346,"d":347},"Generating Sitemaps for Large Static Sites","\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fgenerating-sitemaps-for-large-static-sites\u002F","Generate sitemap indexes for static sites with thousands of pages: split by section, real lastmod from Git, only indexable URLs, and a CI check against the build.",{"t":349,"u":350,"d":351},"RSS and Atom Feeds for Static Blogs","\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Frss-and-atom-feeds-for-static-blogs\u002F","Publish valid RSS and Atom feeds from Eleventy, Astro or Hugo with full content, absolute URLs, stable IDs and correct headers, then check them in CI.",{"t":353,"u":354,"d":355},"SEO-Safe Pagination and Tag Pages","\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fseo-safe-pagination-and-tag-pages\u002F","Generate crawlable pagination and useful tag archives in Eleventy and Hugo: plain links, self canonicals, a minimum tag size and no thin date archives.",{"t":357,"u":358,"d":359},"robots.txt and noindex for Preview and Staging","\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Frobots-txt-and-noindex-for-preview-and-staging\u002F","Keep preview, staging and platform-host copies of a static site out of search results with X-Robots-Tag headers on Netlify, Vercel and Cloudflare.",{"k":28,"h":361,"items":362},"CDN Caching Rules for SSGs",[363,367,371,375,379,383,387,391,395,399,403],{"t":364,"u":365,"d":366},"Cache Busting with Content-Hashed Filenames","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-busting-with-content-hashed-filenames\u002F","Fingerprint every static asset so it can be cached for a year yet update instantly on deploy: bundler hashing, images, fonts and the HTML pointing to them.",{"t":368,"u":369,"d":370},"Cache Keys and Query Strings on CDNs","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-keys-and-query-strings-on-cdns\u002F","Stop tracking parameters from fragmenting a static site’s CDN cache: normalize query strings in the cache key on Cloudflare and CloudFront, and measure hit ratio.",{"t":372,"u":373,"d":374},"Cache-Control Headers for Static Sites in Nginx","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-control-headers-for-static-sites-in-nginx\u002F","Set Cache-Control in Nginx for a static site: immutable hashed assets, revalidated HTML, short-lived 404s and the add_header inheritance trap.",{"t":376,"u":377,"d":378},"Cache-Control Headers on Cloudflare Pages","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fsetting-cache-control-headers-on-cloudflare-pages\u002F","Set Cache-Control on Cloudflare Pages with a _headers file and Cache Rules — year-long immutable assets, revalidated HTML, and CF-Cache-Status HIT verified with curl.",{"t":380,"u":381,"d":382},"Cache-Control Headers on S3 and CloudFront","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-control-headers-on-s3-and-cloudfront\u002F","Set Cache-Control for a static site on S3 behind CloudFront: object metadata on upload, cache policies, response headers policies and invalidation, measured.",{"t":384,"u":385,"d":386},"Cache-Control Headers on Vercel for Static Sites","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-control-headers-on-vercel-for-static-sites\u002F","How Vercel caches static output by default, when to override it in vercel.json, and how CDN-Cache-Control and immutable assets change repeat-visit performance.",{"t":388,"u":389,"d":390},"Caching 404s and Redirects at the Edge","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcaching-404s-and-redirects-at-the-edge\u002F","Cache 404 pages and redirects on a static site’s CDN so bots, broken links and migration redirects stop hitting the origin, without making fixes slow to appear.",{"t":392,"u":393,"d":394},"Proper Cache Headers on Netlify for SSGs","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fsetting-up-proper-cache-headers-on-netlify\u002F","Configure Cache-Control headers in Netlify _headers files — fingerprinted assets cached for a year, HTML revalidated every request, with exact Netlify syntax and curl verification.",{"t":396,"u":397,"d":398},"Purging the CDN Cache After a Static Deploy","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fpurging-the-cdn-cache-after-a-static-deploy\u002F","Purge by path or tag instead of everything: why a full purge is an origin stampede, which files actually need invalidating, and how to wire a surgical purge into CI.",{"t":400,"u":401,"d":402},"Stale-While-Revalidate for Static HTML","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fstale-while-revalidate-for-static-html\u002F","Cache static HTML at the edge with stale-while-revalidate: faster TTFB and repeat views, bounded staleness after deploys, and when to purge instead.",{"t":404,"u":405,"d":406},"Tiered Caching and Origin Shield","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Ftiered-caching-and-origin-shield\u002F","Use Cloudflare Tiered Cache or CloudFront Origin Shield so edge misses on a static site are served from a regional tier instead of the origin, with measured results.",{"k":28,"h":408,"items":409},"CSS and JavaScript Asset Optimization",[410,414,418,422,426,430,434],{"t":411,"u":412,"d":413},"Code Splitting and Module Preload in Vite-Based SSGs","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fcode-splitting-and-module-preload-in-vite-based-ssgs\u002F","Find JavaScript that loads on every page of an Astro or VitePress site, split it with dynamic imports and manualChunks, and keep modulepreload hints honest.",{"t":415,"u":416,"d":417},"Inlining Critical CSS on Static Sites","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Finlining-critical-css-on-static-sites\u002F","Remove the render-blocking stylesheet on static sites: inline small CSS whole, or extract critical rules per page with Beasties, and measure the trade-off.",{"t":419,"u":420,"d":421},"Keeping Tailwind CSS Output Small on Static Sites","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fkeeping-tailwind-css-output-small-on-static-sites\u002F","Measure what makes Tailwind CSS grow on a static site, from broad sources and safelists to arbitrary values and theme bloat, and keep it under a budget.",{"t":423,"u":424,"d":425},"Minifying HTML, CSS and JS in Eleventy","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fminifying-html-css-and-js-in-eleventy\u002F","Minify Eleventy output safely with html-minifier-terser, Lightning CSS and esbuild, keep code blocks intact, and measure what minification saves after brotli.",{"t":427,"u":428,"d":429},"Precompressing Assets with Brotli and Zstd","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fprecompressing-assets-with-brotli-and-zstd\u002F","Precompress static site output at build time with brotli 11 and zstd 19, serve the variants from Caddy, nginx or Cloudflare, and measure the transfer saving.",{"t":431,"u":432,"d":433},"Purging Unused CSS with Tailwind and Lightning CSS","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fpurging-unused-css-with-tailwind-and-lightningcss\u002F","Cut unused CSS on static sites: tighten Tailwind content sources, purge legacy stylesheets against built HTML, safelist runtime classes and verify with Coverage.",{"t":435,"u":436,"d":437},"Tailwind v4 in Astro Without PostCSS Plugins","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Ftailwind-v4-in-astro-without-postcss-plugins\u002F","Move an Astro site from Tailwind 3 with the PostCSS integration to Tailwind 4 on its Vite plugin: CSS-first config, sources, dark mode and build time, measured.",{"k":28,"h":439,"items":440},"Cumulative Layout Shift Fixes for Static Sites",[441,445,449],{"t":442,"u":443,"d":444},"Measuring CLS in the Field With web-vitals.js","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Fmeasuring-cls-in-the-field-with-web-vitals-js\u002F","Collect real-user CLS from a static site with the web-vitals attribution build, send it to an edge endpoint, and turn a 75th-percentile score into a named element to fix.",{"t":446,"u":447,"d":448},"Reserving Space for Ad and Promo Slots","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Freserving-space-for-ad-and-promo-slots\u002F","Stop ad units, sponsor blocks and promo banners from shifting a static site: size slots per breakpoint, handle empty fills, and render promos at build time.",{"t":450,"u":451,"d":452},"Reserving Space for Images and Embeds","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Freserving-space-for-images-and-embeds-to-stop-layout-shift\u002F","Stamp intrinsic dimensions on every image, wrap iframes in an aspect-ratio box, and handle art-directed sources — the build-time recipe that takes body-image CLS from 0.31 to 0.01.",{"k":28,"h":454,"items":455},"Font Loading Strategies for Static Sites",[456,460,464,468,472,476],{"t":457,"u":458,"d":459},"Auditing Font Payload per Page","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fauditing-font-payload-per-page\u002F","Measure which fonts, weights and subsets each template of a static site really downloads, find unused faces and fallbacks, and set a font budget in CI.",{"t":461,"u":462,"d":463},"Metric-Matched Fallback Fonts with size-adjust","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fmetric-matched-fallback-fonts-with-size-adjust\u002F","Use size-adjust, ascent-override and descent-override to make a local fallback font take the same space as your web font, so the swap causes no layout shift.",{"t":465,"u":466,"d":467},"Preloading Fonts Without Double Downloads","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fpreloading-fonts-without-double-downloads\u002F","A font preload that misses crossorigin, or points at a different URL than the @font-face rule, downloads the font twice. Here is how to preload fonts correctly.",{"t":469,"u":470,"d":471},"Self-Host Google Fonts to Eliminate Layout Shift","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fself-hosting-google-fonts-to-eliminate-layout-shift\u002F","Self-host Google Fonts to kill CLS and a third-party connection: download, subset, preload, font-display swap, and a size-adjust fallback with measured before\u002Fafter CLS.",{"t":473,"u":474,"d":475},"Subsetting Variable Fonts for Faster First Render","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fsubsetting-variable-fonts-for-faster-first-render\u002F","Cut a 128 KB variable font to 31 KB with glyph subsetting and axis pinning, generate the subset in the build, and keep punctuation and code glyphs from disappearing.",{"t":477,"u":478,"d":479},"Using System Font Stacks to Skip Web Fonts","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fusing-system-font-stacks-to-skip-webfonts\u002F","Replace web fonts with modern system font stacks on a static site: which stacks to use, monospace and CJK choices, brand trade-offs and measured LCP and CLS.",{"k":28,"h":481,"items":482},"Image Optimization Pipelines in Astro",[483,487,491,495,499,503,507,511,515,519],{"t":484,"u":485,"d":486},"Art Direction with the Picture Element","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fart-direction-with-the-picture-element\u002F","Serve different crops of a hero image to mobile and desktop with picture and media queries in Astro, Eleventy and Hugo, without hurting LCP or causing layout shift.",{"t":488,"u":489,"d":490},"Blur-Up Placeholders with LQIP","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fblur-up-placeholders-with-lqip\u002F","Generate tiny blurred placeholders for images at build time in Astro or Eleventy, inline them without slowing LCP, and decide when a solid colour is better.",{"t":492,"u":493,"d":494},"Building an Image CDN Pipeline for Static Sites","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fbuilding-an-image-cdn-pipeline-for-static-sites\u002F","When to offload image transforms to an image CDN versus build time: URL-based transforms, edge caching, and cost, compared across Cloudflare Images, imgix, and Netlify.",{"t":496,"u":497,"d":498},"Caching Processed Images Between Builds","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fcaching-processed-images-between-builds\u002F","Persist Astro and Eleventy image caches between CI builds so AVIF and WebP variants are generated once, with correct cache keys, pruning and measured build times.",{"t":500,"u":501,"d":502},"Generating Open Graph Images at Build Time","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fgenerating-open-graph-images-at-build-time\u002F","Render a unique social preview image for every page at build time with Satori and resvg, cache the output, and wire og:image tags into Astro, Hugo or Eleventy.",{"t":504,"u":505,"d":506},"Lazy-Loading Images Without Hurting LCP","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Flazy-loading-images-without-hurting-lcp\u002F","loading=\"lazy\" saves bytes below the fold but delays the LCP image when applied to it. How to decide per image, per template, in Astro, Hugo and Eleventy.",{"t":508,"u":509,"d":510},"Optimizing WebP Images in Hugo Without Plugins","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Foptimizing-webp-images-in-hugo-without-plugins\u002F","Generate WebP at build time using only Hugo's built-in image processing — no Node, no plugins, no system libraries. Requires the hugo-extended edition for WebP.",{"t":512,"u":513,"d":514},"Responsive Images with srcset in Eleventy","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fresponsive-images-with-srcset-in-eleventy\u002F","Generate AVIF, WebP and JPEG widths with @11ty\u002Feleventy-img, emit srcset and sizes that match your layout, and cache the output so builds stay fast.",{"t":516,"u":517,"d":518},"Serving AVIF With Fallbacks on Static Sites","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fserving-avif-with-fallbacks-on-static-sites\u002F","Emit AVIF, WebP and a legacy fallback from one build step, order picture sources correctly, keep Vary headers honest, and measure the real byte and LCP savings.",{"t":520,"u":521,"d":522},"Serving Astro Images Through Cloudflare Image Resizing","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fserving-astro-images-through-cloudflare-image-resizing\u002F","Move Astro image processing from build time to Cloudflare Images transformations with a custom image service, cutting build time while keeping srcset and AVIF.",{"k":28,"h":524,"items":525},"JavaScript Hydration & Partial Rendering",[526,530,534,538,542,546],{"t":527,"u":528,"d":529},"Breaking Up Long Tasks on Static Sites","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fbreaking-up-long-tasks-on-static-sites\u002F","Find long tasks that hurt INP on a static site, split them with scheduler.yield and idle callbacks, move work off the main thread, and measure the field result.",{"t":531,"u":532,"d":533},"Deferring Hydration with client:visible in Astro","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fdeferring-hydration-with-client-visible-in-astro\u002F","Use client:visible, client:idle and client:media to delay Astro island hydration until it is needed, cut startup JavaScript and protect INP on content pages.",{"t":535,"u":536,"d":537},"How to Reduce Bundle Size in Eleventy Builds","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fhow-to-reduce-bundle-size-in-eleventy-builds\u002F","Cut JavaScript in Eleventy builds — scope scripts per route, tree-shake and bundle with esbuild, and defer third-party code. Concrete before\u002Fafter KB numbers.",{"t":539,"u":540,"d":541},"Measuring INP on Static Sites with RUM","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fmeasuring-inp-on-static-sites-with-real-user-monitoring\u002F","Measure Interaction to Next Paint in the field with the web-vitals library and a RUM beacon, attribute INP to specific interactions, and reconcile lab versus field data.",{"t":543,"u":544,"d":545},"Replacing React Islands with Web Components","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Freplacing-react-islands-with-web-components\u002F","Small interactive widgets rarely need React. Rewriting islands as custom elements removes the framework runtime, cuts JavaScript and improves INP.",{"t":547,"u":548,"d":549},"Server Islands in Astro","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fserver-islands-in-astro\u002F","Use Astro server islands to add small per-request parts to a static page, such as stock or account state, with fallbacks, caching headers and measured costs.",{"k":28,"h":551,"items":552},"Largest Contentful Paint Optimization for Static Sites",[553,557,561],{"t":554,"u":555,"d":556},"Improving TTFB for Static HTML","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Fimproving-ttfb-for-static-html\u002F","Cut time to first byte for a static site’s HTML: edge caching of HTML, redirect hops, TLS and protocol settings, origin placement and 103 Early Hints, measured in the field.",{"t":558,"u":559,"d":560},"Measuring LCP Subparts with DevTools","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Fmeasuring-lcp-subparts-with-devtools\u002F","Split Largest Contentful Paint into TTFB, load delay, load duration and render delay in DevTools and field data, so you fix the part that is actually slow.",{"t":562,"u":563,"d":564},"Optimizing LCP on Astro with Priority Hints","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Foptimizing-lcp-on-astro-with-priority-hints\u002F","Use fetchpriority=\"high\", rel=preload, and Astro Image priority to load the hero first and cut LCP — with measured before\u002Fafter numbers from Lighthouse and WebPageTest.",{"k":25,"html":566},"\u003Cfigure>\n\u003Csvg viewBox=\"0 0 760 295\" role=\"img\" aria-labelledby=\"hub-how-to-sections-title hub-how-to-sections-desc\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\">\n  \u003Ctitle id=\"hub-how-to-sections-title\">Number of how-tos in each section\u003C\u002Ftitle>\n  \u003Cdesc id=\"hub-how-to-sections-desc\">Vertical bars: Framework selection 75, Performance 68 and Deployment 102. As a share of all guides in the section: Framework selection 62%, Performance 66%, Deployment 83%.\u003C\u002Fdesc>\n  \u003Crect x=\"0\" y=\"0\" width=\"760\" height=\"295\" fill=\"#ffffff\"\u002F>\n  \u003Cg style=\"font-family:system-ui, sans-serif;font-size:12px\">\n    \u003Crect x=\"108.3\" y=\"121.0\" width=\"90.0\" height=\"125.0\" rx=\"3\" fill=\"#6a4c93\" opacity=\"0.3\" stroke=\"#6a4c93\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"335.0\" y=\"132.7\" width=\"90.0\" height=\"113.3\" rx=\"3\" fill=\"#1982c4\" opacity=\"0.3\" stroke=\"#1982c4\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"561.7\" y=\"76.0\" width=\"90.0\" height=\"170.0\" rx=\"3\" fill=\"#8ac926\" opacity=\"0.4\" stroke=\"#5a8a16\" style=\"stroke-width:1px\"\u002F>\n    \u003Cpath d=\"M30.0 246.0 L730.0 246.0\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Ctext x=\"380.0\" y=\"30.0\" fill=\"#1f2937\" style=\"font-size:16px;text-anchor:middle;font-weight:700\">How-tos in each section\u003C\u002Ftext>\n    \u003Ctext x=\"153.3\" y=\"114.0\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:middle;font-weight:700\">75\u003C\u002Ftext>\n    \u003Ctext x=\"153.3\" y=\"264.0\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:middle\">Framework selection\u003C\u002Ftext>\n    \u003Ctext x=\"380.0\" y=\"125.7\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:middle;font-weight:700\">68\u003C\u002Ftext>\n    \u003Ctext x=\"380.0\" y=\"264.0\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:middle\">Performance\u003C\u002Ftext>\n    \u003Ctext x=\"606.7\" y=\"69.0\" fill=\"#3f6410\" style=\"font-size:12px;text-anchor:middle;font-weight:700\">102\u003C\u002Ftext>\n    \u003Ctext x=\"606.7\" y=\"264.0\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:middle\">Deployment\u003C\u002Ftext>\n  \u003C\u002Fg>\n\u003C\u002Fsvg>\n\u003Cfigcaption>245 how-tos in total. As a share of each section: framework selection 62%, performance 66%, deployment 83%.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>",{"k":28,"h":568,"items":569},"Performance Budgets and Lighthouse CI",[570,574,578,582,586,590,594,598],{"t":571,"u":572,"d":573},"Measuring Web Vitals in Playwright Tests","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fmeasuring-web-vitals-in-playwright-tests\u002F","Measure LCP, CLS and interaction latency inside existing Playwright tests on a static site, with throttling, stable thresholds and per-PR results.",{"t":575,"u":576,"d":577},"Per-Template Performance Budgets","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fper-template-performance-budgets\u002F","Set a performance budget for each page template of a static site, pick representative URLs automatically, and enforce them with Lighthouse CI and size checks.",{"t":579,"u":580,"d":581},"Performance Testing on Throttled Mobile Profiles","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fperformance-testing-on-throttled-mobile-profiles\u002F","Choose throttling that matches your real readers, calibrate Lighthouse and WebPageTest against field data, and test static sites on real mid-range phones.",{"t":583,"u":584,"d":585},"Running WebPageTest Scripts Against Preview Deploys","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Frunning-webpagetest-scripts-against-preview-deploys\u002F","Script multi-step WebPageTest journeys — search, navigation, repeat views — against every preview deploy, from locations Lighthouse cannot emulate.",{"t":587,"u":588,"d":589},"Setting Up Lighthouse CI for a Static Site","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fsetting-up-lighthouse-ci-for-a-static-site\u002F","Wire Lighthouse CI into GitHub Actions against every preview deploy: URL selection, assertions, a required status check and stored reports, in about an hour.",{"t":591,"u":592,"d":593},"Tracking Bundle Size per Pull Request","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Ftracking-bundle-size-per-pull-request\u002F","Compare every build's JavaScript, CSS and font output against the base branch, post the diff on the pull request and fail on budget breaches in seconds.",{"t":595,"u":596,"d":597},"Tracking Page Weight Over Time","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Ftracking-page-weight-over-time\u002F","Record page weight per template on every deploy of a static site, chart the trend, attribute each jump to a commit, and catch slow growth that budgets miss.",{"t":599,"u":600,"d":601},"Writing a Performance Budget That Fails Builds","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fwriting-a-performance-budget-that-fails-builds\u002F","Derive byte, request and timing limits from your own site, encode them per template in budget.json and CI, and ratchet them down without constant false alarms.",{"k":28,"h":603,"items":604},"Resource Hints and Navigation Speed",[605,609,613,617,621,625,629],{"t":606,"u":607,"d":608},"Auditing Unused Preloads","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads\u002F","Find preloads that waste bandwidth or compete with the LCP resource across a whole static site, remove them safely, and stop new ones creeping back in.",{"t":610,"u":611,"d":612},"Early Hints (103) on Cloudflare","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fearly-hints-103-on-cloudflare\u002F","Send 103 Early Hints from Cloudflare for a static site so browsers start fetching CSS, fonts and the LCP image before the HTML arrives, and measure when it helps.",{"t":614,"u":615,"d":616},"Fetchpriority Beyond the Hero Image","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Ffetchpriority-beyond-the-hero-image\u002F","Use fetchpriority beyond the LCP image: demote carousels and decorative images, raise critical fetches, and measure the effect on LCP and INP.",{"t":618,"u":619,"d":620},"Instant Navigation with Speculation Rules","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Finstant-navigation-with-speculation-rules\u002F","Prerender likely next pages on a static site with the Speculation Rules API: eagerness levels, exclusions, prerender-aware analytics and field results.",{"t":622,"u":623,"d":624},"Prefetching Links in Astro","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fprefetching-links-in-astro\u002F","Configure Astro's built-in prefetch — strategies, defaults, per-link overrides and speculation rules — and measure what it does to navigation speed.",{"t":626,"u":627,"d":628},"View Transitions in Astro Without Hurting Vitals","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fview-transitions-in-astro-without-hurting-vitals\u002F","Add view transitions to an Astro site with the ClientRouter or native cross-document transitions, then keep LCP, INP and CLS intact with measured settings.",{"t":630,"u":631,"d":632},"View Transitions on Multi-Page Static Sites","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fview-transitions-on-multi-page-static-sites\u002F","Add cross-document view transitions to a static site with CSS alone: opt-in rules, named elements, reduced motion, avoiding layout shift, and the measured cost.",{"k":28,"h":634,"items":635},"Third-Party Script Performance on Static Sites",[636,640,644,648,652,656,660],{"t":637,"u":638,"d":639},"Auditing Third-Party Scripts With Lighthouse","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fauditing-third-party-scripts-with-lighthouse\u002F","Use the third-party summary, the treemap and a long-task trace to attribute every kilobyte and millisecond to a vendor — then gate the total in CI so it cannot creep back.",{"t":641,"u":642,"d":643},"Facades for Chat Widgets and Maps","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Ffacades-for-chat-widgets-and-maps\u002F","Replace chat widgets, maps and other heavy embeds on a static site with lightweight facades that load the real thing on interaction, with measured savings.",{"t":645,"u":646,"d":647},"Lazy-Loading YouTube Embeds on Static Sites","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Flazy-loading-youtube-embeds-on-static-sites\u002F","Replace the iframe player with a build-time poster facade: 780 KB and 310 ms of blocking time removed from every page load, with keyboard and screen-reader support intact.",{"t":649,"u":650,"d":651},"Loading Google Tag Manager Without Hurting INP","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Floading-google-tag-manager-without-hurting-inp\u002F","Google Tag Manager and the tags it injects run long tasks that delay clicks. Load it later, trim triggers, and yield in click handlers to keep INP healthy.",{"t":653,"u":654,"d":655},"Measuring Third-Party Cost with Request Blocking","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fmeasuring-third-party-cost-with-request-blocking\u002F","Quantify what each third-party script costs a static site by blocking it in Lighthouse and WebPageTest, then compare LCP, TBT and bytes with and without it.",{"t":657,"u":658,"d":659},"Running Third-Party Scripts in a Web Worker with Partytown","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Frunning-third-party-scripts-in-a-web-worker-with-partytown\u002F","Partytown moves analytics and tag scripts into a web worker so they stop blocking the main thread. How to set it up on a static site and which scripts break.",{"t":661,"u":662,"d":663},"Self-Hosting Analytics to Cut Third-Party Requests","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fself-hosting-analytics-to-cut-third-party-requests\u002F","Replace a vendor analytics connection with a first-party script and an edge endpoint: no extra DNS or TLS, no consent-blocking dependency, and 6 KB instead of 96 KB.",{"k":28,"h":665,"items":666},"Cloudflare Pages Edge Caching Setup",[667,671,675,679,683,687,691,695,699],{"t":668,"u":669,"d":670},"Automating Eleventy Deployments on Cloudflare Pages","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fautomating-eleventy-deployments-with-cloudflare-pages\u002F","Deploy Eleventy from Git on Cloudflare Pages: connect the repo, set the build command and _site output, pin Node, wire env vars, and ship cache headers — with build times.",{"t":672,"u":673,"d":674},"Branch Deploy Controls on Cloudflare Pages","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fbranch-deploy-controls-on-cloudflare-pages\u002F","Control which branches build and deploy on Cloudflare Pages, name preview aliases, skip builds for docs-only changes and keep preview traffic private and cheap.",{"t":676,"u":677,"d":678},"Cloudflare Pages Functions Middleware","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fcloudflare-pages-functions-middleware\u002F","Use _middleware.js in Cloudflare Pages Functions to add headers, auth, redirects and A\u002FB routing to a static site, scoped by path and measured for latency and cost.",{"t":680,"u":681,"d":682},"Configuring Redirects on Cloudflare Pages","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fconfiguring-redirects-on-cloudflare-pages\u002F","Write a _redirects file for Cloudflare Pages, know its limits, and move large or dynamic rule sets to Bulk Redirects or a Worker without slowing requests.",{"t":684,"u":685,"d":686},"Custom Domains and TLS on Cloudflare Pages","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fcustom-domains-and-tls-on-cloudflare-pages\u002F","Attach apex and www domains to Cloudflare Pages, understand how certificates are issued, choose the right SSL mode, and fix the common validation failures.",{"t":688,"u":689,"d":690},"Deploying Astro to Cloudflare Workers Static Assets","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fdeploying-astro-to-cloudflare-workers-static-assets\u002F","Deploy a static Astro site to Cloudflare Workers with static assets: wrangler config, trailing slashes, 404 handling, headers, previews and optional server routes.",{"t":692,"u":693,"d":694},"Deploying Hugo to Cloudflare Pages and Workers","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fdeploying-hugo-to-cloudflare-pages-and-workers\u002F","Deploy a Hugo site to Cloudflare Pages — pin HUGO_VERSION, set the build command and public output dir — and learn when Workers and Wrangler earn their place.",{"t":696,"u":697,"d":698},"Deploying to Cloudflare From GitHub Actions With Wrangler","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fdeploying-to-cloudflare-from-github-actions-with-wrangler\u002F","Deploy a static site to Cloudflare Workers Static Assets or Pages from GitHub Actions with Wrangler: scoped tokens, PR previews, caching and rollback.",{"t":700,"u":701,"d":702},"Migrating from Cloudflare Pages to Workers Static Assets","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fmigrating-from-cloudflare-pages-to-workers-static-assets\u002F","Move a static site from Cloudflare Pages to Workers static assets: wrangler config, _headers and _redirects, previews and a zero-downtime domain cutover.",{"k":28,"h":704,"items":705},"Content Workflows for Documentation Teams",[706,710,714,718,722,726,730,734],{"t":707,"u":708,"d":709},"Checking Links in Pull Requests","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fchecking-links-in-pull-requests\u002F","Catch broken internal links and anchors before merge by checking the built site in CI with lychee, and handle external links without flaky failures.",{"t":711,"u":712,"d":713},"Content Linting with markdownlint","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fcontent-linting-with-markdownlint\u002F","Lint Markdown in a docs repository with markdownlint-cli2: tune rules, add custom rules for site conventions, autofix on commit and annotate pull requests.",{"t":715,"u":716,"d":717},"Editorial Checks with Vale in CI","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Feditorial-checks-with-vale-in-ci\u002F","Run Vale on every pull request to enforce your style guide, terminology and readability in Markdown docs, with inline review comments and a gradual rollout.",{"t":719,"u":720,"d":721},"Managing Images in Docs-as-Code Repos","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fmanaging-images-in-docs-as-code-repos\u002F","Keep screenshots and diagrams in a docs repository without bloating Git: size limits, Git LFS, co-location, alt text checks and automated screenshots.",{"t":723,"u":724,"d":725},"Release Notes and Changelogs from Git","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Frelease-notes-and-changelogs-from-git\u002F","Generate a changelog section for a static docs site from Git and conventional commits or changesets, with per-release pages, feeds and writer-edited release notes.",{"t":727,"u":728,"d":729},"Scheduled Content Publishing With GitHub Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fscheduled-content-publishing-with-github-actions\u002F","Publish reviewed pull requests at a set time with GitHub Actions, for embargoed launches and releases, with time zones, approvals and failed-build guards.",{"t":731,"u":732,"d":733},"Scheduling Content Publication With Cron-Triggered Builds","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fscheduling-content-publication-with-cron-triggered-builds\u002F","Publish future-dated pages on a static site with no runtime: filter at build time, rebuild on a cron, skip no-op deploys, and keep embargoed content out of the artifact.",{"t":735,"u":736,"d":737},"Wiring a Headless CMS to a Static Build","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fwiring-a-headless-cms-to-a-static-build\u002F","Connect a Git-backed or API-backed CMS to a static generator: content model, auth, webhook rebuilds, media handling, and keeping the repository the source of truth.",{"k":28,"h":739,"items":740},"GitHub Actions for Automated SSG Builds",[741,745,749,753,757,761,765,769,773,777],{"t":742,"u":743,"d":744},"Building Astro Sites with GitHub Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fbuilding-astro-sites-with-github-actions\u002F","A production GitHub Actions workflow for Astro: pinned Node, dependency and image caches, astro check, build artifacts and a deploy job that only runs on main.",{"t":746,"u":747,"d":748},"Caching node_modules in GitHub Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fcaching-node-modules-in-github-actions-for-faster-ssg-builds\u002F","Cut SSG CI time by caching npm in GitHub Actions — actions\u002Fsetup-node built-in cache vs actions\u002Fcache, lockfile-hash keys, and the install minutes you actually save.",{"t":750,"u":751,"d":752},"Concurrency Groups to Cancel Stale Builds","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fconcurrency-groups-to-cancel-stale-builds\u002F","Use GitHub Actions concurrency groups to cancel superseded static site builds on pull requests, serialize production deploys, and cut wasted CI minutes.",{"t":754,"u":755,"d":756},"Deploying to GitHub Pages with Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fdeploying-to-github-pages-with-actions\u002F","Deploy any static site generator to GitHub Pages with the official Actions workflow: artifacts, base paths, custom domains and what Pages cannot do.",{"t":758,"u":759,"d":760},"Deploying to Multiple Environments From One Workflow","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fdeploying-to-multiple-environments-from-one-workflow\u002F","Build the artifact once and promote it to preview, staging and production with environment-scoped secrets, approvals and per-environment config injected at deploy time.",{"t":762,"u":763,"d":764},"GitHub Actions for Hugo Deployments","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fhow-to-set-up-github-actions-for-hugo-deployments\u002F","Deploy Hugo with GitHub Actions using the extended edition for SCSS and WebP — a two-job build-and-publish pipeline, resource caching, and the Hugo-specific gotchas.",{"t":766,"u":767,"d":768},"Matrix Builds for Multi-Site Monorepos","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fmatrix-builds-for-multi-site-monorepos\u002F","Build and deploy only the sites a change affects in a monorepo, using a dynamic GitHub Actions matrix generated from changed paths, with per-site caches.",{"t":770,"u":771,"d":772},"Pinning Actions by Commit SHA","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fpinning-actions-by-commit-sha\u002F","Pin third-party GitHub Actions in static site workflows to full commit SHAs, keep them updated with Renovate or Dependabot, and restrict which actions may run.",{"t":774,"u":775,"d":776},"Publishing Any Generator to GitHub Pages With Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fpublishing-any-generator-to-github-pages-with-actions\u002F","One reusable GitHub Actions workflow that publishes Hugo, Astro, Eleventy, Jekyll or VitePress sites to GitHub Pages, with base paths, caching and a 404 page.",{"t":778,"u":779,"d":780},"Reusable Workflows for SSG Builds","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Freusable-workflows-for-ssg-builds\u002F","Share one build, test and deploy pipeline across many static sites with GitHub Actions reusable workflows and composite actions, versioned and called by tag.",{"k":28,"h":782,"items":783},"Incremental Builds and Build Caching for SSGs",[784,788,792,796,800,804,808,812],{"t":785,"u":786,"d":787},"Build Caching on Netlify and Vercel","\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fbuild-caching-on-netlify-and-vercel\u002F","Make Netlify and Vercel reuse dependency, framework and image caches between static site builds, verify cache hits in logs, and measure the savings.",{"t":789,"u":790,"d":791},"Caching Hugo Builds in GitHub Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fcaching-hugo-builds-in-github-actions\u002F","Cache Hugo resources\u002F_gen and the module cache in GitHub Actions with content-hashed keys. Includes the workflow, cache key design, and measured CI minutes saved.",{"t":793,"u":794,"d":795},"Deploying Only Changed Files","\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fdeploying-only-changed-files\u002F","Upload only the files that changed in a static site deploy using content hashes, rsync or S3 sync with checksums, while keeping the deploy atomic and purges scoped.",{"t":797,"u":798,"d":799},"Enabling Incremental Builds in Eleventy","\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fenabling-incremental-builds-in-eleventy\u002F","Use Eleventy --incremental and --ignore-initial to rebuild only changed templates. Covers the programmatic API, what gets rebuilt, and measured rebuild times.",{"t":801,"u":802,"d":803},"Incremental Builds in Astro with the Content Layer","\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fincremental-builds-in-astro-with-the-content-layer\u002F","How the Astro content layer caches entries between builds, how to write loaders with digests, and how to persist the data store in CI so builds stay fast.",{"t":805,"u":806,"d":807},"Measuring Build-Time Regressions in CI","\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fmeasuring-build-time-regressions-in-ci\u002F","Track build duration per commit, separate cache misses from real slowdowns, and set a budget that fails a pull request before a 4-second build becomes a 4-minute one.",{"t":809,"u":810,"d":811},"Remote Caching with Turborepo for SSG Monorepos","\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fremote-caching-with-turborepo-for-ssg-monorepos\u002F","Use Turborepo task hashing and a remote cache to skip rebuilding unchanged sites and packages in a static site monorepo, locally and in CI.",{"t":813,"u":814,"d":815},"Sharing Build Cache Across CI Runners","\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fsharing-build-cache-across-ci-runners\u002F","Share a build cache across parallel CI runners with Turborepo remote cache, an S3-backed store, or scoped actions\u002Fcache. Architecture, signing, and measured savings.",{"k":28,"h":817,"items":818},"Monitoring Static Sites in Production",[819,823,827,831,835,839,843,847,851],{"t":820,"u":821,"d":822},"Alerting on Cache Hit Ratio Drops","\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Falerting-on-cache-hit-ratio-drops\u002F","Measure CDN cache hit ratio for a static site by path prefix, alert on sharp drops against last week, and trace the usual causes: Vary, cookies, query strings.",{"t":824,"u":825,"d":826},"Building a Core Web Vitals Dashboard from RUM Data","\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fbuilding-a-core-web-vitals-dashboard-from-rum-data\u002F","Collect LCP, INP and CLS from real readers with web-vitals, store them cheaply at the edge, and chart p75 by template, device and deploy with attribution.",{"t":828,"u":829,"d":830},"Crawling for Broken Links on a Schedule","\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fcrawling-for-broken-links-on-a-schedule\u002F","Run a weekly crawl of a live static site with lychee, separate internal from external breakage, track link rot as issues, and keep false positives low.",{"t":832,"u":833,"d":834},"Logging 404s at the Edge","\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Flogging-404s-at-the-edge\u002F","Collect every 404 a static site serves at the CDN edge, rank paths by reader impact, separate bots from people, and turn the top of the list into redirects.",{"t":836,"u":837,"d":838},"Monitoring TLS Certificate Expiry","\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fmonitoring-tls-certificate-expiry\u002F","Catch expiring or misconfigured TLS certificates on static site domains before readers do: inventory hostnames, check expiry and chains, and alert on renewal failures.",{"t":840,"u":841,"d":842},"Real-User Error Tracking on Static Sites","\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Freal-user-error-tracking-on-static-sites\u002F","Capture JavaScript errors, failed resources and CSP violations from real readers of a static site with a tiny collector, filter noise from extensions, and alert on new errors.",{"t":844,"u":845,"d":846},"Synthetic Monitoring With Scheduled Playwright Checks","\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fsynthetic-monitoring-with-scheduled-playwright-checks\u002F","Run Playwright checks against a live static site on a schedule: search, forms and navigation, with screenshots on failure, alert routing and run costs.",{"t":848,"u":849,"d":850},"Tracking Deploy Markers in Analytics","\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Ftracking-deploy-markers-in-analytics\u002F","Record every static site deploy as a marker in RUM, analytics and error dashboards, tag data with the build version, and link metric changes to commits.",{"t":852,"u":853,"d":854},"Uptime and Synthetic Checks for Static Sites","\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fuptime-and-synthetic-checks-for-static-sites\u002F","Content-aware synthetic checks for a static site: one URL per template, markers not just status codes, TLS expiry, two regions, and paging only on real outages.",{"k":28,"h":856,"items":857},"Netlify vs Vercel Deployment Strategies",[858,862,866,870,874,878,882,886],{"t":859,"u":860,"d":861},"Configuring Redirects on Vercel for Static Sites","\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fconfiguring-redirects-on-vercel-for-static-sites\u002F","Configure redirects for a static site on Vercel in vercel.json: patterns, status codes, trailing slashes, host redirects and limits, tested in CI.",{"t":863,"u":864,"d":865},"Configuring Vercel for Hugo and Eleventy","\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fconfiguring-vercel-for-hugo-and-eleventy\u002F","Deploy Hugo and Eleventy sites on Vercel with pinned versions, the right output directory, clean URLs, trailing slashes, headers and redirects in vercel.json.",{"t":867,"u":868,"d":869},"Deploying Astro to Vercel as a Fully Static Site","\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fdeploying-astro-to-vercel-as-a-fully-static-site\u002F","Deploy an Astro site to Vercel as pure static output with no functions: skipping the adapter, headers and redirects in vercel.json, and images.",{"t":871,"u":872,"d":873},"Netlify Build Hooks for Content Updates","\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-build-hooks-for-content-updates\u002F","Trigger Netlify rebuilds from a headless CMS without a Git push. Create, secure, time, and debug Netlify build hooks for automated static site content updates.",{"t":875,"u":876,"d":877},"Netlify Deploy Previews for Every Pull Request","\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fsetting-up-deploy-previews-on-netlify-for-every-pull-request\u002F","Turn on Netlify Deploy Previews so every PR gets its own built URL — config, the unique deploy-preview link, scoped env vars, and the automatic PR comment.",{"t":879,"u":880,"d":881},"Netlify Edge Functions for Static Sites","\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-edge-functions-for-static-sites\u002F","Add small pieces of request-time logic to a static site on Netlify with Edge Functions: geolocation, rewrites, header changes and HTML transforms, scoped and cached.",{"t":883,"u":884,"d":885},"Netlify Redirects and Rewrites for Static Sites","\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-redirects-and-rewrites-for-static-sites\u002F","Write Netlify redirects and rewrites in _redirects or netlify.toml: status codes, splats, placeholders, shadowing, proxying and country or language rules.",{"t":887,"u":888,"d":889},"Vercel Build Output API for Custom SSGs","\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fvercel-build-output-api-for-custom-ssgs\u002F","Deploy any static site generator to Vercel with the Build Output API: static files, headers, redirects, cache rules and an optional edge function.",{"k":28,"h":891,"items":892},"Preview Environments for Pull Requests",[893,897,901,905,909,913,917,921],{"t":894,"u":895,"d":896},"Automating Preview Deploy Pipelines with GitHub Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fautomating-preview-deploy-pipelines-with-github-actions\u002F","Build an ephemeral per-PR preview pipeline in GitHub Actions — build the SSG, deploy to a unique URL, comment the link, and tear it down when the PR closes.",{"t":898,"u":899,"d":900},"Cleaning Up Stale Preview Deployments","\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fcleaning-up-stale-preview-deployments\u002F","Preview deploys accumulate: indexed by search engines, holding old secrets, and costing storage. Tear them down on merge, sweep the stragglers, and keep them out of the index.",{"t":902,"u":903,"d":904},"Commenting on Preview Deploys","\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fcommenting-on-preview-deploys\u002F","Post one self-updating pull request comment per preview with the URL, changed pages, checks and screenshots, and collect reviewer feedback on the preview.",{"t":906,"u":907,"d":908},"Password-Protecting Preview Deployments","\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpassword-protecting-preview-deployments\u002F","Keep pull request previews private with platform protection, Cloudflare Access or a small edge function, and keep them out of search indexes with noindex.",{"t":910,"u":911,"d":912},"Preview Deploys for Monorepos","\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpreview-deploys-for-monorepos\u002F","Build and preview only the static sites a pull request affects in a monorepo, with per-site preview URLs, shared package awareness and one combined comment.",{"t":914,"u":915,"d":916},"Previewing Headless CMS Drafts","\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpreviewing-headless-cms-drafts\u002F","Show editors unpublished headless CMS content on a static site: a draft build, on-demand preview routes, or a small preview server, and how to secure each.",{"t":918,"u":919,"d":920},"Pull Request Previews for GitHub Pages Sites","\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpull-request-previews-for-github-pages-sites\u002F","Give a GitHub Pages site a preview per pull request: deploy builds to a preview host or a subfolder, comment the URL, handle base paths and clean up on close.",{"t":922,"u":923,"d":924},"Visual Regression Testing on Preview Deploys","\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fvisual-regression-testing-on-preview-deploys\u002F","Screenshot key templates on every preview deploy with Playwright, compare them with main, and review diffs in the pull request without drowning in noise.",{"k":28,"h":926,"items":927},"Rollbacks and Deploy Safety for Static Sites",[928,932,936,940,944,948,952,956],{"t":929,"u":930,"d":931},"Blue-Green Deploys for Static Sites","\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fblue-green-deploys-for-static-sites\u002F","Run blue-green deploys for a self-hosted static site: two complete environments, verification before switching, an instant switch at the CDN and one-step rollback.",{"t":933,"u":934,"d":935},"Canary Releases for Static Sites","\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fcanary-releases-for-static-sites\u002F","Send a small share of traffic to a new static build before everyone gets it, using Worker gradual deployments or an edge split, and watch errors and vitals.",{"t":937,"u":938,"d":939},"Feature Flags on Static Sites","\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Ffeature-flags-on-static-sites\u002F","Ship code dark and turn features on without a rebuild: build-time flags, edge-evaluated flags and client flags on static sites, and how to avoid flicker.",{"t":941,"u":942,"d":943},"Post-Deploy Verification Checklists","\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fpost-deploy-verification-checklists\u002F","Turn a static site post-deploy checklist into an automated suite: version, key pages, redirects, headers, assets, search and forms, with rollback on failure.",{"t":945,"u":946,"d":947},"Rolling Back Netlify Deploys From the CLI and API","\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frolling-back-netlify-deploys-from-the-cli-and-api\u002F","Roll back a Netlify site to an earlier deploy from the API, the CLI or a GitHub Actions button, lock auto-publishing during incidents, and verify the restore.",{"t":949,"u":950,"d":951},"Rolling Back S3 and CloudFront Deploys With Versioned Prefixes","\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frolling-back-s3-and-cloudfront-deploys-with-versioned-prefixes\u002F","Make S3 and CloudFront deploys atomic by uploading each build to its own prefix and switching CloudFront's origin path, so a rollback takes one config change.",{"t":953,"u":954,"d":955},"Rolling Back a Bad Static Deploy in Under a Minute","\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frolling-back-a-bad-static-deploy-in-under-a-minute\u002F","A per-host runbook for reverting a broken static deploy: find the last good deployment ID, promote it, verify, and communicate — with no rebuild in the critical path.",{"t":957,"u":958,"d":959},"Running Smoke Tests Against a Preview URL","\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frunning-smoke-tests-against-a-preview-url\u002F","Ten seconds of checks against the deployed preview — status codes, template markers, referenced assets, sitemap and redirects — that catch the deploys a build gate cannot.",{"k":28,"h":961,"items":962},"Security Headers and Hardening for Static Sites",[963,967,971,975,979,983,987,991,995,999],{"t":964,"u":965,"d":966},"Auditing npm Dependencies in SSG Pipelines","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fauditing-npm-dependencies-in-ssg-pipelines\u002F","Reduce supply-chain risk in a static site build: lockfiles, npm ci, install-script controls, audit gates, provenance checks and a review step for new packages.",{"t":968,"u":969,"d":970},"Enabling HSTS and Preload Safely","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fenabling-hsts-and-preload-safely\u002F","Roll out Strict-Transport-Security in stages, audit every subdomain before includeSubDomains, and decide whether the HSTS preload list is worth its permanence.",{"t":972,"u":973,"d":974},"Hash-Based CSP for Inline Scripts in Astro","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fhash-based-csp-for-inline-scripts-in-astro\u002F","Compute SHA-256 hashes for every inline script in an Astro build, write them into the CSP header automatically, and keep unsafe-inline out of the policy.",{"t":976,"u":977,"d":978},"Permissions-Policy and Cross-Origin Headers","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fpermissions-policy-and-cross-origin-headers\u002F","Set Permissions-Policy, COOP, CORP and COEP on a static site: disable unused browser features, isolate the browsing context, and avoid breaking embeds and CDNs.",{"t":980,"u":981,"d":982},"Securing Deploy Credentials with GitHub OIDC","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecuring-deploy-credentials-with-github-oidc\u002F","Replace long-lived deploy tokens with short-lived OIDC credentials in GitHub Actions for AWS, Cloudflare and Netlify, scoped to one branch and one deploy job.",{"t":984,"u":985,"d":986},"Security Headers for Static Sites Served by Caddy","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecurity-headers-for-static-sites-served-by-caddy\u002F","Configure HSTS, CSP, framing, referrer and permissions headers in a Caddyfile for a static site, with per-path rules, a snippet and header tests.",{"t":988,"u":989,"d":990},"Security Headers on Vercel for Static Sites","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecurity-headers-on-vercel-for-static-sites\u002F","Add HSTS, CSP, framing, referrer and permissions headers to a static site on Vercel with vercel.json, relax them only on previews, and test each deploy.",{"t":992,"u":993,"d":994},"Subresource Integrity for Third-Party Assets","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsubresource-integrity-for-third-party-assets\u002F","Protect a static site from tampered CDN scripts with Subresource Integrity: when it applies, generating hashes at build time, and when self-hosting is better.",{"t":996,"u":997,"d":998},"Writing a Content Security Policy for a Static Site","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fwriting-a-content-security-policy-for-a-static-site\u002F","Build a Content-Security-Policy for a static site from an inventory of its sources, roll it out in report-only mode, and switch to enforcing without breakage.",{"t":1000,"u":1001,"d":1002},"security.txt and Disclosure for Static Sites","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecurity-txt-and-disclosure-for-static-sites\u002F","Publish a valid security.txt from a static site build, set up a disclosure policy and intake that works, keep the file from expiring, and handle incoming reports.",{"k":28,"h":1004,"items":1005},"Self-Hosting Static Sites on S3, Nginx and Caddy",[1006,1010,1014,1018,1022,1026,1030,1034,1038,1042,1046],{"t":1007,"u":1008,"d":1009},"Brotli and Gzip Precompression Served by Nginx","\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fbrotli-and-gzip-precompression-served-by-nginx\u002F","Serve build-time Brotli and gzip files from Nginx with brotli_static and gzip_static, verify negotiation and Vary headers, and measure bytes and CPU saved.",{"t":1011,"u":1012,"d":1013},"Clean URLs and Trailing Slashes on S3","\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fclean-urls-and-trailing-slashes-on-s3\u002F","Make directory-style URLs work on S3 behind CloudFront: a viewer-request function for index files, one canonical trailing-slash form, and tests that prove it.",{"t":1015,"u":1016,"d":1017},"CloudFront Functions for Redirects","\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fcloudfront-functions-for-redirects\u002F","Serve hundreds of redirects for a static site on S3 from a CloudFront Function and KeyValueStore, generated from the build and tested on every deploy.",{"t":1019,"u":1020,"d":1021},"Deploying a Static Site to S3 and CloudFront","\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fdeploying-a-static-site-to-s3-and-cloudfront\u002F","Deploy a static site to a private S3 bucket behind CloudFront with Origin Access Control, split cache headers, ordered uploads and a targeted invalidation.",{"t":1023,"u":1024,"d":1025},"Hosting on Azure Static Web Apps","\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fhosting-on-azure-static-web-apps\u002F","Deploy a static site to Azure Static Web Apps: routes and headers in one config file, preview environments, custom domains, sign-in and measured speed.",{"t":1027,"u":1028,"d":1029},"Serving a Static Site From a Docker Container With Nginx","\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-from-a-docker-container-with-nginx\u002F","Package a static site in a small Nginx container: multi-stage build, non-root user, read-only filesystem, health checks and running behind a proxy.",{"t":1031,"u":1032,"d":1033},"Serving a Static Site With Caddy and Automatic HTTPS","\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-caddy-and-automatic-https\u002F","Run several static sites on one Caddy server with automatic certificates: DNS and ports, staging CA tests, rate limits, storage and wildcards.",{"t":1035,"u":1036,"d":1037},"Serving a Static Site with Caddy","\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-caddy\u002F","Host a static site on Caddy with automatic HTTPS, clean URLs, precompressed files, cache tiers, security headers and per-pull-request preview subdomains.",{"t":1039,"u":1040,"d":1041},"Serving a Static Site with Nginx","\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-nginx\u002F","A production nginx config for a static site: clean URLs, two cache tiers, brotli, security headers that survive nested blocks, redirects, TLS and the 404 page.",{"t":1043,"u":1044,"d":1045},"Static Hosting on Google Cloud Storage","\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fstatic-hosting-on-google-cloud-storage\u002F","Host a static site on Google Cloud Storage behind a load balancer and Cloud CDN: bucket setup, clean URLs, 404s, cache headers, HTTPS and keyless deploys.",{"t":1047,"u":1048,"d":1049},"Zero-Downtime Deploys with Symlink Swaps","\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fzero-downtime-deploys-with-symlink-swaps\u002F","Deploy a static site to a VM atomically: one directory per release, an atomic symlink swap, one-second rollback, retention and a GitHub Actions workflow.",{"k":28,"h":1051,"items":1052},"Serverless Functions for Static Sites",[1053,1057,1061,1065,1069,1073],{"t":1054,"u":1055,"d":1056},"Adding a Contact Form with Cloudflare Workers","\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fadding-a-contact-form-with-cloudflare-workers\u002F","Build a contact form for a static site on Cloudflare: a Pages Function that validates, checks Turnstile, rate-limits, stores in D1 and emails the team.",{"t":1058,"u":1059,"d":1060},"Handling Form Submissions on a Static Site","\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fhandling-form-submissions-on-a-static-site\u002F","Four ways to accept form submissions on a static site — host forms, form services, your own function, mailto — compared on spam, privacy, cost and page weight.",{"t":1062,"u":1063,"d":1064},"Newsletter Signup with an Edge Function","\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fnewsletter-signup-with-an-edge-function\u002F","Replace a newsletter embed on a static site with a native form and a small edge function: double opt-in, spam protection, consent records and results.",{"t":1066,"u":1067,"d":1068},"Protecting a Static Site Behind Authentication","\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fprotecting-a-static-site-behind-authentication\u002F","Gate a static site or one section of it behind single sign-on with Cloudflare Access or an edge JWT check, without leaking pages through caches or search.",{"t":1070,"u":1071,"d":1072},"Proxying Third-Party APIs from an Edge Function","\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fproxying-third-party-apis-from-an-edge-function\u002F","Serve live third-party data on a static site through an edge proxy: hidden API keys, strict allow-lists, response shaping, caching and graceful fallback.",{"t":1074,"u":1075,"d":1076},"Rate Limiting Edge Functions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Frate-limiting-edge-functions\u002F","Protect the dynamic endpoints of a static site, such as forms and APIs, with edge rate limits: platform rules, Workers bindings, keys and measured effect.",{"k":28,"h":1078,"items":1079},"Testing Static Sites in CI",[1080,1084,1088,1092,1096,1100,1104],{"t":1081,"u":1082,"d":1083},"Accessibility Testing with axe and pa11y in CI","\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Faccessibility-testing-with-axe-and-pa11y-in-ci\u002F","Run axe-core through Playwright and pa11y-ci on sampled pages of a static site in both themes, fail pull requests on new violations and track the rest.",{"t":1085,"u":1086,"d":1087},"End-to-End Tests for Static Sites with Playwright","\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Fend-to-end-tests-for-static-sites-with-playwright\u002F","Protect the few interactive flows on a static site with Playwright: search, theme toggle, mobile menu, copy buttons and forms, run against every preview deploy.",{"t":1089,"u":1090,"d":1091},"Snapshot Testing Build Output","\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Fsnapshot-testing-build-output\u002F","Snapshot a static site’s built HTML in CI: normalize volatile parts, summarize every page, diff key pages fully and review changes in the pull request.",{"t":1093,"u":1094,"d":1095},"Testing Redirects and Headers Before Deploy","\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ftesting-redirects-and-headers-before-deploy\u002F","Table-driven tests for redirects, cache and security headers on a static site, generated from the redirect map and run against every preview before production.",{"t":1097,"u":1098,"d":1099},"Testing Search and Navigation Flows With Playwright","\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ftesting-search-and-navigation-flows-with-playwright\u002F","Test the interactive parts of a static docs site with Playwright: search results and keyboard use, mobile menus, sidebar state, versions and 404s.",{"t":1101,"u":1102,"d":1103},"Testing Structured Data and Meta Tags","\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ftesting-structured-data-and-meta-tags\u002F","Check titles, descriptions, canonicals, Open Graph tags and JSON-LD on every built page in CI, including cross-page duplicates and FAQ text that must match.",{"t":1105,"u":1106,"d":1107},"Validating HTML Output in CI","\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Fvalidating-html-output-in-ci\u002F","Validate every built page of a static site with html-validate in CI: choose rules, ignore third-party markup, baseline existing errors and fail on new ones.",{"k":28,"h":1109,"items":1110},"Other kinds of guide",[1111,1115,1119],{"t":1112,"u":1113,"d":1114},"Fixes","\u002Fguides\u002Ffixes\u002F","Starts from a symptom and ends at the cause and the fix.",{"t":1116,"u":1117,"d":1118},"Comparisons","\u002Fguides\u002Fcomparisons\u002F","Weighs two or more options against measured criteria.",{"t":1120,"u":1121,"d":1122},"Concepts","\u002Fguides\u002Fconcepts\u002F","Explains how something works and when it matters.",1790943190465]