[{"data":1,"prerenderedAt":2706},["ShallowReactive",2],{"page:\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads":3,"all-docs-nav":1560,"filed:\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads":2700},{"id":4,"title":5,"body":6,"breadcrumb":1536,"dateModified":1545,"datePublished":1545,"description":1546,"extension":1547,"faq":1548,"meta":1553,"navigation":1554,"path":1555,"seo":1556,"slug":12,"stem":1557,"type":1558,"__hash__":1559},"content\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads\u002Findex.md","Auditing Unused Preloads",{"type":7,"value":8,"toc":1518},"minimark",[9,13,21,30,35,64,68,79,166,174,177,181,184,349,526,530,533,585,606,617,621,624,1071,1074,1159,1163,1166,1254,1345,1348,1352,1366,1370,1433,1437,1440,1444,1449,1452,1456,1459,1463,1466,1470,1473,1477,1514],[10,11,5],"h1",{"id":12},"auditing-unused-preloads",[14,15,16,20],"p",{},[17,18,19],"code",{},"\u003Clink rel=\"preload\">"," is the sharpest tool in the resource-hint kit and the one most often misused. A preload says \"fetch this now, at high priority, before you discover you need it.\" Used for the one late-discovered critical resource on a page — usually a web font or a CSS background hero — it can take hundreds of milliseconds off LCP. Used for anything else, it takes bandwidth away from the resources that actually decide LCP, and on a static site with shared layouts, one bad preload is repeated on every page.",[14,22,23,24,29],{},"This guide audits every preload on a 600-page Hugo site, classifies each one, removes the harmful ones and adds a CI check so they do not come back. It is part of ",[25,26,28],"a",{"href":27},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002F","Resource Hints and Navigation Speed",".",[31,32,34],"h2",{"id":33},"prerequisites","Prerequisites",[36,37,38,54,57],"ul",{},[39,40,41,42,45,46,49,50,53],"li",{},"The built site's HTML output (",[17,43,44],{},"public\u002F"," for Hugo, ",[17,47,48],{},"dist\u002F"," for Astro, ",[17,51,52],{},"_site\u002F"," for Eleventy).",[39,55,56],{},"Chrome DevTools, for confirming the effect on individual templates.",[39,58,59,60,29],{},"Lighthouse or Lighthouse CI to measure LCP before and after — see ",[25,61,63],{"href":62},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fsetting-up-lighthouse-ci-for-a-static-site\u002F","Setting Up Lighthouse CI for a Static Site",[31,65,67],{"id":66},"step-1-inventory-every-preload-in-the-build","Step 1: Inventory Every Preload in the Build",[14,69,70,71,74,75,78],{},"Because a static site's HTML is all on disk, the inventory is a script, not a crawl. Collect every ",[17,72,73],{},"preload"," and ",[17,76,77],{},"modulepreload"," tag, grouped by template:",[80,81,86],"pre",{"className":82,"code":83,"language":84,"meta":85,"style":85},"language-bash shiki shiki-themes github-light github-dark","# count preload hrefs across all built pages\ngrep -rhoE '\u003Clink[^>]+rel=\"(module)?preload\"[^>]*>' public --include=index.html \\\n  | grep -oE 'href=\"[^\"]+\"' | sort | uniq -c | sort -rn | head -20\n","bash","",[17,87,88,97,121],{"__ignoreMap":85},[89,90,93],"span",{"class":91,"line":92},"line",1,[89,94,96],{"class":95},"sJ8bj","# count preload hrefs across all built pages\n",[89,98,100,104,108,112,115,118],{"class":91,"line":99},2,[89,101,103],{"class":102},"sScJk","grep",[89,105,107],{"class":106},"sj4cs"," -rhoE",[89,109,111],{"class":110},"sZZnC"," '\u003Clink[^>]+rel=\"(module)?preload\"[^>]*>'",[89,113,114],{"class":110}," public",[89,116,117],{"class":106}," --include=index.html",[89,119,120],{"class":106}," \\\n",[89,122,124,128,131,134,137,140,143,145,148,151,153,155,158,160,163],{"class":91,"line":123},3,[89,125,127],{"class":126},"szBVR","  |",[89,129,130],{"class":102}," grep",[89,132,133],{"class":106}," -oE",[89,135,136],{"class":110}," 'href=\"[^\"]+\"'",[89,138,139],{"class":126}," |",[89,141,142],{"class":102}," sort",[89,144,139],{"class":126},[89,146,147],{"class":102}," uniq",[89,149,150],{"class":106}," -c",[89,152,139],{"class":126},[89,154,142],{"class":102},[89,156,157],{"class":106}," -rn",[89,159,139],{"class":126},[89,161,162],{"class":102}," head",[89,164,165],{"class":106}," -20\n",[80,167,172],{"className":168,"code":170,"language":171,"meta":85},[169],"language-text","    612 href=\"\u002Ffonts\u002Finter-400.woff2\"\n    612 href=\"\u002Ffonts\u002Finter-500.woff2\"\n    612 href=\"\u002Ffonts\u002Finter-600.woff2\"\n    612 href=\"\u002Ffonts\u002Finter-700.woff2\"\n    612 href=\"\u002Ffonts\u002Fjetbrains-mono-400.woff2\"\n    612 href=\"\u002Fcss\u002Fsyntax.css\"\n    604 href=\"\u002Fimg\u002Fhero-default.jpg\"\n     38 href=\"\u002Fimg\u002Fposts\u002F…\u002Fhero.avif\"\n","text",[17,173,170],{"__ignoreMap":85},[14,175,176],{},"Every page preloaded five font files, a syntax-highlighting stylesheet and a default hero image. The theme had added them; nobody on the team had written them.",[31,178,180],{"id":179},"step-2-classify-each-preload","Step 2: Classify Each Preload",[14,182,183],{},"For each distinct preload, answer three questions: is it used on this template at all, is it needed for first render, and is it discovered late without the hint?",[185,186,187,209],"table",{},[188,189,190],"thead",{},[191,192,193,197,200,203,206],"tr",{},[194,195,196],"th",{},"Preload",[194,198,199],{},"Used?",[194,201,202],{},"Needed for first render?",[194,204,205],{},"Discovered late?",[194,207,208],{},"Verdict",[210,211,212,235,258,274,291,312,329],"tbody",{},[191,213,214,220,223,226,229],{},[215,216,217],"td",{},[17,218,219],{},"inter-400.woff2",[215,221,222],{},"all pages",[215,224,225],{},"yes (body text)",[215,227,228],{},"yes (in CSS)",[215,230,231],{},[232,233,234],"strong",{},"keep",[191,236,237,246,249,252,255],{},[215,238,239,242,243],{},[17,240,241],{},"inter-500",", ",[17,244,245],{},"inter-600",[215,247,248],{},"some pages",[215,250,251],{},"no",[215,253,254],{},"yes",[215,256,257],{},"remove",[191,259,260,265,267,270,272],{},[215,261,262],{},[17,263,264],{},"inter-700.woff2",[215,266,222],{},[215,268,269],{},"only for headings below the fold on some templates",[215,271,254],{},[215,273,257],{},[191,275,276,281,284,287,289],{},[215,277,278],{},[17,279,280],{},"jetbrains-mono-400",[215,282,283],{},"pages with code (41%)",[215,285,286],{},"rarely above the fold",[215,288,254],{},[215,290,257],{},[191,292,293,298,301,303,310],{},[215,294,295],{},[17,296,297],{},"syntax.css",[215,299,300],{},"pages with code",[215,302,251],{},[215,304,305,306,309],{},"no (it is a ",[17,307,308],{},"\u003Clink>"," already)",[215,311,257],{},[191,313,314,319,322,325,327],{},[215,315,316],{},[17,317,318],{},"hero-default.jpg",[215,320,321],{},"0 pages (replaced by per-post heroes)",[215,323,324],{},"—",[215,326,324],{},[215,328,257],{},[191,330,331,337,340,343,346],{},[215,332,333,334],{},"per-post ",[17,335,336],{},"hero.avif",[215,338,339],{},"its own page",[215,341,342],{},"yes (LCP element)",[215,344,345],{},"yes (CSS background)",[215,347,348],{},"keep, but only on that page",[350,351,352,522],"figure",{},[353,354,361,362,361,366,361,370,361,377,361,508],"svg",{"viewBox":355,"role":356,"ariaLabelledBy":357,"xmlns":360},"0 0 760 290","img",[358,359],"aup-class-title","aup-class-desc","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","\n  ",[363,364,365],"title",{"id":358},"Decision tree for each preload",[367,368,369],"desc",{"id":359},"Three questions in sequence. Is the resource used on this page? If not, remove it: it is wasted bytes. Is it needed for first render? If not, remove it: it competes with the LCP resource. Is it discovered late without the hint? If not, remove it: the hint is redundant. Only a resource that passes all three keeps its preload.",[371,372],"rect",{"x":373,"y":373,"width":374,"height":375,"fill":376},"0","760","290","#ffffff",[378,379,381,382,381,389,381,399,381,405,381,408,381,411,381,414,381,418,381,425,381,428,381,434,381,436,381,438,381,441,381,446,381,448,381,451,381,457,381,461,381,486,381,489,381,492,381,497,381,500,381,503,361],"g",{"style":380},"font-family:system-ui, sans-serif;font-size:12px","\n    ",[171,383,388],{"x":384,"y":385,"fill":386,"style":387},"380","28","#1f2937","font-size:16px;font-weight:700;text-anchor:middle","Three questions; a preload must pass all of them",[371,390],{"x":391,"y":392,"width":393,"height":394,"rx":395,"fill":396,"stroke":397,"style":398},"40","56","200","50","8","#f8fafc","#d9e2ef","stroke-width:1.5px",[171,400,404],{"x":401,"y":402,"fill":386,"style":403},"140","86","font-weight:700;text-anchor:middle","used on this page?",[371,406],{"x":407,"y":392,"width":393,"height":394,"rx":395,"fill":396,"stroke":397,"style":398},"280",[171,409,410],{"x":384,"y":402,"fill":386,"style":403},"needed for first render?",[371,412],{"x":413,"y":392,"width":393,"height":394,"rx":395,"fill":396,"stroke":397,"style":398},"520",[171,415,417],{"x":416,"y":402,"fill":386,"style":403},"620","discovered late?",[371,419],{"x":391,"y":420,"width":393,"height":421,"rx":395,"fill":422,"opacity":423,"stroke":424,"style":398},"160","54","#ff595e","0.14","#d83b41",[171,426,257],{"x":401,"y":427,"fill":386,"style":403},"184",[171,429,433],{"x":401,"y":430,"fill":431,"style":432},"202","#556071","font-size:11px;text-anchor:middle","wasted bytes",[371,435],{"x":407,"y":420,"width":393,"height":421,"rx":395,"fill":422,"opacity":423,"stroke":424,"style":398},[171,437,257],{"x":384,"y":427,"fill":386,"style":403},[171,439,440],{"x":384,"y":430,"fill":431,"style":432},"competes with LCP",[371,442],{"x":413,"y":420,"width":393,"height":421,"rx":395,"fill":443,"opacity":444,"stroke":445,"style":398},"#ffca3a","0.26","#a97b00",[171,447,257],{"x":416,"y":427,"fill":386,"style":403},[171,449,450],{"x":416,"y":430,"fill":431,"style":432},"redundant hint",[371,452],{"x":413,"y":453,"width":393,"height":391,"rx":395,"fill":454,"opacity":455,"stroke":456,"style":398},"234","#8ac926","0.2","#5a8a16",[171,458,460],{"x":416,"y":459,"fill":386,"style":403},"259","keep the preload",[378,462,465,466,465,471,465,474,465,477,465,480,465,483,381],{"stroke":431,"fill":463,"style":464},"none","stroke-width:2px","\n      ",[467,468],"path",{"d":469,"style":470},"M242 81 L276 81","marker-end:url(#aup-arrow)",[467,472],{"d":473,"style":470},"M482 81 L516 81",[467,475],{"d":476,"style":470},"M140 108 L140 156",[467,478],{"d":479,"style":470},"M380 108 L380 156",[467,481],{"d":482,"style":470},"M620 108 L620 156",[467,484],{"d":485,"style":470},"M720 81 L740 81 L740 254 L724 254",[171,487,254],{"x":459,"y":488,"fill":431,"style":432},"74",[171,490,254],{"x":491,"y":488,"fill":431,"style":432},"499",[171,493,251],{"x":494,"y":495,"fill":431,"style":496},"152","138","font-size:11px",[171,498,251],{"x":499,"y":495,"fill":431,"style":496},"392",[171,501,251],{"x":502,"y":495,"fill":431,"style":496},"632",[171,504,254],{"x":505,"y":506,"fill":431,"style":507},"752","170","font-size:11px;text-anchor:end",[509,510,381,511,361],"defs",{},[512,513,465,519,381],"marker",{"id":514,"viewBox":515,"refX":395,"refY":516,"markerWidth":517,"markerHeight":517,"orient":518},"aup-arrow","0 0 10 10","5","7","auto-start-reverse",[467,520],{"d":521,"fill":431},"M0 0 L10 5 L0 10 z",[523,524,525],"figcaption",{},"Of eight distinct preloads on the site, two survived: the body font on every page, and each post's own hero on its own page.",[31,527,529],{"id":528},"step-3-fix-at-the-template-level","Step 3: Fix at the Template Level",[14,531,532],{},"Remove the theme's blanket preloads by overriding its head partial, then emit the two legitimate ones precisely:",[80,534,538],{"className":535,"code":536,"language":537,"meta":85,"style":85},"language-go-html-template shiki shiki-themes github-light github-dark","{{\u002F* layouts\u002Fpartials\u002Fhead\u002Fpreloads.html *\u002F}}\n\u003Clink rel=\"preload\" href=\"\u002Ffonts\u002Finter-400.woff2\" as=\"font\" type=\"font\u002Fwoff2\" crossorigin>\n{{ with .Params.hero }}\n  {{ with $.Resources.GetMatch . }}\n    {{ $img := .Resize \"1200x webp q78\" }}\n    \u003Clink rel=\"preload\" as=\"image\" href=\"{{ $img.RelPermalink }}\" fetchpriority=\"high\">\n  {{ end }}\n{{ end }}\n","go-html-template",[17,539,540,545,550,555,561,567,573,579],{"__ignoreMap":85},[89,541,542],{"class":91,"line":92},[89,543,544],{},"{{\u002F* layouts\u002Fpartials\u002Fhead\u002Fpreloads.html *\u002F}}\n",[89,546,547],{"class":91,"line":99},[89,548,549],{},"\u003Clink rel=\"preload\" href=\"\u002Ffonts\u002Finter-400.woff2\" as=\"font\" type=\"font\u002Fwoff2\" crossorigin>\n",[89,551,552],{"class":91,"line":123},[89,553,554],{},"{{ with .Params.hero }}\n",[89,556,558],{"class":91,"line":557},4,[89,559,560],{},"  {{ with $.Resources.GetMatch . }}\n",[89,562,564],{"class":91,"line":563},5,[89,565,566],{},"    {{ $img := .Resize \"1200x webp q78\" }}\n",[89,568,570],{"class":91,"line":569},6,[89,571,572],{},"    \u003Clink rel=\"preload\" as=\"image\" href=\"{{ $img.RelPermalink }}\" fetchpriority=\"high\">\n",[89,574,576],{"class":91,"line":575},7,[89,577,578],{},"  {{ end }}\n",[89,580,582],{"class":91,"line":581},8,[89,583,584],{},"{{ end }}\n",[14,586,587,588,591,592,595,596,598,599,601,602,29],{},"The per-post hero preload now exists only on pages that have a hero, points at the exact processed file the page renders, and carries ",[17,589,590],{},"fetchpriority=\"high\""," so the browser treats it as the LCP candidate it is. For heroes rendered as ",[17,593,594],{},"\u003Cimg>"," elements rather than CSS backgrounds, drop the preload entirely and put ",[17,597,590],{}," on the ",[17,600,594],{}," — the image is already discoverable in the HTML, as shown in ",[25,603,605],{"href":604},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Freducing-lcp-from-hero-images-on-static-sites\u002F","Reducing LCP from Hero Images on Static Sites",[14,607,608,609,612,613,29],{},"Font preloads need the ",[17,610,611],{},"crossorigin"," attribute even on the same origin, because fonts are fetched in CORS mode; without it the preload is not matched and the font downloads twice. That detail is covered in ",[25,614,616],{"href":615},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fpreloading-fonts-without-double-downloads\u002F","Preloading Fonts Without Double Downloads",[31,618,620],{"id":619},"step-4-guard-it-in-ci","Step 4: Guard It in CI",[14,622,623],{},"A theme update reintroduced two font preloads three weeks after the clean-up. A build check now counts preloads per page and verifies each preloaded URL is referenced elsewhere in the same page:",[80,625,629],{"className":626,"code":627,"language":628,"meta":85,"style":85},"language-js shiki shiki-themes github-light github-dark","\u002F\u002F scripts\u002Fcheck-preloads.mjs\nimport { globSync, readFileSync } from 'node:fs';\nconst MAX = 2;\nlet bad = 0;\nfor (const f of globSync('public\u002F**\u002Findex.html')) {\n  const html = readFileSync(f, 'utf8');\n  const pre = [...html.matchAll(\u002F\u003Clink[^>]+rel=\"preload\"[^>]+href=\"([^\"]+)\"\u002Fg)].map((m) => m[1]);\n  if (pre.length > MAX) { console.log(`${f}: ${pre.length} preloads`); bad++; }\n  const body = html.replace(\u002F\u003Clink[^>]+rel=\"preload\"[^>]*>\u002Fg, '');\n  for (const href of pre) {\n    const name = href.split('\u002F').pop();\n    if (!body.includes(name)) { console.log(`${f}: preload ${href} not referenced`); bad++; }\n  }\n}\nprocess.exit(bad ? 1 : 0);\n","js",[17,630,631,636,654,670,686,714,736,836,887,942,960,991,1034,1040,1046],{"__ignoreMap":85},[89,632,633],{"class":91,"line":92},[89,634,635],{"class":95},"\u002F\u002F scripts\u002Fcheck-preloads.mjs\n",[89,637,638,641,645,648,651],{"class":91,"line":99},[89,639,640],{"class":126},"import",[89,642,644],{"class":643},"sVt8B"," { globSync, readFileSync } ",[89,646,647],{"class":126},"from",[89,649,650],{"class":110}," 'node:fs'",[89,652,653],{"class":643},";\n",[89,655,656,659,662,665,668],{"class":91,"line":123},[89,657,658],{"class":126},"const",[89,660,661],{"class":106}," MAX",[89,663,664],{"class":126}," =",[89,666,667],{"class":106}," 2",[89,669,653],{"class":643},[89,671,672,675,678,681,684],{"class":91,"line":557},[89,673,674],{"class":126},"let",[89,676,677],{"class":643}," bad ",[89,679,680],{"class":126},"=",[89,682,683],{"class":106}," 0",[89,685,653],{"class":643},[89,687,688,691,694,696,699,702,705,708,711],{"class":91,"line":563},[89,689,690],{"class":126},"for",[89,692,693],{"class":643}," (",[89,695,658],{"class":126},[89,697,698],{"class":106}," f",[89,700,701],{"class":126}," of",[89,703,704],{"class":102}," globSync",[89,706,707],{"class":643},"(",[89,709,710],{"class":110},"'public\u002F**\u002Findex.html'",[89,712,713],{"class":643},")) {\n",[89,715,716,719,722,724,727,730,733],{"class":91,"line":569},[89,717,718],{"class":126},"  const",[89,720,721],{"class":106}," html",[89,723,664],{"class":126},[89,725,726],{"class":102}," readFileSync",[89,728,729],{"class":643},"(f, ",[89,731,732],{"class":110},"'utf8'",[89,734,735],{"class":643},");\n",[89,737,738,740,743,745,748,751,754,757,759,762,766,769,772,775,778,781,783,785,787,789,792,794,796,799,801,804,806,808,811,814,817,821,824,827,830,833],{"class":91,"line":575},[89,739,718],{"class":126},[89,741,742],{"class":106}," pre",[89,744,664],{"class":126},[89,746,747],{"class":643}," [",[89,749,750],{"class":126},"...",[89,752,753],{"class":643},"html.",[89,755,756],{"class":102},"matchAll",[89,758,707],{"class":643},[89,760,761],{"class":110},"\u002F",[89,763,765],{"class":764},"sA_wV","\u003Clink",[89,767,768],{"class":106},"[",[89,770,771],{"class":126},"^",[89,773,774],{"class":106},">]",[89,776,777],{"class":126},"+",[89,779,780],{"class":764},"rel=\"preload\"",[89,782,768],{"class":106},[89,784,771],{"class":126},[89,786,774],{"class":106},[89,788,777],{"class":126},[89,790,791],{"class":764},"href=\"(",[89,793,768],{"class":106},[89,795,771],{"class":126},[89,797,798],{"class":106},"\"]",[89,800,777],{"class":126},[89,802,803],{"class":764},")\"",[89,805,761],{"class":110},[89,807,378],{"class":126},[89,809,810],{"class":643},")].",[89,812,813],{"class":102},"map",[89,815,816],{"class":643},"((",[89,818,820],{"class":819},"s4XuR","m",[89,822,823],{"class":643},") ",[89,825,826],{"class":126},"=>",[89,828,829],{"class":643}," m[",[89,831,832],{"class":106},"1",[89,834,835],{"class":643},"]);\n",[89,837,838,841,844,847,850,852,855,858,860,863,866,869,871,873,875,878,881,884],{"class":91,"line":581},[89,839,840],{"class":126},"  if",[89,842,843],{"class":643}," (pre.",[89,845,846],{"class":106},"length",[89,848,849],{"class":126}," >",[89,851,661],{"class":106},[89,853,854],{"class":643},") { console.",[89,856,857],{"class":102},"log",[89,859,707],{"class":643},[89,861,862],{"class":110},"`${",[89,864,865],{"class":643},"f",[89,867,868],{"class":110},"}: ${",[89,870,80],{"class":643},[89,872,29],{"class":110},[89,874,846],{"class":106},[89,876,877],{"class":110},"} preloads`",[89,879,880],{"class":643},"); bad",[89,882,883],{"class":126},"++",[89,885,886],{"class":643},"; }\n",[89,888,890,892,895,897,900,903,905,907,909,911,913,915,917,919,921,923,925,928,931,933,935,937,940],{"class":91,"line":889},9,[89,891,718],{"class":126},[89,893,894],{"class":106}," body",[89,896,664],{"class":126},[89,898,899],{"class":643}," html.",[89,901,902],{"class":102},"replace",[89,904,707],{"class":643},[89,906,761],{"class":110},[89,908,765],{"class":764},[89,910,768],{"class":106},[89,912,771],{"class":126},[89,914,774],{"class":106},[89,916,777],{"class":126},[89,918,780],{"class":764},[89,920,768],{"class":106},[89,922,771],{"class":126},[89,924,774],{"class":106},[89,926,927],{"class":126},"*",[89,929,930],{"class":764},">",[89,932,761],{"class":110},[89,934,378],{"class":126},[89,936,242],{"class":643},[89,938,939],{"class":110},"''",[89,941,735],{"class":643},[89,943,945,948,950,952,955,957],{"class":91,"line":944},10,[89,946,947],{"class":126},"  for",[89,949,693],{"class":643},[89,951,658],{"class":126},[89,953,954],{"class":106}," href",[89,956,701],{"class":126},[89,958,959],{"class":643}," pre) {\n",[89,961,963,966,969,971,974,977,979,982,985,988],{"class":91,"line":962},11,[89,964,965],{"class":126},"    const",[89,967,968],{"class":106}," name",[89,970,664],{"class":126},[89,972,973],{"class":643}," href.",[89,975,976],{"class":102},"split",[89,978,707],{"class":643},[89,980,981],{"class":110},"'\u002F'",[89,983,984],{"class":643},").",[89,986,987],{"class":102},"pop",[89,989,990],{"class":643},"();\n",[89,992,994,997,999,1002,1005,1008,1011,1013,1015,1017,1019,1022,1025,1028,1030,1032],{"class":91,"line":993},12,[89,995,996],{"class":126},"    if",[89,998,693],{"class":643},[89,1000,1001],{"class":126},"!",[89,1003,1004],{"class":643},"body.",[89,1006,1007],{"class":102},"includes",[89,1009,1010],{"class":643},"(name)) { console.",[89,1012,857],{"class":102},[89,1014,707],{"class":643},[89,1016,862],{"class":110},[89,1018,865],{"class":643},[89,1020,1021],{"class":110},"}: preload ${",[89,1023,1024],{"class":643},"href",[89,1026,1027],{"class":110},"} not referenced`",[89,1029,880],{"class":643},[89,1031,883],{"class":126},[89,1033,886],{"class":643},[89,1035,1037],{"class":91,"line":1036},13,[89,1038,1039],{"class":643},"  }\n",[89,1041,1043],{"class":91,"line":1042},14,[89,1044,1045],{"class":643},"}\n",[89,1047,1049,1052,1055,1058,1061,1064,1067,1069],{"class":91,"line":1048},15,[89,1050,1051],{"class":643},"process.",[89,1053,1054],{"class":102},"exit",[89,1056,1057],{"class":643},"(bad ",[89,1059,1060],{"class":126},"?",[89,1062,1063],{"class":106}," 1",[89,1065,1066],{"class":126}," :",[89,1068,683],{"class":106},[89,1070,735],{"class":643},[14,1072,1073],{},"Checking that the filename appears elsewhere in the page catches preloads for resources the page never uses — though for fonts referenced only from CSS, add the stylesheet's font list to the check, or exempt the known font file by name.",[350,1075,1076,1156],{},[353,1077,361,1082,361,1085,361,1088,361,1091],{"viewBox":1078,"role":356,"ariaLabelledBy":1079,"xmlns":360},"0 0 760 240",[1080,1081],"aup-ci-title","aup-ci-desc",[363,1083,1084],{"id":1080},"Preload count over time with and without the CI check",[367,1086,1087],{"id":1081},"A step line of preload tags per page. It starts at 7, drops to 2 after the clean-up, and without a check rises back to 4 three weeks later when a theme update adds two font preloads. With the check, the theme update's pull request fails and the count stays at 2.",[371,1089],{"x":373,"y":373,"width":374,"height":1090,"fill":376},"240",[378,1092,381,1093,381,1096,381,1100,381,1102,381,1106,381,1109,381,1111,381,1116,381,1120,381,1124,381,1128,381,1135,381,1140,381,1145,381,1151,361],{"style":380},[171,1094,1095],{"x":384,"y":385,"fill":386,"style":387},"Preloads per page: clean-up, then a theme update",[91,1097],{"x1":1098,"y1":393,"x2":1099,"y2":393,"stroke":431,"style":398},"80","720",[91,1101],{"x1":1098,"y1":394,"x2":1098,"y2":393,"stroke":431,"style":398},[171,1103,373],{"x":1104,"y":1105,"fill":431,"style":507},"72","204",[171,1107,1108],{"x":1104,"y":401,"fill":431,"style":507},"4",[171,1110,395],{"x":1104,"y":1104,"fill":431,"style":507},[1112,1113],"polyline",{"points":1114,"fill":463,"stroke":424,"style":1115},"80,88 250,88 250,168 480,168 480,136 720,136","stroke-width:2.5px;stroke-dasharray:6 4",[1112,1117],{"points":1118,"fill":463,"stroke":456,"style":1119},"250,170 720,170","stroke-width:2.5px",[171,1121,1123],{"x":1122,"y":1098,"fill":386,"style":432},"165","7 (theme defaults)",[171,1125,1127],{"x":1126,"y":420,"fill":386,"style":432},"365","2 after clean-up",[171,1129,1134],{"x":1130,"y":1131,"fill":1132,"style":1133},"600","128","#b32b30","font-size:11px;font-weight:700;text-anchor:middle","no check: back to 4",[171,1136,1139],{"x":1130,"y":1137,"fill":1138,"style":1133},"188","#3f6410","with check: PR fails, stays 2",[91,1141],{"x1":1142,"y1":394,"x2":1142,"y2":393,"stroke":1143,"style":1144},"480","#6a4c93","stroke-width:1.5px;stroke-dasharray:4 4",[171,1146,1150],{"x":1147,"y":1148,"fill":1143,"style":1149},"486","62","font-size:11px;font-weight:700","theme update",[171,1152,1155],{"x":1153,"y":1154,"fill":431,"style":432},"400","226","six weeks of builds on the 600-page Hugo site",[523,1157,1158],{},"Without a guard, clean-ups decay; the check turned the theme update into a failed pull request instead of a slower site.",[31,1160,1162],{"id":1161},"measured-impact","Measured Impact",[14,1164,1165],{},"The post template and the docs template, Lighthouse 12 mobile, median of five runs, preview deploy:",[185,1167,1168,1187],{},[188,1169,1170],{},[191,1171,1172,1175,1178,1181,1184],{},[194,1173,1174],{},"Measure",[194,1176,1177],{},"Post before",[194,1179,1180],{},"Post after",[194,1182,1183],{},"Docs before",[194,1185,1186],{},"Docs after",[210,1188,1189,1203,1220,1237],{},[191,1190,1191,1194,1196,1199,1201],{},[215,1192,1193],{},"Preload tags",[215,1195,517],{},[215,1197,1198],{},"2",[215,1200,517],{},[215,1202,832],{},[191,1204,1205,1208,1211,1214,1217],{},[215,1206,1207],{},"Bytes fetched at high priority before LCP",[215,1209,1210],{},"412 KB",[215,1212,1213],{},"138 KB",[215,1215,1216],{},"318 KB",[215,1218,1219],{},"46 KB",[191,1221,1222,1225,1228,1231,1234],{},[215,1223,1224],{},"LCP",[215,1226,1227],{},"2.34 s",[215,1229,1230],{},"1.71 s",[215,1232,1233],{},"1.86 s",[215,1235,1236],{},"1.22 s",[191,1238,1239,1242,1245,1248,1251],{},[215,1240,1241],{},"FCP",[215,1243,1244],{},"1.48 s",[215,1246,1247],{},"1.19 s",[215,1249,1250],{},"1.44 s",[215,1252,1253],{},"1.12 s",[350,1255,1256,1342],{},[353,1257,361,1262,361,1265,361,1268,361,1271],{"viewBox":1258,"role":356,"ariaLabelledBy":1259,"xmlns":360},"0 0 760 270",[1260,1261],"aup-bytes-title","aup-bytes-desc",[363,1263,1264],{"id":1260},"High-priority bytes before LCP and the resulting LCP",[367,1266,1267],{"id":1261},"Two paired comparisons. On the post template, high-priority bytes before LCP fell from 412 to 138 kilobytes and LCP fell from 2.34 to 1.71 seconds. On the docs template, bytes fell from 318 to 46 kilobytes and LCP fell from 1.86 to 1.22 seconds.",[371,1269],{"x":373,"y":373,"width":374,"height":1270,"fill":376},"270",[378,1272,381,1273,381,1276,381,1282,381,1290,381,1295,381,1298,381,1303,381,1307,381,1310,381,1315,381,1319,381,1324,381,1328,381,1331,381,1334,381,1338,361],{"style":380},[171,1274,1275],{"x":384,"y":385,"fill":386,"style":387},"Fewer bytes competing, earlier LCP",[171,1277,1281],{"x":1278,"y":1279,"fill":386,"style":1280},"30","76","font-weight:700","Post",[371,1283],{"x":1284,"y":1285,"width":1286,"height":1287,"rx":1108,"fill":422,"opacity":1288,"stroke":424,"style":1289},"120","60","412","20","0.25","stroke-width:1px",[171,1291,1294],{"x":1292,"y":1293,"fill":386},"540","75","412 KB · LCP 2.34 s",[371,1296],{"x":1284,"y":402,"width":495,"height":1287,"rx":1108,"fill":454,"opacity":1297,"stroke":456,"style":1289},"0.35",[171,1299,1302],{"x":1300,"y":1301,"fill":1138,"style":1280},"266","101","138 KB · LCP 1.71 s",[171,1304,1306],{"x":1278,"y":1305,"fill":386,"style":1280},"156","Docs",[371,1308],{"x":1284,"y":401,"width":1309,"height":1287,"rx":1108,"fill":422,"opacity":1288,"stroke":424,"style":1289},"318",[171,1311,1314],{"x":1312,"y":1313,"fill":386},"446","155","318 KB · LCP 1.86 s",[371,1316],{"x":1284,"y":1317,"width":1318,"height":1287,"rx":1108,"fill":454,"opacity":1297,"stroke":456,"style":1289},"166","46",[171,1320,1323],{"x":1321,"y":1322,"fill":1138,"style":1280},"174","181","46 KB · LCP 1.22 s",[371,1325],{"x":1284,"y":1326,"width":1327,"height":1327,"fill":422,"opacity":1288,"stroke":424,"style":1289},"216","12",[171,1329,1330],{"x":495,"y":1154,"fill":431,"style":496},"before: theme's blanket preloads",[371,1332],{"x":1333,"y":1326,"width":1327,"height":1327,"fill":454,"opacity":1297,"stroke":456,"style":1289},"360",[171,1335,1337],{"x":1336,"y":1154,"fill":431,"style":496},"378","after: one font + the page's own hero",[171,1339,1341],{"x":384,"y":1340,"fill":431,"style":432},"258","Lighthouse 12 mobile, simulated 4G, median of 5; bar length = KB fetched at high priority before LCP",[523,1343,1344],{},"Removing preloads made both templates faster: the LCP resource no longer shared the connection with six things it did not need.",[14,1346,1347],{},"In the field, over the following four weeks, the site's mobile LCP p75 from CrUX moved from 2.3 s to 1.8 s. It is the rare performance fix that consists entirely of deleting code.",[31,1349,1351],{"id":1350},"reading-the-evidence-in-devtools","Reading the Evidence in DevTools",[14,1353,1354,1355,1357,1358,1361,1362,29],{},"Before deleting a preload, it is worth confirming its effect on one page so the change can be explained in review. Three views make the case. The Console lists \"The resource … was preloaded using link preload but not used within a few seconds\" for truly unused preloads — ",[17,1356,318],{}," produced that warning on every page. The Network panel, sorted by start time with the Priority column shown, reveals used-but-unnecessary preloads: on the post template, four font files and a stylesheet started at ",[17,1359,1360],{},"Highest"," priority in the same 50 ms window as the hero image, and the hero's download stretched from 280 to 610 ms as they shared bandwidth. And the Performance panel's LCP breakdown shows the \"resource load duration\" subpart shrinking once the competition is removed — from 560 ms to 230 ms on this template, which accounts for most of the LCP gain. The same breakdown is walked through in ",[25,1363,1365],{"href":1364},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Fmeasuring-lcp-subparts-with-devtools\u002F","Measuring LCP Subparts with DevTools",[31,1367,1369],{"id":1368},"pitfalls-rollback","Pitfalls & Rollback",[36,1371,1372,1378,1406,1412,1421,1427],{},[39,1373,1374,1377],{},[232,1375,1376],{},"Deleting the one preload that matters."," Keep the late-discovered critical font; removing it can reintroduce invisible text or a font swap shift. Measure after every removal.",[39,1379,1380,1386,1387,1389,1390,1392,1393,1396,1397,74,1399,1402,1403,29],{},[232,1381,1382,1383,29],{},"Preloading responsive images without ",[17,1384,1385],{},"imagesrcset"," A preload with a single ",[17,1388,1024],{}," fetches one size; if the page's ",[17,1391,594],{}," picks another from ",[17,1394,1395],{},"srcset",", the preload is wasted. Use ",[17,1398,1385],{},[17,1400,1401],{},"imagesizes",", or rely on ",[17,1404,1405],{},"fetchpriority",[39,1407,1408,1411],{},[232,1409,1410],{},"Auditing one page only."," Preloads come from shared partials, so an audit of the homepage alone misses template-specific ones. Scan every built page, grouped by template.",[39,1413,1414,1417,1418,1420],{},[232,1415,1416],{},"Framework preloads you did not write."," Bundlers emit ",[17,1419,77],{}," for route chunks. Those are usually right; audit them only if a template preloads chunks it never executes.",[39,1422,1423,1426],{},[232,1424,1425],{},"Blanket fixes in the layout."," A preload that is right for one template is wrong for another. Emit hints per template from data the page already has.",[39,1428,1429,1432],{},[232,1430,1431],{},"Rollback:"," preloads are single tags in partials. Restoring one is a one-line revert, and the CI check's allowance can be raised per template if a new, justified preload is needed.",[31,1434,1436],{"id":1435},"conclusion","Conclusion",[14,1438,1439],{},"Preloads are cheap to add and easy to forget, and themes add them for you. Auditing the built HTML found seven preloads on every page of a 600-page site; two were justified, five competed with the LCP image or fetched files the page never used. Removing them cut high-priority bytes before LCP by two thirds and LCP by 0.6 seconds on both templates tested, and a ten-line CI check has kept them from creeping back since.",[31,1441,1443],{"id":1442},"faq","FAQ",[1445,1446,1448],"h3",{"id":1447},"what-counts-as-an-unused-preload","What counts as an unused preload?",[14,1450,1451],{},"A preloaded resource that the page does not use within about three seconds of the load event. Chrome logs a console warning for each one, and the resource was downloaded at high priority for nothing.",[1445,1453,1455],{"id":1454},"can-a-preload-be-used-but-still-harmful","Can a preload be used but still harmful?",[14,1457,1458],{},"Yes. A preload for a resource that is needed but not critical, such as a below-the-fold image or a second font weight, still competes with the LCP resource for bandwidth. Used-but-unnecessary preloads delayed LCP more than unused ones on the site in this guide.",[1445,1460,1462],{"id":1461},"where-do-unwanted-preloads-come-from","Where do unwanted preloads come from?",[14,1464,1465],{},"Most often from themes and plugins that preload every font weight or a hero image on every template, from framework defaults that preload route chunks, and from hand-written hints that outlived the asset they pointed to.",[1445,1467,1469],{"id":1468},"how-do-i-stop-preloads-creeping-back","How do I stop preloads creeping back?",[14,1471,1472],{},"Parse the built HTML in CI, count preload tags per template, and fail the build when a template exceeds its allowance or preloads a resource the page does not reference. It takes a few seconds and catches theme updates immediately.",[31,1474,1476],{"id":1475},"related","Related",[36,1478,1479,1488,1493,1500,1507],{},[39,1480,1481,1484,1485,1487],{},[232,1482,1483],{},"Parent:"," ",[25,1486,28],{"href":27}," — when each hint is appropriate.",[39,1489,1490,1492],{},[25,1491,616],{"href":615}," — the one preload most sites should keep.",[39,1494,1495,1499],{},[25,1496,1498],{"href":1497},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fpreconnect-vs-dns-prefetch-on-static-sites\u002F","Preconnect vs DNS-Prefetch on Static Sites"," — auditing connection hints the same way.",[39,1501,1502,1506],{},[25,1503,1505],{"href":1504},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Foptimizing-lcp-on-astro-with-priority-hints\u002F","Optimizing LCP on Astro with Priority Hints"," — fetchpriority as an alternative to preload.",[39,1508,1509,1513],{},[25,1510,1512],{"href":1511},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fwriting-a-performance-budget-that-fails-builds\u002F","Writing a Performance Budget That Fails Builds"," — budgeting hints alongside bytes.",[1515,1516,1517],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sA_wV, html code.shiki .sA_wV{--shiki-default:#032F62;--shiki-dark:#DBEDFF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":85,"searchDepth":99,"depth":99,"links":1519},[1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1535],{"id":33,"depth":99,"text":34},{"id":66,"depth":99,"text":67},{"id":179,"depth":99,"text":180},{"id":528,"depth":99,"text":529},{"id":619,"depth":99,"text":620},{"id":1161,"depth":99,"text":1162},{"id":1350,"depth":99,"text":1351},{"id":1368,"depth":99,"text":1369},{"id":1435,"depth":99,"text":1436},{"id":1442,"depth":99,"text":1443,"children":1530},[1531,1532,1533,1534],{"id":1447,"depth":123,"text":1448},{"id":1454,"depth":123,"text":1455},{"id":1461,"depth":123,"text":1462},{"id":1468,"depth":123,"text":1469},{"id":1475,"depth":99,"text":1476},[1537,1539,1542,1543],{"name":1538,"item":761},"Home",{"name":1540,"item":1541},"Performance Optimization & Core Web Vitals for SSGs","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002F",{"name":28,"item":27},{"name":5,"item":1544},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads\u002F","2026-09-18","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.","md",[1549,1550,1551,1552],{"q":1448,"a":1451},{"q":1455,"a":1458},{"q":1462,"a":1465},{"q":1469,"a":1472},{},true,"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads",{"title":5,"description":1546},"performance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads\u002Findex","article","lEgajAf1FgXzek-5NudDQm1tJYZXtNESTMFm-h8UkJU",[1561,1564,1567,1570,1573,1576,1579,1582,1585,1588,1591,1594,1597,1600,1603,1606,1609,1612,1615,1618,1621,1624,1627,1630,1633,1636,1639,1642,1645,1648,1651,1654,1657,1660,1663,1666,1669,1672,1675,1678,1681,1684,1687,1690,1693,1696,1699,1702,1705,1708,1711,1714,1717,1720,1723,1726,1729,1732,1735,1738,1741,1744,1747,1750,1753,1756,1759,1762,1765,1768,1771,1774,1777,1780,1783,1786,1789,1792,1795,1798,1801,1804,1807,1810,1813,1816,1819,1822,1825,1828,1831,1834,1837,1840,1843,1846,1849,1852,1855,1858,1861,1864,1867,1870,1873,1876,1879,1882,1885,1888,1891,1894,1897,1900,1903,1906,1909,1912,1915,1918,1921,1924,1927,1930,1933,1936,1939,1942,1945,1948,1951,1954,1957,1960,1963,1966,1969,1972,1975,1978,1981,1984,1987,1990,1993,1996,1999,2002,2005,2008,2011,2014,2017,2020,2023,2026,2029,2032,2035,2038,2041,2044,2047,2050,2053,2056,2059,2062,2065,2068,2071,2074,2077,2080,2083,2086,2088,2091,2094,2097,2100,2103,2106,2109,2112,2115,2118,2121,2124,2127,2130,2133,2136,2139,2142,2145,2148,2151,2154,2157,2160,2163,2166,2169,2172,2175,2178,2181,2184,2187,2190,2193,2196,2198,2200,2202,2205,2208,2211,2214,2217,2220,2223,2226,2228,2231,2234,2236,2237,2240,2243,2246,2248,2251,2253,2256,2259,2262,2265,2268,2271,2274,2277,2280,2283,2286,2289,2292,2295,2298,2301,2304,2307,2310,2313,2316,2319,2322,2325,2328,2331,2334,2337,2340,2343,2346,2349,2352,2355,2358,2361,2364,2367,2370,2373,2376,2379,2382,2385,2388,2391,2394,2397,2400,2403,2406,2409,2412,2415,2418,2421,2424,2427,2430,2433,2436,2439,2442,2445,2448,2451,2454,2457,2460,2463,2466,2469,2472,2475,2478,2481,2484,2487,2490,2493,2496,2499,2502,2505,2508,2511,2514,2517,2520,2523,2526,2529,2532,2535,2538,2541,2544,2547,2550,2553,2556,2559,2562,2565,2568,2571,2574,2577,2580,2583,2586,2589,2592,2595,2598,2601,2604,2607,2610,2613,2616,2619,2622,2625,2628,2631,2634,2637,2640,2643,2646,2649,2652,2655,2658,2661,2664,2667,2670,2673,2676,2679,2682,2685,2688,2691,2694,2697],{"path":1562,"title":1563},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Faccessible-code-blocks-in-documentation-sites","Accessible Code Blocks in Documentation Sites",{"path":1565,"title":1566},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Faccessible-dark-mode-toggles-for-static-sites","Accessible Dark Mode Toggles for Static Sites",{"path":1568,"title":1569},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Faccessible-svg-diagrams-on-static-sites","Accessible SVG Diagrams on Static Sites",{"path":1571,"title":1572},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Fenforcing-alt-text-for-markdown-images-at-build-time","Enforcing Alt Text for Markdown Images at Build Time",{"path":1574,"title":1575},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Ffixing-heading-order-problems-in-markdown-content","Fixing Heading Order Problems in Markdown Content",{"path":1577,"title":1578},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Ffixing-low-color-contrast-flagged-by-lighthouse","Fixing Low Color Contrast Flagged by Lighthouse",{"path":1580,"title":1581},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites","Accessibility for Static Sites",{"path":1583,"title":1584},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Fkeyboard-navigation-and-focus-order-on-static-sites","Keyboard Navigation and Focus Order on Static Sites",{"path":1586,"title":1587},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Fskip-links-and-landmarks-in-ssg-layouts","Skip Links and Landmarks in SSG Layouts",{"path":1589,"title":1590},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fastro-vs-eleventy-build-times-at-10000-pages","Astro vs Eleventy Build Times at 10,000 Pages",{"path":1592,"title":1593},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fchoosing-between-astro-and-eleventy-for-large-docs","Astro vs Eleventy for Large Docs (1000+ Pages)",{"path":1595,"title":1596},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fcontent-collections-vs-eleventy-data-cascade","Content Collections vs the Eleventy Data Cascade",{"path":1598,"title":1599},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fdev-server-performance-astro-vs-eleventy","Dev Server Performance: Astro vs Eleventy",{"path":1601,"title":1602},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Ffixing-astro-build-errors-after-upgrading-to-astro-5","Fixing Astro Build Errors After Upgrading to Astro 5",{"path":1604,"title":1605},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Ffixing-duplicate-permalink-errors-in-eleventy","Fixing Duplicate Permalink Errors in Eleventy",{"path":1607,"title":1608},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Ffixing-eleventy-out-of-memory-errors-on-large-collections","Fixing Eleventy Out-of-Memory Errors on Large Collections",{"path":1610,"title":1611},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Ffixing-slow-astro-builds-caused-by-large-mdx-collections","Fixing Slow Astro Builds Caused by Large MDX Collections",{"path":1613,"title":1614},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites","Astro vs Eleventy for Documentation Sites",{"path":1616,"title":1617},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Floading-remote-content-with-astro-content-layer-loaders","Loading Remote Content With Astro Content Layer Loaders",{"path":1619,"title":1620},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fmarkdown-pipelines-remark-vs-markdown-it","Markdown Pipelines: remark vs markdown-it",{"path":1622,"title":1623},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fshortcodes-vs-components-for-docs-authors","Shortcodes vs Components for Docs Authors",{"path":1625,"title":1626},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fsidebar-navigation-in-astro-and-eleventy","Sidebar Navigation in Astro and Eleventy",{"path":1628,"title":1629},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fsyntax-highlighting-with-shiki-in-astro-and-eleventy","Syntax Highlighting with Shiki in Astro and Eleventy",{"path":1631,"title":1632},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fupgrading-eleventy-2-to-3-with-esm-configuration","Upgrading Eleventy 2 to 3 With ESM Configuration",{"path":1634,"title":1635},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fadding-local-search-to-a-vitepress-site","Adding Local Search to a VitePress Site",{"path":1637,"title":1638},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fcomparing-docs-framework-build-times","Comparing Docs Framework Build Times",{"path":1640,"title":1641},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fcustomizing-starlight-without-forking-the-theme","Customizing Starlight Without Forking the Theme",{"path":1643,"title":1644},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fdocusaurus-vs-starlight-for-product-documentation","Docusaurus vs Starlight for Product Documentation",{"path":1646,"title":1647},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Ffixing-broken-links-reported-by-docusaurus-builds","Fixing Broken Links Reported by Docusaurus Builds",{"path":1649,"title":1650},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fgenerating-api-reference-pages-in-starlight-from-openapi","Generating API Reference Pages in Starlight From OpenAPI",{"path":1652,"title":1653},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress","Docs Frameworks: Docusaurus, Starlight and VitePress",{"path":1655,"title":1656},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Finternationalizing-starlight-docs","Internationalizing Starlight Docs",{"path":1658,"title":1659},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmdx-vs-markdoc-for-docs-content","MDX vs Markdoc for Docs Content",{"path":1661,"title":1662},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmigrating-from-mkdocs-to-starlight","Migrating from MkDocs to Starlight",{"path":1664,"title":1665},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmigrating-mkdocs-documentation-to-vitepress","Migrating MkDocs Documentation to VitePress",{"path":1667,"title":1668},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fspeeding-up-docusaurus-builds-with-rspack","Speeding Up Docusaurus Builds With Rspack",{"path":1670,"title":1671},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fversioned-documentation-with-docusaurus","Versioned Documentation with Docusaurus",{"path":1673,"title":1674},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fversioning-vitepress-documentation-without-a-plugin","Versioning VitePress Documentation Without a Plugin",{"path":1676,"title":1677},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fvitepress-for-library-documentation","VitePress for Library Documentation",{"path":1679,"title":1680},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fvitepress-vs-starlight-for-vue-and-astro-teams","VitePress vs Starlight for Vue and Astro Teams",{"path":1682,"title":1683},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Ffixing-hugo-builds-that-fail-after-a-version-upgrade","Fixing Hugo Builds That Fail After a Version Upgrade",{"path":1685,"title":1686},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Ffixing-hugo-builds-that-slow-down-after-adding-taxonomies","Fixing Hugo Builds That Slow Down After Adding Taxonomies",{"path":1688,"title":1689},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fhow-to-benchmark-hugo-vs-astro-build-speeds","How to Benchmark Hugo vs Astro Build Speeds",{"path":1691,"title":1692},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fhugo-image-processing-cache-in-ci","Hugo Image Processing Cache in CI",{"path":1694,"title":1695},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fhugo-modules-and-dependency-caching","Hugo Modules and Dependency Caching",{"path":1697,"title":1698},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fhugo-partialcached-for-faster-builds","Hugo partialCached for Faster Builds",{"path":1700,"title":1701},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories","Hugo Build Times for Large Repositories",{"path":1703,"title":1704},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fparallel-hugo-builds-across-ci-jobs","Parallel Hugo Builds Across CI Jobs",{"path":1706,"title":1707},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fprofiling-hugo-templates-with-template-metrics","Profiling Hugo Templates With Template Metrics",{"path":1709,"title":1710},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Freducing-hugo-memory-usage-on-ci-runners","Reducing Hugo Memory Usage on CI Runners",{"path":1712,"title":1713},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fsharing-a-theme-across-hugo-sites-with-modules","Sharing a Theme Across Hugo Sites With Modules",{"path":1715,"title":1716},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fspeeding-up-hugo-builds-with-render-hooks-and-caching","Speeding Up Hugo Builds with Render Hooks & Caching",{"path":1718,"title":1719},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fsplitting-large-hugo-sites-with-segments","Splitting Large Hugo Sites with Segments",{"path":1721,"title":1722},"\u002Fchoosing-the-right-static-site-generator-for-production","Choosing the Right Static Site Generator for Production",{"path":1724,"title":1725},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Ffixing-hreflang-errors-reported-in-search-console","Fixing Hreflang Errors Reported in Search Console",{"path":1727,"title":1728},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fhreflang-and-language-alternates-on-static-sites","hreflang and Language Alternates on Static Sites",{"path":1730,"title":1731},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fi18n-routing-in-astro","i18n Routing in Astro",{"path":1733,"title":1734},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites","Internationalization for Static Sites",{"path":1736,"title":1737},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Flanguage-detection-and-redirects-at-the-edge","Language Detection and Redirects at the Edge",{"path":1739,"title":1740},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fmultilingual-eleventy-sites-with-the-i18n-plugin","Multilingual Eleventy Sites With the i18n Plugin",{"path":1742,"title":1743},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fmultilingual-sites-with-hugo","Multilingual Sites with Hugo",{"path":1745,"title":1746},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fright-to-left-layouts-on-static-sites","Right-to-Left Layouts on Static Sites",{"path":1748,"title":1749},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fsubdirectories-vs-subdomains-for-translated-static-sites","Subdirectories vs Subdomains for Translated Static Sites",{"path":1751,"title":1752},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Ftranslation-workflows-with-git-and-crowdin","Translation Workflows with Git and Crowdin",{"path":1754,"title":1755},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fcustom-domains-and-https-for-jekyll-on-github-pages","Custom Domains and HTTPS for Jekyll on GitHub Pages",{"path":1757,"title":1758},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fdeploying-jekyll-with-github-actions","Deploying Jekyll with GitHub Actions",{"path":1760,"title":1761},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Feleventy-vs-jekyll-for-markdown-heavy-blogs","Eleventy vs Jekyll for Markdown-Heavy Blogs",{"path":1763,"title":1764},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Ffixing-jekyll-builds-that-break-after-a-ruby-upgrade","Fixing Jekyll Builds That Break After a Ruby Upgrade",{"path":1766,"title":1767},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem","Jekyll Plugin Ecosystem",{"path":1769,"title":1770},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Freplacing-jekyll-plugins-when-migrating-to-eleventy","Replacing Jekyll Plugins When Migrating to Eleventy",{"path":1772,"title":1773},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Frunning-jekyll-in-docker-for-reproducible-builds","Running Jekyll in Docker for Reproducible Builds",{"path":1775,"title":1776},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Frunning-jekyll-on-github-pages-without-plugins","Running Jekyll on GitHub Pages Without Plugins",{"path":1778,"title":1779},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fspeeding-up-slow-jekyll-builds","Speeding Up Slow Jekyll Builds",{"path":1781,"title":1782},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fupgrading-jekyll-and-ruby-versions-safely","Upgrading Jekyll and Ruby Versions Safely",{"path":1784,"title":1785},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fauditing-content-parity-after-a-migration","Auditing Content Parity After a Migration",{"path":1787,"title":1788},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fconverting-front-matter-at-scale-during-migration","Converting Front Matter at Scale During Migration",{"path":1790,"title":1791},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators","Migrating Between Static Site Generators",{"path":1793,"title":1794},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fkeeping-redirects-working-after-an-ssg-migration","Keeping Redirects Working After an SSG Migration",{"path":1796,"title":1797},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-a-docs-site-from-jekyll-to-hugo","Migrating a Docs Site From Jekyll to Hugo",{"path":1799,"title":1800},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-a-wordpress-export-to-eleventy","Migrating a WordPress Export to Eleventy",{"path":1802,"title":1803},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-docusaurus-to-starlight","Migrating from Docusaurus to Starlight",{"path":1805,"title":1806},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-gatsby-to-astro","Migrating from Gatsby to Astro",{"path":1808,"title":1809},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-hugo-to-astro-without-breaking-urls","Migrating From Hugo to Astro Without Breaking URLs",{"path":1811,"title":1812},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-nextjs-pages-router-to-astro","Migrating from Next.js Pages Router to Astro",{"path":1814,"title":1815},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-wordpress-to-a-static-site-generator","Migrating WordPress to a Static Site Generator",{"path":1817,"title":1818},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fporting-shortcodes-and-includes-between-generators","Porting Shortcodes and Includes Between Generators",{"path":1820,"title":1821},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Frecovering-search-traffic-lost-after-a-generator-migration","Recovering Search Traffic Lost After a Generator Migration",{"path":1823,"title":1824},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Freplacing-gatsby-graphql-queries-during-a-migration","Replacing Gatsby GraphQL Queries During a Migration",{"path":1826,"title":1827},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Ffixing-404s-on-refresh-in-nextjs-static-export","Fixing 404s on Refresh in Next.js Static Export",{"path":1829,"title":1830},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fgenerating-sitemaps-and-rss-in-nextjs-static-export","Generating Sitemaps and RSS in Next.js Static Export",{"path":1832,"title":1833},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fhandling-dynamic-routes-in-nextjs-static-export","Handling Dynamic Routes in Next.js Static Export",{"path":1835,"title":1836},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites","Next.js Static Export for Content Sites",{"path":1838,"title":1839},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fmigrating-from-gatsby-to-nextjs-static-export","Migrating from Gatsby to Next.js Static Export",{"path":1841,"title":1842},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fnextjs-app-router-static-export-limitations","Next.js App Router Static Export Limitations",{"path":1844,"title":1845},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fnextjs-static-export-vs-astro-for-marketing-sites","Next.js Static Export vs Astro for Marketing",{"path":1847,"title":1848},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fnextjs-static-export-vs-gatsby-for-existing-react-sites","Next.js Static Export vs Gatsby for Existing React Sites",{"path":1850,"title":1851},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Foptimizing-images-in-nextjs-static-export","Optimizing Images in Next.js Static Export",{"path":1853,"title":1854},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Ftrailing-slash-and-basepath-in-nextjs-static-export","Trailing Slash and basePath in Next.js Static Export",{"path":1856,"title":1857},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fusing-mdx-in-nextjs-static-export","Using MDX in Next.js Static Export",{"path":1859,"title":1860},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Faccessible-search-ui-for-static-sites","Accessible Search UI for Static Sites",{"path":1862,"title":1863},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fadding-pagefind-to-an-astro-site","Adding Pagefind to an Astro Site",{"path":1865,"title":1866},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fbuilding-a-lunr-index-at-build-time-in-eleventy","Building a Lunr Index at Build Time in Eleventy",{"path":1868,"title":1869},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fcustomizing-the-pagefind-ui","Customizing the Pagefind UI",{"path":1871,"title":1872},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Ffixing-missing-results-in-pagefind-indexes","Fixing Missing Results in Pagefind Indexes",{"path":1874,"title":1875},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites","Search for Static Sites",{"path":1877,"title":1878},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Findexing-hugo-sites-with-pagefind","Indexing Hugo Sites with Pagefind",{"path":1880,"title":1881},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fmultilingual-search-on-static-sites","Multilingual Search on Static Sites",{"path":1883,"title":1884},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-algolia-docsearch","Pagefind vs Algolia DocSearch",{"path":1886,"title":1887},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-lunr-for-small-documentation-sites","Pagefind vs Lunr for Small Documentation Sites",{"path":1889,"title":1890},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fsearch-index-size-budgets-for-large-docs","Search Index Size Budgets for Large Docs",{"path":1892,"title":1893},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fself-hosting-typesense-for-a-static-site","Self-Hosting Typesense for a Static Site",{"path":1895,"title":1896},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Ftracking-zero-result-searches","Tracking Zero-Result Searches",{"path":1898,"title":1899},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fbest-ssg-for-technical-writers-without-coding-experience","Best SSG for Non-Developer Technical Writers",{"path":1901,"title":1902},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fchoosing-an-ssg-for-a-marketing-site-with-non-technical-editors","Choosing an SSG for a Marketing Site with Non-Technical Editors",{"path":1904,"title":1905},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fchoosing-an-ssg-for-api-reference-documentation","Choosing an SSG for API Reference Documentation",{"path":1907,"title":1908},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fevaluating-ssg-accessibility-defaults","Evaluating SSG Accessibility Defaults",{"path":1910,"title":1911},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fgatsby-vs-astro-for-content-sites-in-2026","Gatsby vs Astro for Content Sites in 2026",{"path":1913,"title":1914},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix","SSG Framework Selection Matrix",{"path":1916,"title":1917},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fpicking-an-ssg-for-a-multi-language-documentation-site","Picking an SSG for a Multi-Language Docs Site",{"path":1919,"title":1920},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fscoring-ssg-long-term-maintenance-risk","Scoring SSG Long-Term Maintenance Risk",{"path":1922,"title":1923},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fssg-selection-checklist-for-engineering-teams","SSG Selection Checklist for Engineering Teams",{"path":1925,"title":1926},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Ftotal-cost-of-ownership-for-static-site-generators","Total Cost of Ownership for Static Site Generators",{"path":1928,"title":1929},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fwhen-a-static-site-generator-is-the-wrong-choice","When a Static Site Generator Is the Wrong Choice",{"path":1931,"title":1932},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fadding-json-ld-structured-data-at-build-time","Adding JSON-LD Structured Data at Build Time",{"path":1934,"title":1935},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fcanonical-urls-and-duplicate-content-on-static-sites","Canonical URLs and Duplicate Content on Static Sites",{"path":1937,"title":1938},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Ffixing-pages-crawled-but-not-indexed-on-static-sites","Fixing Pages Crawled but Not Indexed on Static Sites",{"path":1940,"title":1941},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Ffixing-soft-404s-on-static-hosts","Fixing Soft 404s on Static Hosts",{"path":1943,"title":1944},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fgenerating-breadcrumb-structured-data-in-astro","Generating Breadcrumb Structured Data in Astro",{"path":1946,"title":1947},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fgenerating-sitemaps-for-large-static-sites","Generating Sitemaps for Large Static Sites",{"path":1949,"title":1950},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites","Technical SEO for Static Sites",{"path":1952,"title":1953},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Frobots-txt-and-noindex-for-preview-and-staging","robots.txt and noindex for Preview and Staging",{"path":1955,"title":1956},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Frss-and-atom-feeds-for-static-blogs","RSS and Atom Feeds for Static Blogs",{"path":1958,"title":1959},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fseo-safe-pagination-and-tag-pages","SEO-Safe Pagination and Tag Pages",{"path":1961,"title":1962},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-busting-with-content-hashed-filenames","Cache Busting with Content-Hashed Filenames",{"path":1964,"title":1965},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-control-headers-for-static-sites-in-nginx","Cache-Control Headers for Static Sites in Nginx",{"path":1967,"title":1968},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-control-headers-on-s3-and-cloudfront","Cache-Control Headers on S3 and CloudFront",{"path":1970,"title":1971},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-control-headers-on-vercel-for-static-sites","Cache-Control Headers on Vercel for Static Sites",{"path":1973,"title":1974},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-keys-and-query-strings-on-cdns","Cache Keys and Query Strings on CDNs",{"path":1976,"title":1977},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcaching-404s-and-redirects-at-the-edge","Caching 404s and Redirects at the Edge",{"path":1979,"title":1980},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcloudflare-vs-cloudfront-cache-hit-ratios-for-static-sites","Cloudflare vs CloudFront Cache Hit Ratios for Static Sites",{"path":1982,"title":1983},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Ffixing-stale-html-after-deploys-on-cloudflare","Fixing Stale HTML After Deploys on Cloudflare",{"path":1985,"title":1986},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs","CDN Caching Rules for SSGs",{"path":1988,"title":1989},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fpurging-the-cdn-cache-after-a-static-deploy","Purging the CDN Cache After a Static Deploy",{"path":1991,"title":1992},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fsetting-cache-control-headers-on-cloudflare-pages","Cache-Control Headers on Cloudflare Pages",{"path":1994,"title":1995},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fsetting-up-proper-cache-headers-on-netlify","Proper Cache Headers on Netlify for SSGs",{"path":1997,"title":1998},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fstale-while-revalidate-for-static-html","Stale-While-Revalidate for Static HTML",{"path":2000,"title":2001},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Ftiered-caching-and-origin-shield","Tiered Caching and Origin Shield",{"path":2003,"title":2004},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fcode-splitting-and-module-preload-in-vite-based-ssgs","Code Splitting and Module Preload in Vite-Based SSGs",{"path":2006,"title":2007},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Ffixing-missing-tailwind-classes-in-production-builds","Fixing Missing Tailwind Classes in Production Builds",{"path":2009,"title":2010},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Ffixing-unused-javascript-warnings-on-static-pages","Fixing Unused JavaScript Warnings on Static Pages",{"path":2012,"title":2013},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization","CSS and JavaScript Asset Optimization",{"path":2015,"title":2016},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Finlining-critical-css-on-static-sites","Inlining Critical CSS on Static Sites",{"path":2018,"title":2019},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fkeeping-tailwind-css-output-small-on-static-sites","Keeping Tailwind CSS Output Small on Static Sites",{"path":2021,"title":2022},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fminifying-html-css-and-js-in-eleventy","Minifying HTML, CSS and JS in Eleventy",{"path":2024,"title":2025},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fprecompressing-assets-with-brotli-and-zstd","Precompressing Assets with Brotli and Zstd",{"path":2027,"title":2028},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fpurging-unused-css-with-tailwind-and-lightningcss","Purging Unused CSS with Tailwind and Lightning CSS",{"path":2030,"title":2031},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fsvg-icon-sprites-vs-inline-icons","SVG Icon Sprites vs Inline Icons",{"path":2033,"title":2034},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Ftailwind-v4-in-astro-without-postcss-plugins","Tailwind v4 in Astro Without PostCSS Plugins",{"path":2036,"title":2037},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Fcls-from-client-side-rendered-components","CLS from Client-Side Rendered Components",{"path":2039,"title":2040},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Fdebugging-cls-with-the-layout-instability-api","Debugging CLS with the Layout Instability API",{"path":2042,"title":2043},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Feliminating-layout-shift-from-web-fonts","Eliminating Layout Shift From Web Fonts",{"path":2045,"title":2046},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-cookie-banners","Fixing CLS from Cookie Banners",{"path":2048,"title":2049},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-dynamic-table-of-contents-widgets","Fixing CLS From Dynamic Table of Contents Widgets",{"path":2051,"title":2052},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-images-without-dimensions-in-markdown","Fixing CLS From Images Without Dimensions in Markdown",{"path":2054,"title":2055},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-late-loading-embeds","Fixing CLS From Late-Loading Embeds",{"path":2057,"title":2058},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-sticky-headers-and-anchor-links","Fixing CLS from Sticky Headers and Anchor Links",{"path":2060,"title":2061},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites","Cumulative Layout Shift Fixes for Static Sites",{"path":2063,"title":2064},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Fmeasuring-cls-in-the-field-with-web-vitals-js","Measuring CLS in the Field With web-vitals.js",{"path":2066,"title":2067},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Freserving-space-for-ad-and-promo-slots","Reserving Space for Ad and Promo Slots",{"path":2069,"title":2070},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Freserving-space-for-images-and-embeds-to-stop-layout-shift","Reserving Space for Images and Embeds",{"path":2072,"title":2073},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fauditing-font-payload-per-page","Auditing Font Payload per Page",{"path":2075,"title":2076},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Ffixing-invisible-text-while-web-fonts-load","Fixing Invisible Text While Web Fonts Load",{"path":2078,"title":2079},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Ffont-display-optional-vs-swap","font-display: optional vs swap",{"path":2081,"title":2082},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites","Font Loading Strategies for Static Sites",{"path":2084,"title":2085},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fmetric-matched-fallback-fonts-with-size-adjust","Metric-Matched Fallback Fonts with size-adjust",{"path":2087,"title":616},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fpreloading-fonts-without-double-downloads",{"path":2089,"title":2090},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fself-hosted-fonts-vs-google-fonts-for-static-sites","Self-Hosted Fonts vs Google Fonts for Static Sites",{"path":2092,"title":2093},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fself-hosting-google-fonts-to-eliminate-layout-shift","Self-Host Google Fonts to Eliminate Layout Shift",{"path":2095,"title":2096},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fsubsetting-variable-fonts-for-faster-first-render","Subsetting Variable Fonts for Faster First Render",{"path":2098,"title":2099},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fusing-system-font-stacks-to-skip-webfonts","Using System Font Stacks to Skip Web Fonts",{"path":2101,"title":2102},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fvariable-fonts-vs-static-weights","Variable Fonts vs Static Weights",{"path":2104,"title":2105},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fart-direction-with-the-picture-element","Art Direction with the Picture Element",{"path":2107,"title":2108},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fblur-up-placeholders-with-lqip","Blur-Up Placeholders with LQIP",{"path":2110,"title":2111},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fbuilding-an-image-cdn-pipeline-for-static-sites","Building an Image CDN Pipeline for Static Sites",{"path":2113,"title":2114},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fcaching-processed-images-between-builds","Caching Processed Images Between Builds",{"path":2116,"title":2117},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Ffixing-blurry-images-from-astro-assets-resizing","Fixing Blurry Images From astro:assets Resizing",{"path":2119,"title":2120},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fgenerating-open-graph-images-at-build-time","Generating Open Graph Images at Build Time",{"path":2122,"title":2123},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro","Image Optimization Pipelines in Astro",{"path":2125,"title":2126},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Flazy-loading-images-without-hurting-lcp","Lazy-Loading Images Without Hurting LCP",{"path":2128,"title":2129},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Foptimizing-webp-images-in-hugo-without-plugins","Optimizing WebP Images in Hugo Without Plugins",{"path":2131,"title":2132},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fresponsive-images-with-srcset-in-eleventy","Responsive Images with srcset in Eleventy",{"path":2134,"title":2135},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fserving-astro-images-through-cloudflare-image-resizing","Serving Astro Images Through Cloudflare Image Resizing",{"path":2137,"title":2138},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fserving-avif-with-fallbacks-on-static-sites","Serving AVIF With Fallbacks on Static Sites",{"path":2140,"title":2141},"\u002Fperformance-optimization-core-web-vitals-for-ssgs","Core Web Vitals Optimization for SSGs",{"path":2143,"title":2144},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fastro-islands-vs-full-hydration-performance","Astro Islands vs Full Hydration Performance",{"path":2146,"title":2147},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fbreaking-up-long-tasks-on-static-sites","Breaking Up Long Tasks on Static Sites",{"path":2149,"title":2150},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fdeferring-hydration-with-client-visible-in-astro","Deferring Hydration with client:visible in Astro",{"path":2152,"title":2153},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Ffixing-hydration-mismatch-errors-in-astro-islands","Fixing Hydration Mismatch Errors in Astro Islands",{"path":2155,"title":2156},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Ffixing-poor-inp-on-static-pages-with-heavy-widgets","Fixing Poor INP on Static Pages With Heavy Widgets",{"path":2158,"title":2159},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fhow-to-reduce-bundle-size-in-eleventy-builds","How to Reduce Bundle Size in Eleventy Builds",{"path":2161,"title":2162},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering","JavaScript Hydration & Partial Rendering",{"path":2164,"title":2165},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fmeasuring-inp-on-static-sites-with-real-user-monitoring","Measuring INP on Static Sites with RUM",{"path":2167,"title":2168},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fpreact-vs-react-islands-bundle-size","Preact vs React Islands Bundle Size",{"path":2170,"title":2171},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Freplacing-react-islands-with-web-components","Replacing React Islands with Web Components",{"path":2173,"title":2174},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fserver-islands-in-astro","Server Islands in Astro",{"path":2176,"title":2177},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Feliminating-render-blocking-css-on-static-sites","Eliminating Render-Blocking CSS on Static Sites",{"path":2179,"title":2180},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Ffixing-lcp-on-text-heavy-documentation-pages","Fixing LCP on Text-Heavy Documentation Pages",{"path":2182,"title":2183},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Ffixing-lcp-regressions-caused-by-cookie-consent-tools","Fixing LCP Regressions Caused by Cookie Consent Tools",{"path":2185,"title":2186},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Ffixing-lcp-when-the-hero-is-a-background-image","Fixing LCP When the Hero Is a Background Image",{"path":2188,"title":2189},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Ffixing-slow-lcp-on-pages-with-embedded-video","Fixing Slow LCP on Pages With Embedded Video",{"path":2191,"title":2192},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Fimproving-ttfb-for-static-html","Improving TTFB for Static HTML",{"path":2194,"title":2195},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites","Largest Contentful Paint Optimization for Static Sites",{"path":2197,"title":1365},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Fmeasuring-lcp-subparts-with-devtools",{"path":2199,"title":1505},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Foptimizing-lcp-on-astro-with-priority-hints",{"path":2201,"title":605},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Freducing-lcp-from-hero-images-on-static-sites",{"path":2203,"title":2204},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fcomparing-lab-and-field-data-with-crux","Comparing Lab and Field Data with CrUX",{"path":2206,"title":2207},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci","Performance Budgets and Lighthouse CI",{"path":2209,"title":2210},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Flighthouse-ci-vs-webpagetest-for-regression-gates","Lighthouse CI vs WebPageTest for Regression Gates",{"path":2212,"title":2213},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fmeasuring-web-vitals-in-playwright-tests","Measuring Web Vitals in Playwright Tests",{"path":2215,"title":2216},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fper-template-performance-budgets","Per-Template Performance Budgets",{"path":2218,"title":2219},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fperformance-testing-on-throttled-mobile-profiles","Performance Testing on Throttled Mobile Profiles",{"path":2221,"title":2222},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Freducing-lighthouse-score-variance-in-ci","Reducing Lighthouse Score Variance in CI",{"path":2224,"title":2225},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Frunning-webpagetest-scripts-against-preview-deploys","Running WebPageTest Scripts Against Preview Deploys",{"path":2227,"title":63},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fsetting-up-lighthouse-ci-for-a-static-site",{"path":2229,"title":2230},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Ftracking-bundle-size-per-pull-request","Tracking Bundle Size per Pull Request",{"path":2232,"title":2233},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Ftracking-page-weight-over-time","Tracking Page Weight Over Time",{"path":2235,"title":1512},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fwriting-a-performance-budget-that-fails-builds",{"path":1555,"title":5},{"path":2238,"title":2239},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fearly-hints-103-on-cloudflare","Early Hints (103) on Cloudflare",{"path":2241,"title":2242},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Ffetchpriority-beyond-the-hero-image","Fetchpriority Beyond the Hero Image",{"path":2244,"title":2245},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Ffixing-wasted-preloads-flagged-by-chrome","Fixing Wasted Preloads Flagged by Chrome",{"path":2247,"title":28},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed",{"path":2249,"title":2250},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Finstant-navigation-with-speculation-rules","Instant Navigation with Speculation Rules",{"path":2252,"title":1498},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fpreconnect-vs-dns-prefetch-on-static-sites",{"path":2254,"title":2255},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fprefetching-links-in-astro","Prefetching Links in Astro",{"path":2257,"title":2258},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fview-transitions-in-astro-without-hurting-vitals","View Transitions in Astro Without Hurting Vitals",{"path":2260,"title":2261},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fview-transitions-on-multi-page-static-sites","View Transitions on Multi-Page Static Sites",{"path":2263,"title":2264},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fauditing-third-party-scripts-with-lighthouse","Auditing Third-Party Scripts With Lighthouse",{"path":2266,"title":2267},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Ffacades-for-chat-widgets-and-maps","Facades for Chat Widgets and Maps",{"path":2269,"title":2270},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Ffixing-main-thread-blocking-from-chat-widgets","Fixing Main-Thread Blocking From Chat Widgets",{"path":2272,"title":2273},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites","Third-Party Script Performance on Static Sites",{"path":2275,"title":2276},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Flazy-loading-youtube-embeds-on-static-sites","Lazy-Loading YouTube Embeds on Static Sites",{"path":2278,"title":2279},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Floading-google-tag-manager-without-hurting-inp","Loading Google Tag Manager Without Hurting INP",{"path":2281,"title":2282},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fmeasuring-third-party-cost-with-request-blocking","Measuring Third-Party Cost with Request Blocking",{"path":2284,"title":2285},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fprivacy-friendly-analytics-compared-by-page-weight","Privacy-Friendly Analytics Compared by Page Weight",{"path":2287,"title":2288},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Frunning-third-party-scripts-in-a-web-worker-with-partytown","Running Third-Party Scripts in a Web Worker with Partytown",{"path":2290,"title":2291},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fself-hosting-analytics-to-cut-third-party-requests","Self-Hosting Analytics to Cut Third-Party Requests",{"path":2293,"title":2294},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fautomating-eleventy-deployments-with-cloudflare-pages","Automating Eleventy Deployments on Cloudflare Pages",{"path":2296,"title":2297},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fbranch-deploy-controls-on-cloudflare-pages","Branch Deploy Controls on Cloudflare Pages",{"path":2299,"title":2300},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fcloudflare-pages-functions-middleware","Cloudflare Pages Functions Middleware",{"path":2302,"title":2303},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fconfiguring-redirects-on-cloudflare-pages","Configuring Redirects on Cloudflare Pages",{"path":2305,"title":2306},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fcustom-domains-and-tls-on-cloudflare-pages","Custom Domains and TLS on Cloudflare Pages",{"path":2308,"title":2309},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fdeploying-astro-to-cloudflare-workers-static-assets","Deploying Astro to Cloudflare Workers Static Assets",{"path":2311,"title":2312},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fdeploying-hugo-to-cloudflare-pages-and-workers","Deploying Hugo to Cloudflare Pages and Workers",{"path":2314,"title":2315},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fdeploying-to-cloudflare-from-github-actions-with-wrangler","Deploying to Cloudflare From GitHub Actions With Wrangler",{"path":2317,"title":2318},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Ffixing-redirect-loops-on-cloudflare-pages","Fixing Redirect Loops on Cloudflare Pages",{"path":2320,"title":2321},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup","Cloudflare Pages Edge Caching Setup",{"path":2323,"title":2324},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fmigrating-from-cloudflare-pages-to-workers-static-assets","Migrating from Cloudflare Pages to Workers Static Assets",{"path":2326,"title":2327},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fchecking-links-in-pull-requests","Checking Links in Pull Requests",{"path":2329,"title":2330},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fcontent-linting-with-markdownlint","Content Linting with markdownlint",{"path":2332,"title":2333},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fdocs-as-code-review-workflow-for-writers","Docs-as-Code Review Workflow for Writers",{"path":2335,"title":2336},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Feditorial-checks-with-vale-in-ci","Editorial Checks with Vale in CI",{"path":2338,"title":2339},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fgit-based-cms-options-for-static-sites-compared","Git-Based CMS Options for Static Sites Compared",{"path":2341,"title":2342},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams","Content Workflows for Documentation Teams",{"path":2344,"title":2345},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fmanaging-images-in-docs-as-code-repos","Managing Images in Docs-as-Code Repos",{"path":2347,"title":2348},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Frelease-notes-and-changelogs-from-git","Release Notes and Changelogs from Git",{"path":2350,"title":2351},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fscheduled-content-publishing-with-github-actions","Scheduled Content Publishing With GitHub Actions",{"path":2353,"title":2354},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fscheduling-content-publication-with-cron-triggered-builds","Scheduling Content Publication With Cron-Triggered Builds",{"path":2356,"title":2357},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fwiring-a-headless-cms-to-a-static-build","Wiring a Headless CMS to a Static Build",{"path":2359,"title":2360},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fbuilding-astro-sites-with-github-actions","Building Astro Sites with GitHub Actions",{"path":2362,"title":2363},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fcaching-node-modules-in-github-actions-for-faster-ssg-builds","Caching node_modules in GitHub Actions",{"path":2365,"title":2366},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fconcurrency-groups-to-cancel-stale-builds","Concurrency Groups to Cancel Stale Builds",{"path":2368,"title":2369},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fdeploying-to-github-pages-with-actions","Deploying to GitHub Pages with Actions",{"path":2371,"title":2372},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fdeploying-to-multiple-environments-from-one-workflow","Deploying to Multiple Environments From One Workflow",{"path":2374,"title":2375},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Ffixing-flaky-static-site-builds-in-github-actions","Fixing Flaky Static Site Builds in GitHub Actions",{"path":2377,"title":2378},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fhow-to-set-up-github-actions-for-hugo-deployments","GitHub Actions for Hugo Deployments",{"path":2380,"title":2381},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds","GitHub Actions for Automated SSG Builds",{"path":2383,"title":2384},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fmatrix-builds-for-multi-site-monorepos","Matrix Builds for Multi-Site Monorepos",{"path":2386,"title":2387},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fpinning-actions-by-commit-sha","Pinning Actions by Commit SHA",{"path":2389,"title":2390},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fpublishing-any-generator-to-github-pages-with-actions","Publishing Any Generator to GitHub Pages With Actions",{"path":2392,"title":2393},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Freusable-workflows-for-ssg-builds","Reusable Workflows for SSG Builds",{"path":2395,"title":2396},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fbuild-caching-on-netlify-and-vercel","Build Caching on Netlify and Vercel",{"path":2398,"title":2399},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fcaching-hugo-builds-in-github-actions","Caching Hugo Builds in GitHub Actions",{"path":2401,"title":2402},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fdeploying-only-changed-files","Deploying Only Changed Files",{"path":2404,"title":2405},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fenabling-incremental-builds-in-eleventy","Enabling Incremental Builds in Eleventy",{"path":2407,"title":2408},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Ffixing-stale-pages-from-incremental-builds","Fixing Stale Pages From Incremental Builds",{"path":2410,"title":2411},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fincremental-builds-in-astro-with-the-content-layer","Incremental Builds in Astro with the Content Layer",{"path":2413,"title":2414},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fincremental-rebuild-times-across-astro-eleventy-and-hugo","Incremental Rebuild Times Across Astro, Eleventy and Hugo",{"path":2416,"title":2417},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs","Incremental Builds and Build Caching for SSGs",{"path":2419,"title":2420},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fmeasuring-build-time-regressions-in-ci","Measuring Build-Time Regressions in CI",{"path":2422,"title":2423},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fremote-caching-with-turborepo-for-ssg-monorepos","Remote Caching with Turborepo for SSG Monorepos",{"path":2425,"title":2426},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fsharing-build-cache-across-ci-runners","Sharing Build Cache Across CI Runners",{"path":2428,"title":2429},"\u002Fproduction-ready-deployment-cicd-workflows","Production-Ready Deployment & CI\u002FCD for SSGs",{"path":2431,"title":2432},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Falerting-on-cache-hit-ratio-drops","Alerting on Cache Hit Ratio Drops",{"path":2434,"title":2435},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fbuilding-a-core-web-vitals-dashboard-from-rum-data","Building a Core Web Vitals Dashboard from RUM Data",{"path":2437,"title":2438},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fcrawling-for-broken-links-on-a-schedule","Crawling for Broken Links on a Schedule",{"path":2440,"title":2441},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Ffinding-the-cause-of-a-sudden-field-lcp-drop","Finding the Cause of a Sudden Field LCP Drop",{"path":2443,"title":2444},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production","Monitoring Static Sites in Production",{"path":2446,"title":2447},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Flogging-404s-at-the-edge","Logging 404s at the Edge",{"path":2449,"title":2450},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fmonitoring-tls-certificate-expiry","Monitoring TLS Certificate Expiry",{"path":2452,"title":2453},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Freal-user-error-tracking-on-static-sites","Real-User Error Tracking on Static Sites",{"path":2455,"title":2456},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fsynthetic-monitoring-with-scheduled-playwright-checks","Synthetic Monitoring With Scheduled Playwright Checks",{"path":2458,"title":2459},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Ftracking-deploy-markers-in-analytics","Tracking Deploy Markers in Analytics",{"path":2461,"title":2462},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fuptime-and-synthetic-checks-for-static-sites","Uptime and Synthetic Checks for Static Sites",{"path":2464,"title":2465},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fbandwidth-pricing-for-static-sites-across-netlify-vercel-and-cloudflare","Static Site Bandwidth Pricing: Netlify, Vercel, Cloudflare",{"path":2467,"title":2468},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fconfiguring-redirects-on-vercel-for-static-sites","Configuring Redirects on Vercel for Static Sites",{"path":2470,"title":2471},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fconfiguring-vercel-for-hugo-and-eleventy","Configuring Vercel for Hugo and Eleventy",{"path":2473,"title":2474},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fdeploying-astro-to-vercel-as-a-fully-static-site","Deploying Astro to Vercel as a Fully Static Site",{"path":2476,"title":2477},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Ffixing-netlify-builds-that-exceed-the-time-limit","Fixing Netlify Builds That Exceed the Time Limit",{"path":2479,"title":2480},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Ffixing-vercel-builds-that-run-out-of-memory","Fixing Vercel Builds That Run Out of Memory",{"path":2482,"title":2483},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies","Netlify vs Vercel Deployment Strategies",{"path":2485,"title":2486},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-build-hooks-for-content-updates","Netlify Build Hooks for Content Updates",{"path":2488,"title":2489},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-edge-functions-for-static-sites","Netlify Edge Functions for Static Sites",{"path":2491,"title":2492},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-redirects-and-rewrites-for-static-sites","Netlify Redirects and Rewrites for Static Sites",{"path":2494,"title":2495},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fsetting-up-deploy-previews-on-netlify-for-every-pull-request","Netlify Deploy Previews for Every Pull Request",{"path":2497,"title":2498},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fvercel-build-output-api-for-custom-ssgs","Vercel Build Output API for Custom SSGs",{"path":2500,"title":2501},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fvercel-isr-vs-static-generation-for-ssgs","Vercel ISR vs Static Generation for SSGs",{"path":2503,"title":2504},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fautomating-preview-deploy-pipelines-with-github-actions","Automating Preview Deploy Pipelines with GitHub Actions",{"path":2506,"title":2507},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fcleaning-up-stale-preview-deployments","Cleaning Up Stale Preview Deployments",{"path":2509,"title":2510},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fcommenting-on-preview-deploys","Commenting on Preview Deploys",{"path":2512,"title":2513},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Ffixing-preview-deploys-leaking-into-search-results","Fixing Preview Deploys Leaking Into Search Results",{"path":2515,"title":2516},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests","Preview Environments for Pull Requests",{"path":2518,"title":2519},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpassword-protecting-preview-deployments","Password-Protecting Preview Deployments",{"path":2521,"title":2522},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpreview-deploys-for-monorepos","Preview Deploys for Monorepos",{"path":2524,"title":2525},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpreviewing-headless-cms-drafts","Previewing Headless CMS Drafts",{"path":2527,"title":2528},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpull-request-previews-for-github-pages-sites","Pull Request Previews for GitHub Pages Sites",{"path":2530,"title":2531},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fvisual-regression-testing-on-preview-deploys","Visual Regression Testing on Preview Deploys",{"path":2533,"title":2534},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fatomic-deploys-vs-incremental-uploads","Atomic Deploys vs Incremental Uploads",{"path":2536,"title":2537},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fblue-green-deploys-for-static-sites","Blue-Green Deploys for Static Sites",{"path":2539,"title":2540},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fcanary-releases-for-static-sites","Canary Releases for Static Sites",{"path":2542,"title":2543},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Ffeature-flags-on-static-sites","Feature Flags on Static Sites",{"path":2545,"title":2546},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites","Rollbacks and Deploy Safety for Static Sites",{"path":2548,"title":2549},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fkeeping-old-assets-alive-after-deploy","Keeping Old Assets Alive After Deploy",{"path":2551,"title":2552},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fpost-deploy-verification-checklists","Post-Deploy Verification Checklists",{"path":2554,"title":2555},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frecovering-from-a-deploy-that-deleted-live-assets","Recovering From a Deploy That Deleted Live Assets",{"path":2557,"title":2558},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frolling-back-a-bad-static-deploy-in-under-a-minute","Rolling Back a Bad Static Deploy in Under a Minute",{"path":2560,"title":2561},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frolling-back-netlify-deploys-from-the-cli-and-api","Rolling Back Netlify Deploys From the CLI and API",{"path":2563,"title":2564},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frolling-back-s3-and-cloudfront-deploys-with-versioned-prefixes","Rolling Back S3 and CloudFront Deploys With Versioned Prefixes",{"path":2566,"title":2567},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frunning-smoke-tests-against-a-preview-url","Running Smoke Tests Against a Preview URL",{"path":2569,"title":2570},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fauditing-npm-dependencies-in-ssg-pipelines","Auditing npm Dependencies in SSG Pipelines",{"path":2572,"title":2573},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fenabling-hsts-and-preload-safely","Enabling HSTS and Preload Safely",{"path":2575,"title":2576},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Ffixing-content-security-policy-violations-from-inline-scripts","Fixing Content Security Policy Violations From Inline Scripts",{"path":2578,"title":2579},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Ffixing-mixed-content-warnings-after-moving-to-https","Fixing Mixed Content Warnings After Moving to HTTPS",{"path":2581,"title":2582},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fhash-based-csp-for-inline-scripts-in-astro","Hash-Based CSP for Inline Scripts in Astro",{"path":2584,"title":2585},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites","Security Headers and Hardening for Static Sites",{"path":2587,"title":2588},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fpermissions-policy-and-cross-origin-headers","Permissions-Policy and Cross-Origin Headers",{"path":2590,"title":2591},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecuring-deploy-credentials-with-github-oidc","Securing Deploy Credentials with GitHub OIDC",{"path":2593,"title":2594},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecurity-headers-for-static-sites-served-by-caddy","Security Headers for Static Sites Served by Caddy",{"path":2596,"title":2597},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecurity-headers-on-vercel-for-static-sites","Security Headers on Vercel for Static Sites",{"path":2599,"title":2600},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecurity-txt-and-disclosure-for-static-sites","security.txt and Disclosure for Static Sites",{"path":2602,"title":2603},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsubresource-integrity-for-third-party-assets","Subresource Integrity for Third-Party Assets",{"path":2605,"title":2606},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fwriting-a-content-security-policy-for-a-static-site","Writing a Content Security Policy for a Static Site",{"path":2608,"title":2609},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fbrotli-and-gzip-precompression-served-by-nginx","Brotli and Gzip Precompression Served by Nginx",{"path":2611,"title":2612},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fclean-urls-and-trailing-slashes-on-s3","Clean URLs and Trailing Slashes on S3",{"path":2614,"title":2615},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fcloudfront-functions-for-redirects","CloudFront Functions for Redirects",{"path":2617,"title":2618},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fdeploying-a-static-site-to-s3-and-cloudfront","Deploying a Static Site to S3 and CloudFront",{"path":2620,"title":2621},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fhosting-on-azure-static-web-apps","Hosting on Azure Static Web Apps",{"path":2623,"title":2624},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites","Self-Hosting Static Sites on S3, Nginx and Caddy",{"path":2626,"title":2627},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fnginx-vs-caddy-for-serving-static-sites","Nginx vs Caddy for Serving Static Sites",{"path":2629,"title":2630},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-from-a-docker-container-with-nginx","Serving a Static Site From a Docker Container With Nginx",{"path":2632,"title":2633},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-caddy-and-automatic-https","Serving a Static Site With Caddy and Automatic HTTPS",{"path":2635,"title":2636},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-caddy","Serving a Static Site with Caddy",{"path":2638,"title":2639},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-nginx","Serving a Static Site with Nginx",{"path":2641,"title":2642},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fstatic-hosting-on-google-cloud-storage","Static Hosting on Google Cloud Storage",{"path":2644,"title":2645},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fzero-downtime-deploys-with-symlink-swaps","Zero-Downtime Deploys with Symlink Swaps",{"path":2647,"title":2648},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fadding-a-contact-form-with-cloudflare-workers","Adding a Contact Form with Cloudflare Workers",{"path":2650,"title":2651},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Ffixing-cold-starts-in-netlify-functions-for-forms","Fixing Cold Starts in Netlify Functions for Forms",{"path":2653,"title":2654},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fhandling-form-submissions-on-a-static-site","Handling Form Submissions on a Static Site",{"path":2656,"title":2657},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites","Serverless Functions for Static Sites",{"path":2659,"title":2660},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fnetlify-functions-vs-cloudflare-workers","Netlify Functions vs Cloudflare Workers",{"path":2662,"title":2663},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fnewsletter-signup-with-an-edge-function","Newsletter Signup with an Edge Function",{"path":2665,"title":2666},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fprotecting-a-static-site-behind-authentication","Protecting a Static Site Behind Authentication",{"path":2668,"title":2669},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fproxying-third-party-apis-from-an-edge-function","Proxying Third-Party APIs from an Edge Function",{"path":2671,"title":2672},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Frate-limiting-edge-functions","Rate Limiting Edge Functions",{"path":2674,"title":2675},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Faccessibility-testing-with-axe-and-pa11y-in-ci","Accessibility Testing with axe and pa11y in CI",{"path":2677,"title":2678},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Fend-to-end-tests-for-static-sites-with-playwright","End-to-End Tests for Static Sites with Playwright",{"path":2680,"title":2681},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ffixing-flaky-playwright-tests-against-preview-deploys","Fixing Flaky Playwright Tests Against Preview Deploys",{"path":2683,"title":2684},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci","Testing Static Sites in CI",{"path":2686,"title":2687},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Fsnapshot-testing-build-output","Snapshot Testing Build Output",{"path":2689,"title":2690},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ftesting-redirects-and-headers-before-deploy","Testing Redirects and Headers Before Deploy",{"path":2692,"title":2693},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ftesting-search-and-navigation-flows-with-playwright","Testing Search and Navigation Flows With Playwright",{"path":2695,"title":2696},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ftesting-structured-data-and-meta-tags","Testing Structured Data and Meta Tags",{"path":2698,"title":2699},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Fvalidating-html-output-in-ci","Validating HTML Output in CI",{"kind":2701,"tools":2705},{"label":2702,"plural":2703,"u":2704},"How-to","How-tos","\u002Fguides\u002Fhow-to\u002F",[],1790943195445]