[{"data":1,"prerenderedAt":356},["ShallowReactive",2],{"hub:guides-fixes":3},{"path":4,"key":5,"title":6,"h1":7,"description":8,"crumbs":9,"blocks":17},"\u002Fguides\u002Ffixes\u002F","guides-fixes","Fixes for Static Site Performance and Build Problems","Fixes","Symptom-first guides for static site problems: layout shift, slow LCP, builds that run out of memory, flaky Lighthouse scores and broken assets after deploys.",[10,13,16],[11,12],"Home","\u002F",[14,15],"Guides","\u002Fguides\u002F",[7,4],[18,21,23,26,38,40,59,66,81,88,99,106,113,120,131,138,149,184,191,198,209,211,238,245,252,259,266,273,280,287,298,305,316,327,334,341],{"k":19,"text":20},"p","A fix starts where you are: with something you can see. The page jumps as it loads. Lighthouse gives a different score on every run of the same commit. A build that used to finish in a couple of minutes now runs out of memory on the CI runner. Readers with a tab open across a deploy report that search stopped working. Each guide here names the symptom in its title, shows how to confirm which of the usual causes you actually have, and then fixes that cause — with the before and after numbers.",{"k":19,"text":22},"They are grouped by topic below. Layout-shift and LCP fixes dominate because those are the Core Web Vitals that static sites fail most often in the field while passing in the lab; the build-time fixes follow, and then the operational ones.",{"k":24,"html":25},"fig","\u003Cfigure>\n\u003Csvg viewBox=\"0 0 760 138\" role=\"img\" aria-labelledby=\"hub-fixes-hero-title hub-fixes-hero-desc\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\">\n  \u003Ctitle id=\"hub-fixes-hero-title\">From symptom to verified fix\u003C\u002Ftitle>\n  \u003Cdesc id=\"hub-fixes-hero-desc\">Four stages. Observe the symptom in field data or logs. Reproduce it locally under throttling. Identify which of the known causes applies. Apply the fix and verify in the field that the number moved.\u003C\u002Fdesc>\n  \u003Crect x=\"0\" y=\"0\" width=\"760\" height=\"138\" fill=\"#ffffff\"\u002F>\n  \u003Cg style=\"font-family:system-ui, sans-serif;font-size:12px\">\n    \u003Crect x=\"20.0\" y=\"64.0\" width=\"154.5\" height=\"58.0\" rx=\"8\" fill=\"#ff595e\" opacity=\"0.12\" stroke=\"#d83b41\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Crect x=\"208.5\" y=\"64.0\" width=\"154.5\" height=\"58.0\" rx=\"8\" fill=\"#ffca3a\" opacity=\"0.24\" stroke=\"#a97b00\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Cpath d=\"M176.5 93.0 L204.5 93.0\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:2px;marker-end:url(#hub-fixes-hero-arrow)\"\u002F>\n    \u003Crect x=\"397.0\" y=\"64.0\" width=\"154.5\" height=\"58.0\" rx=\"8\" fill=\"#6a4c93\" opacity=\"0.14\" stroke=\"#6a4c93\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Cpath d=\"M365.0 93.0 L393.0 93.0\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:2px;marker-end:url(#hub-fixes-hero-arrow)\"\u002F>\n    \u003Crect x=\"585.5\" y=\"64.0\" width=\"154.5\" height=\"58.0\" rx=\"8\" fill=\"#8ac926\" opacity=\"0.2\" stroke=\"#5a8a16\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Cpath d=\"M553.5 93.0 L581.5 93.0\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:2px;marker-end:url(#hub-fixes-hero-arrow)\"\u002F>\n    \u003Ctext x=\"380.0\" y=\"30.0\" fill=\"#1f2937\" style=\"font-size:16px;text-anchor:middle;font-weight:700\">How a fix is structured\u003C\u002Ftext>\n    \u003Ctext x=\"97.2\" y=\"90.8\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Observe\u003C\u002Ftext>\n    \u003Ctext x=\"97.2\" y=\"107.7\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">field data or logs\u003C\u002Ftext>\n    \u003Ctext x=\"285.8\" y=\"90.8\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Reproduce\u003C\u002Ftext>\n    \u003Ctext x=\"285.8\" y=\"107.7\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">throttled, locally\u003C\u002Ftext>\n    \u003Ctext x=\"474.2\" y=\"90.8\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Identify the cause\u003C\u002Ftext>\n    \u003Ctext x=\"474.2\" y=\"107.7\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">one of the known few\u003C\u002Ftext>\n    \u003Ctext x=\"662.8\" y=\"90.8\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Fix and verify\u003C\u002Ftext>\n    \u003Ctext x=\"662.8\" y=\"107.7\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">field number moves\u003C\u002Ftext>\n  \u003C\u002Fg>\n  \u003Cdefs>\n    \u003Cmarker id=\"hub-fixes-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>Field data comes first and last: a fix is only done when the field number moves, not when the lab score does.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>",{"k":27,"h":28,"items":29},"group","Accessibility for Static Sites",[30,34],{"t":31,"u":32,"d":33},"Fixing Heading Order Problems in Markdown Content","\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Ffixing-heading-order-problems-in-markdown-content\u002F","Find and fix skipped heading levels, duplicate H1s and headings used for styling in Markdown, then lint for them in CI so the page outline stays usable.",{"t":35,"u":36,"d":37},"Fixing Low Color Contrast Flagged by Lighthouse","\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Ffixing-low-color-contrast-flagged-by-lighthouse\u002F","Trace Lighthouse and axe contrast failures on a static site back to a few design tokens, pick compliant replacements and keep them passing in both themes.",{"k":24,"html":39},"\u003Cfigure>\n\u003Csvg viewBox=\"0 0 760 346\" role=\"img\" aria-labelledby=\"hub-fixes-topics-title hub-fixes-topics-desc\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\">\n  \u003Ctitle id=\"hub-fixes-topics-title\">Number of fixes per topic, largest first\u003C\u002Ftitle>\n  \u003Cdesc id=\"hub-fixes-topics-desc\">Horizontal bars. Cumulative Layout Shift Fixes for Static Sites 8, Largest Contentful Paint Optimization for Static Sites 6, Astro vs Eleventy for Documentation Sites 4, Hugo Build Times for Large Repositories 3, Jekyll Plugin Ecosystem 2, Rollbacks and Deploy Safety for Static Sites 2, Accessibility for Static Sites 2 and Technical SEO for Static Sites 2.\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=\"365.6\" height=\"20.0\" rx=\"3\" fill=\"#ff595e\" opacity=\"0.3\" stroke=\"#d83b41\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"99.0\" width=\"274.2\" height=\"20.0\" rx=\"3\" fill=\"#ff595e\" opacity=\"0.3\" stroke=\"#d83b41\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"133.0\" width=\"182.8\" height=\"20.0\" rx=\"3\" fill=\"#ff595e\" opacity=\"0.3\" stroke=\"#d83b41\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"167.0\" width=\"137.1\" height=\"20.0\" rx=\"3\" fill=\"#ff595e\" opacity=\"0.3\" stroke=\"#d83b41\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"201.0\" width=\"91.4\" height=\"20.0\" rx=\"3\" fill=\"#ff595e\" opacity=\"0.3\" stroke=\"#d83b41\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"235.0\" width=\"91.4\" height=\"20.0\" rx=\"3\" fill=\"#ff595e\" opacity=\"0.3\" stroke=\"#d83b41\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"269.0\" width=\"91.4\" height=\"20.0\" rx=\"3\" fill=\"#ff595e\" opacity=\"0.3\" stroke=\"#d83b41\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"303.0\" width=\"91.4\" height=\"20.0\" rx=\"3\" fill=\"#ff595e\" opacity=\"0.3\" stroke=\"#d83b41\" 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 fixes\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"79.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Cumulative Layout Shift Fixes\u003C\u002Ftext>\n    \u003Ctext x=\"723.6\" y=\"79.5\" fill=\"#b32b30\" style=\"font-size:12px;text-anchor:start;font-weight:700\">8\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"113.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Largest Contentful Paint Optimization\u003C\u002Ftext>\n    \u003Ctext x=\"632.2\" y=\"113.5\" fill=\"#b32b30\" style=\"font-size:12px;text-anchor:start;font-weight:700\">6\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"147.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Astro vs Eleventy for Documentation…\u003C\u002Ftext>\n    \u003Ctext x=\"540.8\" y=\"147.5\" fill=\"#b32b30\" style=\"font-size:12px;text-anchor:start;font-weight:700\">4\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"181.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Hugo Build Times for Large Repositories\u003C\u002Ftext>\n    \u003Ctext x=\"495.1\" y=\"181.5\" fill=\"#b32b30\" style=\"font-size:12px;text-anchor:start;font-weight:700\">3\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"215.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Jekyll Plugin Ecosystem\u003C\u002Ftext>\n    \u003Ctext x=\"449.4\" y=\"215.5\" fill=\"#b32b30\" style=\"font-size:12px;text-anchor:start;font-weight:700\">2\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"249.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Rollbacks and Deploy Safety\u003C\u002Ftext>\n    \u003Ctext x=\"449.4\" y=\"249.5\" fill=\"#b32b30\" style=\"font-size:12px;text-anchor:start;font-weight:700\">2\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"283.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Accessibility\u003C\u002Ftext>\n    \u003Ctext x=\"449.4\" y=\"283.5\" fill=\"#b32b30\" style=\"font-size:12px;text-anchor:start;font-weight:700\">2\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"317.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Technical SEO\u003C\u002Ftext>\n    \u003Ctext x=\"449.4\" y=\"317.5\" fill=\"#b32b30\" style=\"font-size:12px;text-anchor:start;font-weight:700\">2\u003C\u002Ftext>\n  \u003C\u002Fg>\n\u003C\u002Fsvg>\n\u003Cfigcaption>The 8 topics with the most fixes, out of 30 topics that have any.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>",{"k":27,"h":41,"items":42},"Astro vs Eleventy for Documentation Sites",[43,47,51,55],{"t":44,"u":45,"d":46},"Fixing Astro Build Errors After Upgrading to Astro 5","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Ffixing-astro-build-errors-after-upgrading-to-astro-5\u002F","Work through the build errors an Astro 4 site hits on Astro 5, from legacy collections and slug to removed hybrid output, and prove the URLs did not change.",{"t":48,"u":49,"d":50},"Fixing Duplicate Permalink Errors in Eleventy","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Ffixing-duplicate-permalink-errors-in-eleventy\u002F","Find which templates produce the same output path in Eleventy, fix the usual causes in pagination, slugs and data files, and catch collisions in CI.",{"t":52,"u":53,"d":54},"Fixing Eleventy Out-of-Memory Errors on Large Collections","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Ffixing-eleventy-out-of-memory-errors-on-large-collections\u002F","Diagnose \"JavaScript heap out of memory\" in Eleventy builds of large collections, cut peak memory with data and template fixes, and size the Node heap safely.",{"t":56,"u":57,"d":58},"Fixing Slow Astro Builds Caused by Large MDX Collections","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Ffixing-slow-astro-builds-caused-by-large-mdx-collections\u002F","Find why an Astro build with thousands of MDX files is slow, then convert plain pages to Markdown, trim plugins and cache the content layer in CI.",{"k":27,"h":60,"items":61},"Docs Frameworks: Docusaurus, Starlight and VitePress",[62],{"t":63,"u":64,"d":65},"Fixing Broken Links Reported by Docusaurus Builds","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Ffixing-broken-links-reported-by-docusaurus-builds\u002F","Read Docusaurus broken link and anchor reports, fix the common causes from relative paths to versioned docs, and make the build fail on new breaks.",{"k":27,"h":67,"items":68},"Hugo Build Times for Large Repositories",[69,73,77],{"t":70,"u":71,"d":72},"Fixing Hugo Builds That Fail After a Version Upgrade","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Ffixing-hugo-builds-that-fail-after-a-version-upgrade\u002F","Diagnose Hugo build failures after an upgrade, from removed functions and pagination changes to output differences, then pin Hugo so it cannot recur.",{"t":74,"u":75,"d":76},"Fixing Hugo Builds That Slow Down After Adding Taxonomies","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Ffixing-hugo-builds-that-slow-down-after-adding-taxonomies\u002F","Find why a Hugo build got slower after adding tags or categories, then fix the term templates, related content and pagination that multiply the work.",{"t":78,"u":79,"d":80},"Reducing Hugo Memory Usage on CI Runners","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Freducing-hugo-memory-usage-on-ci-runners\u002F","Why large Hugo builds run out of memory in CI, how to measure peak usage, and the settings, template changes and image strategies that cut it by more than half.",{"k":27,"h":82,"items":83},"Internationalization for Static Sites",[84],{"t":85,"u":86,"d":87},"Fixing Hreflang Errors Reported in Search Console","\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Ffixing-hreflang-errors-reported-in-search-console\u002F","Diagnose missing return links, wrong language codes and non-canonical targets in hreflang on a static site, fix them in the templates, and test them in CI.",{"k":27,"h":89,"items":90},"Jekyll Plugin Ecosystem",[91,95],{"t":92,"u":93,"d":94},"Fixing Jekyll Builds That Break After a Ruby Upgrade","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Ffixing-jekyll-builds-that-break-after-a-ruby-upgrade\u002F","Fix the errors Jekyll sites hit on new Ruby versions, from missing webrick and stdlib gems to native extensions and date changes, then pin Ruby.",{"t":96,"u":97,"d":98},"Speeding Up Slow Jekyll Builds","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fspeeding-up-slow-jekyll-builds\u002F","Profile a slow Jekyll build, find the Liquid loops and plugins that dominate it, and apply caching and template fixes that cut build time by over 80%.",{"k":27,"h":100,"items":101},"Migrating Between Static Site Generators",[102],{"t":103,"u":104,"d":105},"Recovering Search Traffic Lost After a Generator Migration","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Frecovering-search-traffic-lost-after-a-generator-migration\u002F","Find why organic traffic dropped after moving to a new static site generator, from missing redirects to lost metadata, and recover it with measured steps.",{"k":27,"h":107,"items":108},"Next.js Static Export for Content Sites",[109],{"t":110,"u":111,"d":112},"Fixing 404s on Refresh in Next.js Static Export","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Ffixing-404s-on-refresh-in-nextjs-static-export\u002F","Fix pages that work when navigated to but 404 on refresh or direct load in a Next.js static export, by matching file layout, trailing slashes and host rules.",{"k":27,"h":114,"items":115},"Search for Static Sites",[116],{"t":117,"u":118,"d":119},"Fixing Missing Results in Pagefind Indexes","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Ffixing-missing-results-in-pagefind-indexes\u002F","Find why pages or sections are missing from Pagefind search results, from data-pagefind-body scoping to build order and language, and verify the index in CI.",{"k":27,"h":121,"items":122},"Technical SEO for Static Sites",[123,127],{"t":124,"u":125,"d":126},"Fixing Pages Crawled but Not Indexed on Static Sites","\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Ffixing-pages-crawled-but-not-indexed-on-static-sites\u002F","Work through Search Console's crawled but not indexed status on a static site: thin and duplicate pages, weak internal links and templates that hide content.",{"t":128,"u":129,"d":130},"Fixing Soft 404s on Static Hosts","\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Ffixing-soft-404s-on-static-hosts\u002F","Find and fix soft 404s on static sites, from SPA fallback rewrites and 200-status error pages to empty list pages, on Cloudflare, Netlify, S3 and Nginx.",{"k":27,"h":132,"items":133},"CDN Caching Rules for SSGs",[134],{"t":135,"u":136,"d":137},"Fixing Stale HTML After Deploys on Cloudflare","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Ffixing-stale-html-after-deploys-on-cloudflare\u002F","Find why readers see old pages after a deploy on Cloudflare, from Cache Everything rules and browser max-age to service workers, and fix each with a test.",{"k":27,"h":139,"items":140},"CSS and JavaScript Asset Optimization",[141,145],{"t":142,"u":143,"d":144},"Fixing Missing Tailwind Classes in Production Builds","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Ffixing-missing-tailwind-classes-in-production-builds\u002F","Fix styles that work locally but vanish in production with Tailwind: dynamic class names, unscanned files, Markdown content and safelists, plus a CI check.",{"t":146,"u":147,"d":148},"Fixing Unused JavaScript Warnings on Static Pages","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Ffixing-unused-javascript-warnings-on-static-pages\u002F","Trace Lighthouse's reduce unused JavaScript warning on a static site to its sources, from site-wide bundles to hydration and third parties, and fix each.",{"k":27,"h":150,"items":151},"Cumulative Layout Shift Fixes for Static Sites",[152,156,160,164,168,172,176,180],{"t":153,"u":154,"d":155},"CLS from Client-Side Rendered Components","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Fcls-from-client-side-rendered-components\u002F","Stop islands and client-rendered widgets from shifting static pages: server-render the initial state, reserve space, and avoid content swaps after hydration.",{"t":157,"u":158,"d":159},"Debugging CLS with the Layout Instability API","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Fdebugging-cls-with-the-layout-instability-api\u002F","Find the exact elements behind layout shifts on a static site with PerformanceObserver, attribution data from web-vitals and DevTools, then fix each shift.",{"t":161,"u":162,"d":163},"Eliminating Layout Shift From Web Fonts","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Feliminating-layout-shift-from-web-fonts\u002F","Kill font-swap CLS with size-adjust, ascent-override and a preloaded subset. Includes how to compute the override values and the measured 0.14 to 0.00 result.",{"t":165,"u":166,"d":167},"Fixing CLS From Dynamic Table of Contents Widgets","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-dynamic-table-of-contents-widgets\u002F","Stop table of contents widgets built in the browser from shifting docs pages: render the list at build time, reserve the sidebar, and tame scroll-spy.",{"t":169,"u":170,"d":171},"Fixing CLS From Images Without Dimensions in Markdown","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-images-without-dimensions-in-markdown\u002F","Add width and height to every Markdown image at build time in Astro, Eleventy and Hugo, so images stop shifting content as they load, and check it in CI.",{"t":173,"u":174,"d":175},"Fixing CLS From Late-Loading Embeds","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-late-loading-embeds\u002F","Comment threads, video players, maps and consent banners land after paint and push the page around. Reserve their space at build time and take overlays out of flow.",{"t":177,"u":178,"d":179},"Fixing CLS from Cookie Banners","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-cookie-banners\u002F","Consent banners are a leading cause of layout shift on static sites. Overlay them, keep them compact, and keep the consent script off the critical path.",{"t":181,"u":182,"d":183},"Fixing CLS from Sticky Headers and Anchor Links","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-sticky-headers-and-anchor-links\u002F","Sticky headers that change height, shrink on scroll or hide anchor targets cause layout shift and lost headings. Fix them with fixed heights and scroll-padding.",{"k":27,"h":185,"items":186},"Font Loading Strategies for Static Sites",[187],{"t":188,"u":189,"d":190},"Fixing Invisible Text While Web Fonts Load","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Ffixing-invisible-text-while-web-fonts-load\u002F","Find why text stays invisible while web fonts load on a static site, from missing font-display to icon fonts and CSS imports, and fix it without shift.",{"k":27,"h":192,"items":193},"Image Optimization Pipelines in Astro",[194],{"t":195,"u":196,"d":197},"Fixing Blurry Images From astro:assets Resizing","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Ffixing-blurry-images-from-astro-assets-resizing\u002F","Find why images from Astro's Image and Picture components look soft on high-density screens, and fix widths, sizes, densities and quality settings.",{"k":27,"h":199,"items":200},"JavaScript Hydration & Partial Rendering",[201,205],{"t":202,"u":203,"d":204},"Fixing Hydration Mismatch Errors in Astro Islands","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Ffixing-hydration-mismatch-errors-in-astro-islands\u002F","Track down hydration mismatch warnings in React, Preact and Vue islands on Astro pages, from dates to invalid HTML, and fix them without client:only.",{"t":206,"u":207,"d":208},"Fixing Poor INP on Static Pages With Heavy Widgets","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Ffixing-poor-inp-on-static-pages-with-heavy-widgets\u002F","Find which widget makes INP poor on an otherwise static page, then fix it with deferred hydration, yielding, lighter event handlers and smaller re-renders.",{"k":24,"html":210},"\u003Cfigure>\n\u003Csvg viewBox=\"0 0 760 295\" role=\"img\" aria-labelledby=\"hub-fixes-sections-title hub-fixes-sections-desc\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\">\n  \u003Ctitle id=\"hub-fixes-sections-title\">Number of fixes in each section\u003C\u002Ftitle>\n  \u003Cdesc id=\"hub-fixes-sections-desc\">Vertical bars: Framework selection 18, Performance 24 and Deployment 13. As a share of all guides in the section: Framework selection 15%, Performance 23%, Deployment 11%.\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=\"118.5\" width=\"90.0\" height=\"127.5\" rx=\"3\" fill=\"#6a4c93\" opacity=\"0.3\" stroke=\"#6a4c93\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"335.0\" y=\"76.0\" width=\"90.0\" height=\"170.0\" rx=\"3\" fill=\"#1982c4\" opacity=\"0.3\" stroke=\"#1982c4\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"561.7\" y=\"153.9\" width=\"90.0\" height=\"92.1\" 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\">Fixes in each section\u003C\u002Ftext>\n    \u003Ctext x=\"153.3\" y=\"111.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:middle;font-weight:700\">18\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=\"69.0\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:middle;font-weight:700\">24\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=\"146.9\" fill=\"#3f6410\" style=\"font-size:12px;text-anchor:middle;font-weight:700\">13\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>55 fixes in total. As a share of each section: framework selection 15%, performance 23%, deployment 11%.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>",{"k":27,"h":212,"items":213},"Largest Contentful Paint Optimization for Static Sites",[214,218,222,226,230,234],{"t":215,"u":216,"d":217},"Eliminating Render-Blocking CSS on Static Sites","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Feliminating-render-blocking-css-on-static-sites\u002F","Inline critical CSS, defer the rest, and purge unused rules to cut render delay on static sites — with measured LCP and FCP before\u002Fafter from Lighthouse.",{"t":219,"u":220,"d":221},"Fixing LCP Regressions Caused by Cookie Consent Tools","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Ffixing-lcp-regressions-caused-by-cookie-consent-tools\u002F","Find how a cookie consent tool delays LCP on a static site, from render-blocking scripts to banners becoming the LCP element, and fix it compliantly.",{"t":223,"u":224,"d":225},"Fixing LCP When the Hero Is a Background Image","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Ffixing-lcp-when-the-hero-is-a-background-image\u002F","When a hero is a CSS background image, the browser finds it late and cannot prioritise it. Move it to an img, or preload it, and measure the LCP difference.",{"t":227,"u":228,"d":229},"Fixing LCP on Text-Heavy Documentation Pages","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Ffixing-lcp-on-text-heavy-documentation-pages\u002F","When the LCP element is a paragraph or heading, images are not the problem. Fix TTFB, render-blocking CSS and web fonts to speed up text-heavy docs pages.",{"t":231,"u":232,"d":233},"Fixing Slow LCP on Pages With Embedded Video","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Ffixing-slow-lcp-on-pages-with-embedded-video\u002F","Fix slow LCP on static pages with hero or embedded video: poster images as the LCP element, preloading, facades for YouTube and Vimeo, and lighter autoplay.",{"t":235,"u":236,"d":237},"Reducing LCP from Hero Images on Static Sites","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Freducing-lcp-from-hero-images-on-static-sites\u002F","Size, format, and preload hero images to cut LCP on static sites — responsive srcset, AVIF\u002FWebP, explicit dimensions, and why you must never lazy-load the hero.",{"k":27,"h":239,"items":240},"Performance Budgets and Lighthouse CI",[241],{"t":242,"u":243,"d":244},"Reducing Lighthouse Score Variance in CI","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Freducing-lighthouse-score-variance-in-ci\u002F","Why Lighthouse numbers jump between identical CI runs, and the six changes that shrank LCP spread from 800 ms to 90 ms so timing budgets can safely fail builds.",{"k":27,"h":246,"items":247},"Resource Hints and Navigation Speed",[248],{"t":249,"u":250,"d":251},"Fixing Wasted Preloads Flagged by Chrome","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Ffixing-wasted-preloads-flagged-by-chrome\u002F","Decode Chrome's preloaded-but-not-used and credentials-mode warnings, fix crossorigin, as and srcset mismatches, and remove stray generator preloads.",{"k":27,"h":253,"items":254},"Third-Party Script Performance on Static Sites",[255],{"t":256,"u":257,"d":258},"Fixing Main-Thread Blocking From Chat Widgets","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Ffixing-main-thread-blocking-from-chat-widgets\u002F","Measure how much main-thread time a support chat widget takes on a static site, then cut it with delayed loading, page targeting and a click-to-load launcher.",{"k":27,"h":260,"items":261},"Cloudflare Pages Edge Caching Setup",[262],{"t":263,"u":264,"d":265},"Fixing Redirect Loops on Cloudflare Pages","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Ffixing-redirect-loops-on-cloudflare-pages\u002F","Diagnose too many redirects on Cloudflare Pages, from SSL mode and trailing-slash rules to _redirects patterns and Page Rules, and fix each with a curl trace.",{"k":27,"h":267,"items":268},"GitHub Actions for Automated SSG Builds",[269],{"t":270,"u":271,"d":272},"Fixing Flaky Static Site Builds in GitHub Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Ffixing-flaky-static-site-builds-in-github-actions\u002F","Track down static site builds that fail intermittently in GitHub Actions, from network fetches and cache races to memory limits and timing tests.",{"k":27,"h":274,"items":275},"Incremental Builds and Build Caching for SSGs",[276],{"t":277,"u":278,"d":279},"Fixing Stale Pages From Incremental Builds","\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Ffixing-stale-pages-from-incremental-builds\u002F","Find why incremental builds leave some pages out of date, from untracked dependencies and global data to deleted files, and fix them without full rebuilds.",{"k":27,"h":281,"items":282},"Monitoring Static Sites in Production",[283],{"t":284,"u":285,"d":286},"Finding the Cause of a Sudden Field LCP Drop","\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Ffinding-the-cause-of-a-sudden-field-lcp-drop\u002F","Work out why field LCP suddenly worsened on a static site: segment RUM data, line it up with deploys and third-party changes, and confirm the cause in the lab.",{"k":27,"h":288,"items":289},"Netlify vs Vercel Deployment Strategies",[290,294],{"t":291,"u":292,"d":293},"Fixing Netlify Builds That Exceed the Time Limit","\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Ffixing-netlify-builds-that-exceed-the-time-limit\u002F","Diagnose Netlify builds cancelled for exceeding the time limit, then cut build time with caching, skipped work and leaner dependency installs.",{"t":295,"u":296,"d":297},"Fixing Vercel Builds That Run Out of Memory","\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Ffixing-vercel-builds-that-run-out-of-memory\u002F","Diagnose static site builds killed for memory on Vercel, from heap limits and image concurrency to huge data files, and fix them on the same machine.",{"k":27,"h":299,"items":300},"Preview Environments for Pull Requests",[301],{"t":302,"u":303,"d":304},"Fixing Preview Deploys Leaking Into Search Results","\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Ffixing-preview-deploys-leaking-into-search-results\u002F","Remove preview and staging deploys from search results and stop new ones being indexed with X-Robots-Tag headers, canonicals, and removal requests per host.",{"k":27,"h":306,"items":307},"Rollbacks and Deploy Safety for Static Sites",[308,312],{"t":309,"u":310,"d":311},"Keeping Old Assets Alive After Deploy","\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fkeeping-old-assets-alive-after-deploy\u002F","Stop open tabs from breaking after a static site deploy: keep previous hashed assets for days, handle chunk load errors, and clean up old files safely.",{"t":313,"u":314,"d":315},"Recovering From a Deploy That Deleted Live Assets","\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frecovering-from-a-deploy-that-deleted-live-assets\u002F","An incident walkthrough: a sync with --delete removed hashed assets that cached HTML still referenced. How it was found, recovered in minutes and prevented.",{"k":27,"h":317,"items":318},"Security Headers and Hardening for Static Sites",[319,323],{"t":320,"u":321,"d":322},"Fixing Content Security Policy Violations From Inline Scripts","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Ffixing-content-security-policy-violations-from-inline-scripts\u002F","Trace CSP inline-script violations on a static site from reports to sources, then fix each with hashes, external files or removed handlers.",{"t":324,"u":325,"d":326},"Fixing Mixed Content Warnings After Moving to HTTPS","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Ffixing-mixed-content-warnings-after-moving-to-https\u002F","Find every http:\u002F\u002F reference in a static site's content, templates and data after moving to HTTPS, fix it at the source, and block new ones in CI.",{"k":27,"h":328,"items":329},"Serverless Functions for Static Sites",[330],{"t":331,"u":332,"d":333},"Fixing Cold Starts in Netlify Functions for Forms","\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Ffixing-cold-starts-in-netlify-functions-for-forms\u002F","Measure and cut cold-start latency in a Netlify Function behind a static site's form: smaller bundles, lazy imports, regions and honest UI states.",{"k":27,"h":335,"items":336},"Testing Static Sites in CI",[337],{"t":338,"u":339,"d":340},"Fixing Flaky Playwright Tests Against Preview Deploys","\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ffixing-flaky-playwright-tests-against-preview-deploys\u002F","Stabilise Playwright tests that run against preview URLs: wait for the right deploy, warm caches, drop timing assumptions and isolate third parties.",{"k":27,"h":342,"items":343},"Other kinds of guide",[344,348,352],{"t":345,"u":346,"d":347},"How-tos","\u002Fguides\u002Fhow-to\u002F","A task, end to end, with configuration and measured results.",{"t":349,"u":350,"d":351},"Comparisons","\u002Fguides\u002Fcomparisons\u002F","Weighs two or more options against measured criteria.",{"t":353,"u":354,"d":355},"Concepts","\u002Fguides\u002Fconcepts\u002F","Explains how something works and when it matters.",1790943190465]