[{"data":1,"prerenderedAt":2768},["ShallowReactive",2],{"page:\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fgenerating-api-reference-pages-in-starlight-from-openapi":3,"all-docs-nav":1618,"filed:\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fgenerating-api-reference-pages-in-starlight-from-openapi":2759},{"id":4,"title":5,"body":6,"breadcrumb":1595,"dateModified":1605,"datePublished":1605,"description":1606,"extension":857,"faq":1607,"meta":1612,"navigation":449,"path":1613,"seo":1614,"slug":12,"stem":1615,"type":1616,"__hash__":1617},"content\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fgenerating-api-reference-pages-in-starlight-from-openapi\u002Findex.md","Generating API Reference Pages in Starlight From OpenAPI",{"type":7,"value":8,"toc":1573},"minimark",[9,13,17,36,41,54,58,220,224,227,385,390,394,405,578,589,593,600,713,716,838,842,853,879,1088,1093,1097,1108,1112,1115,1139,1265,1269,1284,1288,1365,1368,1372,1375,1449,1453,1488,1492,1495,1499,1504,1507,1511,1514,1518,1521,1525,1528,1532,1569],[10,11,5],"h1",{"id":12},"generating-api-reference-pages-in-starlight-from-openapi",[14,15,16],"p",{},"API reference is the part of product documentation readers use most and writers enjoy least. Every endpoint needs its method, path, parameters, request body, responses and examples, and every one of those changes when the API does. Writing them by hand guarantees drift. The alternative is to treat the OpenAPI specification as the source and generate the reference pages from it at build time, so the docs are exactly as accurate as the spec — and to put the writers' effort into the spec's descriptions and into guides that link to the generated pages.",[14,18,19,20,24,25,30,31,35],{},"This guide generates reference pages for a payments API — 240 operations across 18 tags, 85 schemas, OpenAPI 3.1 — inside a Starlight 0.30 documentation site, using the ",[21,22,23],"code",{},"starlight-openapi"," plugin, then adds spec validation in CI, cross-links between guides and reference, and an optional try-it console. It belongs to ",[26,27,29],"a",{"href":28},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002F","Docs Frameworks: Docusaurus, Starlight and VitePress","; the selection side is covered in ",[26,32,34],{"href":33},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fchoosing-an-ssg-for-api-reference-documentation\u002F","Choosing an SSG for API Reference Documentation",".",[37,38,40],"h2",{"id":39},"prerequisites","Prerequisites",[42,43,44,48,51],"ul",{},[45,46,47],"li",{},"An OpenAPI 3.0 or 3.1 specification in YAML or JSON that validates.",[45,49,50],{},"A Starlight site, Astro 5 or later.",[45,52,53],{},"Access to where the spec is published: a URL, a package, or a file in the docs repository.",[37,55,57],{"id":56},"how-the-pieces-fit","How the Pieces Fit",[59,60,61,216],"figure",{},[62,63,70,71,70,75,70,79,70,86,70,201],"svg",{"viewBox":64,"role":65,"ariaLabelledBy":66,"xmlns":69},"0 0 760 168","img",[67,68],"sloa-flow-title","sloa-flow-desc","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","\n  ",[72,73,74],"title",{"id":67},"Pipeline from the OpenAPI spec in the API repository to generated Starlight pages",[76,77,78],"desc",{"id":68},"Five steps. The API repository holds openapi.yaml as the source of truth. On release, CI lints the spec with Redocly and publishes it as an artifact with the version. The docs build fetches the published spec for the version it documents. The Starlight OpenAPI plugin generates one page per operation and per schema, plus sidebar groups by tag. Guides link to operations by operationId, checked at build time.",[80,81],"rect",{"x":82,"y":82,"width":83,"height":84,"fill":85},"0","760","168","#ffffff",[87,88,90,91,90,101,90,105,90,112,90,115,90,118,90,124,90,127,90,130,90,133,90,141,90,147,90,152,90,157,90,161,90,165,90,168,90,171,90,174,90,179,90,183,90,187,90,191,90,195,90,198,70],"g",{"style":89},"font-family:system-ui, sans-serif;font-size:12px","\n    ",[80,92],{"x":93,"y":94,"width":95,"height":96,"rx":97,"fill":98,"opacity":99,"stroke":98,"style":100},"20.0","64.0","116.8","88.4","8","#6a4c93","0.14","stroke-width:1.5px",[80,102],{"x":103,"y":94,"width":95,"height":96,"rx":97,"fill":104,"opacity":99,"stroke":104,"style":100},"170.8","#1982c4",[106,107],"path",{"d":108,"fill":109,"stroke":110,"style":111},"M138.8 108.2 L166.8 108.2","none","#556071","stroke-width:2px;marker-end:url(#sloa-flow-arrow)",[80,113],{"x":114,"y":94,"width":95,"height":96,"rx":97,"fill":104,"opacity":99,"stroke":104,"style":100},"321.6",[106,116],{"d":117,"fill":109,"stroke":110,"style":111},"M289.6 108.2 L317.6 108.2",[80,119],{"x":120,"y":94,"width":95,"height":96,"rx":97,"fill":121,"opacity":122,"stroke":123,"style":100},"472.4","#8ac926","0.2","#5a8a16",[106,125],{"d":126,"fill":109,"stroke":110,"style":111},"M440.4 108.2 L468.4 108.2",[80,128],{"x":129,"y":94,"width":95,"height":96,"rx":97,"fill":121,"opacity":122,"stroke":123,"style":100},"623.2",[106,131],{"d":132,"fill":109,"stroke":110,"style":111},"M591.2 108.2 L619.2 108.2",[134,135,140],"text",{"x":136,"y":137,"fill":138,"style":139},"380.0","30.0","#1f2937","font-size:16px;text-anchor:middle;font-weight:700","From API repository to reference pages",[134,142,146],{"x":143,"y":144,"fill":138,"style":145},"78.4","106.0","font-size:13px;text-anchor:middle;font-weight:700","openapi.yaml",[134,148,151],{"x":143,"y":149,"fill":110,"style":150},"122.9","font-size:11px;text-anchor:middle","in API repo",[134,153,156],{"x":154,"y":155,"fill":138,"style":145},"229.2","97.5","Lint and",[134,158,160],{"x":154,"y":159,"fill":138,"style":145},"114.4","publish",[134,162,164],{"x":154,"y":163,"fill":110,"style":150},"131.3","per release",[134,166,167],{"x":136,"y":155,"fill":138,"style":145},"Docs build",[134,169,170],{"x":136,"y":159,"fill":138,"style":145},"fetches",[134,172,173],{"x":136,"y":163,"fill":110,"style":150},"pinned version",[134,175,178],{"x":176,"y":177,"fill":138,"style":145},"530.8","90.4","Generate",[134,180,182],{"x":176,"y":181,"fill":138,"style":145},"107.3","pages",[134,184,186],{"x":176,"y":185,"fill":110,"style":150},"124.2","operations,",[134,188,190],{"x":176,"y":189,"fill":110,"style":150},"138.5","schemas",[134,192,194],{"x":193,"y":155,"fill":138,"style":145},"681.6","Guides link by",[134,196,197],{"x":193,"y":159,"fill":138,"style":145},"ID",[134,199,200],{"x":193,"y":163,"fill":110,"style":150},"checked at build",[202,203,90,204,70],"defs",{},[205,206,212,213,90],"marker",{"id":207,"viewBox":208,"refX":97,"refY":209,"markerWidth":210,"markerHeight":210,"orient":211},"sloa-flow-arrow","0 0 10 10","5","7","auto-start-reverse","\n      ",[106,214],{"d":215,"fill":110},"M0 0 L10 5 L0 10 z",[217,218,219],"figcaption",{},"The docs never edit the spec; improvements to descriptions go to the API repository as pull requests.",[37,221,223],{"id":222},"step-1-fetch-a-pinned-spec","Step 1: Fetch a Pinned Spec",[14,225,226],{},"The docs document a specific API version, so the build fetches the spec for that version rather than whatever is newest:",[228,229,234],"pre",{"className":230,"code":231,"language":232,"meta":233,"style":233},"language-js shiki shiki-themes github-light github-dark","\u002F\u002F scripts\u002Ffetch-spec.mjs (runs before astro build)\nconst version = process.env.API_VERSION ?? '2026-09-01';\nconst res = await fetch(`https:\u002F\u002Fartifacts.example.com\u002Fpayments-api\u002F${version}\u002Fopenapi.yaml`);\nif (!res.ok) throw new Error(`spec ${version}: ${res.status}`);\nawait fs.writeFile('src\u002Fspec\u002Fopenapi.yaml', await res.text());\n","js","",[21,235,236,245,276,308,355],{"__ignoreMap":233},[237,238,241],"span",{"class":239,"line":240},"line",1,[237,242,244],{"class":243},"sJ8bj","\u002F\u002F scripts\u002Ffetch-spec.mjs (runs before astro build)\n",[237,246,248,252,256,259,263,266,269,273],{"class":239,"line":247},2,[237,249,251],{"class":250},"szBVR","const",[237,253,255],{"class":254},"sj4cs"," version",[237,257,258],{"class":250}," =",[237,260,262],{"class":261},"sVt8B"," process.env.",[237,264,265],{"class":254},"API_VERSION",[237,267,268],{"class":250}," ??",[237,270,272],{"class":271},"sZZnC"," '2026-09-01'",[237,274,275],{"class":261},";\n",[237,277,279,281,284,286,289,293,296,299,302,305],{"class":239,"line":278},3,[237,280,251],{"class":250},[237,282,283],{"class":254}," res",[237,285,258],{"class":250},[237,287,288],{"class":250}," await",[237,290,292],{"class":291},"sScJk"," fetch",[237,294,295],{"class":261},"(",[237,297,298],{"class":271},"`https:\u002F\u002Fartifacts.example.com\u002Fpayments-api\u002F${",[237,300,301],{"class":261},"version",[237,303,304],{"class":271},"}\u002Fopenapi.yaml`",[237,306,307],{"class":261},");\n",[237,309,311,314,317,320,323,326,329,332,334,337,339,342,345,347,350,353],{"class":239,"line":310},4,[237,312,313],{"class":250},"if",[237,315,316],{"class":261}," (",[237,318,319],{"class":250},"!",[237,321,322],{"class":261},"res.ok) ",[237,324,325],{"class":250},"throw",[237,327,328],{"class":250}," new",[237,330,331],{"class":291}," Error",[237,333,295],{"class":261},[237,335,336],{"class":271},"`spec ${",[237,338,301],{"class":261},[237,340,341],{"class":271},"}: ${",[237,343,344],{"class":261},"res",[237,346,35],{"class":271},[237,348,349],{"class":261},"status",[237,351,352],{"class":271},"}`",[237,354,307],{"class":261},[237,356,358,361,364,367,369,372,375,377,380,382],{"class":239,"line":357},5,[237,359,360],{"class":250},"await",[237,362,363],{"class":261}," fs.",[237,365,366],{"class":291},"writeFile",[237,368,295],{"class":261},[237,370,371],{"class":271},"'src\u002Fspec\u002Fopenapi.yaml'",[237,373,374],{"class":261},", ",[237,376,360],{"class":250},[237,378,379],{"class":261}," res.",[237,381,134],{"class":291},[237,383,384],{"class":261},"());\n",[14,386,387,389],{},[21,388,265],{}," is set in the docs repository and bumped in the same pull request that documents a new release, so guides and reference change together.",[37,391,393],{"id":392},"step-2-generate-the-pages","Step 2: Generate the Pages",[228,395,399],{"className":396,"code":397,"language":398,"meta":233,"style":233},"language-sh shiki shiki-themes github-light github-dark","npm install starlight-openapi\n","sh",[21,400,401],{"__ignoreMap":233},[237,402,403],{"class":239,"line":240},[237,404,397],{},[228,406,408],{"className":230,"code":407,"language":232,"meta":233,"style":233},"\u002F\u002F astro.config.mjs\nimport starlight from '@astrojs\u002Fstarlight';\nimport starlightOpenAPI, { openAPISidebarGroups } from 'starlight-openapi';\n\nexport default defineConfig({\n  integrations: [\n    starlight({\n      title: 'Payments Docs',\n      plugins: [starlightOpenAPI([{ base: 'api', label: 'API reference', schema: '.\u002Fsrc\u002Fspec\u002Fopenapi.yaml' }])],\n      sidebar: [\n        { label: 'Guides', autogenerate: { directory: 'guides' } },\n        ...openAPISidebarGroups,\n      ],\n    }),\n  ],\n});\n",[21,409,410,415,431,445,451,465,471,479,491,521,527,545,554,560,566,572],{"__ignoreMap":233},[237,411,412],{"class":239,"line":240},[237,413,414],{"class":243},"\u002F\u002F astro.config.mjs\n",[237,416,417,420,423,426,429],{"class":239,"line":247},[237,418,419],{"class":250},"import",[237,421,422],{"class":261}," starlight ",[237,424,425],{"class":250},"from",[237,427,428],{"class":271}," '@astrojs\u002Fstarlight'",[237,430,275],{"class":261},[237,432,433,435,438,440,443],{"class":239,"line":278},[237,434,419],{"class":250},[237,436,437],{"class":261}," starlightOpenAPI, { openAPISidebarGroups } ",[237,439,425],{"class":250},[237,441,442],{"class":271}," 'starlight-openapi'",[237,444,275],{"class":261},[237,446,447],{"class":239,"line":310},[237,448,450],{"emptyLinePlaceholder":449},true,"\n",[237,452,453,456,459,462],{"class":239,"line":357},[237,454,455],{"class":250},"export",[237,457,458],{"class":250}," default",[237,460,461],{"class":291}," defineConfig",[237,463,464],{"class":261},"({\n",[237,466,468],{"class":239,"line":467},6,[237,469,470],{"class":261},"  integrations: [\n",[237,472,474,477],{"class":239,"line":473},7,[237,475,476],{"class":291},"    starlight",[237,478,464],{"class":261},[237,480,482,485,488],{"class":239,"line":481},8,[237,483,484],{"class":261},"      title: ",[237,486,487],{"class":271},"'Payments Docs'",[237,489,490],{"class":261},",\n",[237,492,494,497,500,503,506,509,512,515,518],{"class":239,"line":493},9,[237,495,496],{"class":261},"      plugins: [",[237,498,499],{"class":291},"starlightOpenAPI",[237,501,502],{"class":261},"([{ base: ",[237,504,505],{"class":271},"'api'",[237,507,508],{"class":261},", label: ",[237,510,511],{"class":271},"'API reference'",[237,513,514],{"class":261},", schema: ",[237,516,517],{"class":271},"'.\u002Fsrc\u002Fspec\u002Fopenapi.yaml'",[237,519,520],{"class":261}," }])],\n",[237,522,524],{"class":239,"line":523},10,[237,525,526],{"class":261},"      sidebar: [\n",[237,528,530,533,536,539,542],{"class":239,"line":529},11,[237,531,532],{"class":261},"        { label: ",[237,534,535],{"class":271},"'Guides'",[237,537,538],{"class":261},", autogenerate: { directory: ",[237,540,541],{"class":271},"'guides'",[237,543,544],{"class":261}," } },\n",[237,546,548,551],{"class":239,"line":547},12,[237,549,550],{"class":250},"        ...",[237,552,553],{"class":261},"openAPISidebarGroups,\n",[237,555,557],{"class":239,"line":556},13,[237,558,559],{"class":261},"      ],\n",[237,561,563],{"class":239,"line":562},14,[237,564,565],{"class":261},"    }),\n",[237,567,569],{"class":239,"line":568},15,[237,570,571],{"class":261},"  ],\n",[237,573,575],{"class":239,"line":574},16,[237,576,577],{"class":261},"});\n",[14,579,580,581,584,585,588],{},"The plugin generates an overview page from the spec's ",[21,582,583],{},"info",", one page per operation under ",[21,586,587],{},"\u002Fapi\u002Foperations\u002F\u003CoperationId>\u002F",", and one per schema, grouped in the sidebar by tag. Descriptions in the spec are rendered as Markdown, so writers can use links, lists and code in them.",[37,590,592],{"id":591},"step-3-write-better-descriptions-in-the-spec","Step 3: Write Better Descriptions in the Spec",[14,594,595,596,599],{},"The first generated pages showed how thin the spec's prose was: 96 of 240 operations had a one-line summary and no description, and 310 of 1,100 parameters had none at all. Generated reference is only as good as the spec, so the documentation team started contributing to the spec in the API repository. Two lint rules made it stick: Redocly's ",[21,597,598],{},"operation-description"," and a custom rule requiring descriptions on every parameter and schema property, both set to warn and then error.",[228,601,605],{"className":602,"code":603,"language":604,"meta":233,"style":233},"language-yaml shiki shiki-themes github-light github-dark","# redocly.yaml in the API repository\nrules:\n  operation-description: error\n  operation-summary: error\n  rule\u002Fparameter-description:\n    subject: { type: Parameter, property: description }\n    assertions: { defined: true, minLength: 20 }\n    severity: error\n","yaml",[21,606,607,612,621,632,641,648,677,704],{"__ignoreMap":233},[237,608,609],{"class":239,"line":240},[237,610,611],{"class":243},"# redocly.yaml in the API repository\n",[237,613,614,618],{"class":239,"line":247},[237,615,617],{"class":616},"s9eBZ","rules",[237,619,620],{"class":261},":\n",[237,622,623,626,629],{"class":239,"line":278},[237,624,625],{"class":616},"  operation-description",[237,627,628],{"class":261},": ",[237,630,631],{"class":271},"error\n",[237,633,634,637,639],{"class":239,"line":310},[237,635,636],{"class":616},"  operation-summary",[237,638,628],{"class":261},[237,640,631],{"class":271},[237,642,643,646],{"class":239,"line":357},[237,644,645],{"class":616},"  rule\u002Fparameter-description",[237,647,620],{"class":261},[237,649,650,653,656,659,661,664,666,669,671,674],{"class":239,"line":467},[237,651,652],{"class":616},"    subject",[237,654,655],{"class":261},": { ",[237,657,658],{"class":616},"type",[237,660,628],{"class":261},[237,662,663],{"class":271},"Parameter",[237,665,374],{"class":261},[237,667,668],{"class":616},"property",[237,670,628],{"class":261},[237,672,673],{"class":271},"description",[237,675,676],{"class":261}," }\n",[237,678,679,682,684,687,689,692,694,697,699,702],{"class":239,"line":473},[237,680,681],{"class":616},"    assertions",[237,683,655],{"class":261},[237,685,686],{"class":616},"defined",[237,688,628],{"class":261},[237,690,691],{"class":254},"true",[237,693,374],{"class":261},[237,695,696],{"class":616},"minLength",[237,698,628],{"class":261},[237,700,701],{"class":254},"20",[237,703,676],{"class":261},[237,705,706,709,711],{"class":239,"line":481},[237,707,708],{"class":616},"    severity",[237,710,628],{"class":261},[237,712,631],{"class":271},[14,714,715],{},"Over six weeks, operations with descriptions went from 144 to 240 and parameters from 790 to 1,100.",[59,717,718,835],{},[62,719,70,724,70,727,70,730,70,733],{"viewBox":720,"role":65,"ariaLabelledBy":721,"xmlns":69},"0 0 760 248",[722,723],"sloa-desc-title","sloa-desc-desc",[72,725,726],{"id":722},"Share of operations and parameters with descriptions before and after",[76,728,729],{"id":723},"Paired bars. Operations with a description went from 60 percent to 100 percent. Parameters with a description went from 72 percent to 100 percent. Schemas with examples went from 31 percent to 88 percent.",[80,731],{"x":82,"y":82,"width":83,"height":732,"fill":85},"248",[87,734,90,735,90,746,90,750,90,757,90,761,90,765,90,768,90,772,90,776,90,779,90,782,90,788,90,792,90,796,90,803,90,809,90,813,90,818,90,821,90,825,90,830,70],{"style":89},[80,736],{"x":737,"y":738,"width":739,"height":740,"rx":741,"fill":742,"opacity":743,"stroke":744,"style":745},"306.8","50.0","14.0","12.0","2","#ff595e","0.3","#d83b41","stroke-width:1px",[80,747],{"x":748,"y":738,"width":739,"height":740,"rx":741,"fill":121,"opacity":749,"stroke":123,"style":745},"398.4","0.4",[80,751],{"x":752,"y":753,"width":754,"height":755,"rx":756,"fill":742,"opacity":743,"stroke":744,"style":745},"230.0","82.0","276.5","16.0","3",[80,758],{"x":752,"y":759,"width":760,"height":755,"rx":756,"fill":121,"opacity":749,"stroke":123,"style":745},"102.0","460.9",[80,762],{"x":752,"y":763,"width":764,"height":755,"rx":756,"fill":742,"opacity":743,"stroke":744,"style":745},"134.0","331.8",[80,766],{"x":752,"y":767,"width":760,"height":755,"rx":756,"fill":121,"opacity":749,"stroke":123,"style":745},"154.0",[80,769],{"x":752,"y":770,"width":771,"height":755,"rx":756,"fill":742,"opacity":743,"stroke":744,"style":745},"186.0","142.9",[80,773],{"x":752,"y":774,"width":775,"height":755,"rx":756,"fill":121,"opacity":749,"stroke":123,"style":745},"206.0","405.6",[106,777],{"d":778,"fill":109,"stroke":110,"style":100},"M230.0 78.0 L230.0 228.0",[134,780,781],{"x":136,"y":137,"fill":138,"style":139},"Spec coverage before and after the lint rules",[134,783,787],{"x":784,"y":785,"fill":110,"style":786},"326.8","60.0","font-size:12px;text-anchor:start","Before",[134,789,791],{"x":790,"y":785,"fill":110,"style":786},"418.4","After",[134,793,795],{"x":93,"y":794,"fill":138,"style":786},"105.2","Operations with description",[134,797,802],{"x":798,"y":799,"fill":800,"style":801},"513.5","94.5","#b32b30","font-size:11.5px;text-anchor:start;font-weight:700","60%",[134,804,808],{"x":805,"y":806,"fill":807,"style":801},"697.9","114.5","#3f6410","100%",[134,810,812],{"x":93,"y":811,"fill":138,"style":786},"157.2","Parameters with description",[134,814,817],{"x":815,"y":816,"fill":800,"style":801},"568.8","146.5","72%",[134,819,808],{"x":805,"y":820,"fill":807,"style":801},"166.5",[134,822,824],{"x":93,"y":823,"fill":138,"style":786},"209.2","Schemas with examples",[134,826,829],{"x":827,"y":828,"fill":800,"style":801},"379.9","198.5","31%",[134,831,834],{"x":832,"y":833,"fill":807,"style":801},"642.6","218.5","88%",[217,836,837],{},"Measured with a script over the spec at the start and after six weeks of pull requests to the API repository.",[37,839,841],{"id":840},"step-4-link-guides-to-operations-safely","Step 4: Link Guides to Operations Safely",[14,843,844,845,848,849,852],{},"Guides refer to endpoints constantly (\"create a refund with ",[21,846,847],{},"POST \u002Frefunds","\"). Linking by URL breaks when an ",[21,850,851],{},"operationId"," changes, and nothing would notice. A small remark plugin resolves a custom link syntax at build time and fails on unknown IDs:",[228,854,858],{"className":855,"code":856,"language":857,"meta":233,"style":233},"language-md shiki shiki-themes github-light github-dark","Create the refund with [`POST \u002Frefunds`](op:createRefund).\n","md",[21,859,860],{"__ignoreMap":233},[237,861,862,865,869,872,876],{"class":239,"line":240},[237,863,864],{"class":261},"Create the refund with [",[237,866,868],{"class":867},"stb5B","`POST \u002Frefunds`",[237,870,871],{"class":261},"](",[237,873,875],{"class":874},"s2frl","op:createRefund",[237,877,878],{"class":261},").\n",[228,880,882],{"className":230,"code":881,"language":232,"meta":233,"style":233},"\u002F\u002F remark-op-links.mjs\nconst ops = new Set(Object.values(spec.paths).flatMap((p) => Object.values(p).map((o) => o.operationId)));\nvisit(tree, 'link', (node) => {\n  if (!node.url.startsWith('op:')) return;\n  const id = node.url.slice(3);\n  if (!ops.has(id)) file.fail(`Unknown operationId \"${id}\"`, node);\n  node.url = `\u002Fapi\u002Foperations\u002F${id.toLowerCase()}\u002F`;\n});\n",[21,883,884,889,950,974,1002,1024,1058,1084],{"__ignoreMap":233},[237,885,886],{"class":239,"line":240},[237,887,888],{"class":243},"\u002F\u002F remark-op-links.mjs\n",[237,890,891,893,896,898,900,903,906,909,912,915,918,921,924,927,930,932,935,938,940,943,945,947],{"class":239,"line":247},[237,892,251],{"class":250},[237,894,895],{"class":254}," ops",[237,897,258],{"class":250},[237,899,328],{"class":250},[237,901,902],{"class":291}," Set",[237,904,905],{"class":261},"(Object.",[237,907,908],{"class":291},"values",[237,910,911],{"class":261},"(spec.paths).",[237,913,914],{"class":291},"flatMap",[237,916,917],{"class":261},"((",[237,919,14],{"class":920},"s4XuR",[237,922,923],{"class":261},") ",[237,925,926],{"class":250},"=>",[237,928,929],{"class":261}," Object.",[237,931,908],{"class":291},[237,933,934],{"class":261},"(p).",[237,936,937],{"class":291},"map",[237,939,917],{"class":261},[237,941,942],{"class":920},"o",[237,944,923],{"class":261},[237,946,926],{"class":250},[237,948,949],{"class":261}," o.operationId)));\n",[237,951,952,955,958,961,964,967,969,971],{"class":239,"line":278},[237,953,954],{"class":291},"visit",[237,956,957],{"class":261},"(tree, ",[237,959,960],{"class":271},"'link'",[237,962,963],{"class":261},", (",[237,965,966],{"class":920},"node",[237,968,923],{"class":261},[237,970,926],{"class":250},[237,972,973],{"class":261}," {\n",[237,975,976,979,981,983,986,989,991,994,997,1000],{"class":239,"line":310},[237,977,978],{"class":250},"  if",[237,980,316],{"class":261},[237,982,319],{"class":250},[237,984,985],{"class":261},"node.url.",[237,987,988],{"class":291},"startsWith",[237,990,295],{"class":261},[237,992,993],{"class":271},"'op:'",[237,995,996],{"class":261},")) ",[237,998,999],{"class":250},"return",[237,1001,275],{"class":261},[237,1003,1004,1007,1010,1012,1015,1018,1020,1022],{"class":239,"line":357},[237,1005,1006],{"class":250},"  const",[237,1008,1009],{"class":254}," id",[237,1011,258],{"class":250},[237,1013,1014],{"class":261}," node.url.",[237,1016,1017],{"class":291},"slice",[237,1019,295],{"class":261},[237,1021,756],{"class":254},[237,1023,307],{"class":261},[237,1025,1026,1028,1030,1032,1035,1038,1041,1044,1046,1049,1052,1055],{"class":239,"line":467},[237,1027,978],{"class":250},[237,1029,316],{"class":261},[237,1031,319],{"class":250},[237,1033,1034],{"class":261},"ops.",[237,1036,1037],{"class":291},"has",[237,1039,1040],{"class":261},"(id)) file.",[237,1042,1043],{"class":291},"fail",[237,1045,295],{"class":261},[237,1047,1048],{"class":271},"`Unknown operationId \"${",[237,1050,1051],{"class":261},"id",[237,1053,1054],{"class":271},"}\"`",[237,1056,1057],{"class":261},", node);\n",[237,1059,1060,1063,1066,1069,1071,1073,1076,1079,1082],{"class":239,"line":473},[237,1061,1062],{"class":261},"  node.url ",[237,1064,1065],{"class":250},"=",[237,1067,1068],{"class":271}," `\u002Fapi\u002Foperations\u002F${",[237,1070,1051],{"class":261},[237,1072,35],{"class":271},[237,1074,1075],{"class":291},"toLowerCase",[237,1077,1078],{"class":271},"()",[237,1080,1081],{"class":271},"}\u002F`",[237,1083,275],{"class":261},[237,1085,1086],{"class":239,"line":481},[237,1087,577],{"class":261},[14,1089,1090,1091,35],{},"When the API team renamed four operations in a release, the docs build failed on the seven guide links that used them, in the pull request that bumped ",[21,1092,265],{},[37,1094,1096],{"id":1095},"step-5-add-an-optional-try-it-console","Step 5: Add an Optional Try-It Console",[14,1098,1099,1100,1103,1104,35],{},"Some readers want to send a request from the page. A try-it panel built as a small Preact island, loaded with ",[21,1101,1102],{},"client:visible"," and only when the reader clicks \"Try it\", sends requests to the sandbox environment with a test key the reader pastes in. It adds 19 KB of JavaScript on the operation pages, and only when opened; the static content is complete without it. Keeping it optional means the reference stays fast and indexable, a trade-off discussed in ",[26,1105,1107],{"href":1106},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fdeferring-hydration-with-client-visible-in-astro\u002F","Deferring Hydration with client:visible in Astro",[37,1109,1111],{"id":1110},"step-6-validate-in-ci-on-both-sides","Step 6: Validate in CI on Both Sides",[14,1113,1114],{},"Two checks keep the reference correct:",[1116,1117,1118,1129],"ol",{},[45,1119,1120,1124,1125,1128],{},[1121,1122,1123],"strong",{},"In the API repository",", every pull request lints the spec with Redocly and runs ",[21,1126,1127],{},"oasdiff"," against the last release to flag breaking changes, which must be labelled and documented.",[45,1130,1131,1134,1135,1138],{},[1121,1132,1133],{},"In the docs repository",", the build fails on an unresolvable spec, unknown ",[21,1136,1137],{},"op:"," links, or a spec that fails Redocly's lint, so a bad spec cannot publish broken reference.",[59,1140,1141,1262],{},[62,1142,70,1147,70,1150,70,1153,70,1156],{"viewBox":1143,"role":65,"ariaLabelledBy":1144,"xmlns":69},"0 0 760 252",[1145,1146],"sloa-checks-title","sloa-checks-desc",[72,1148,1149],{"id":1145},"Problems caught by checks in the API and docs repositories",[76,1151,1152],{"id":1146},"A matrix of four problems against two places checks run. A missing description is caught by the lint in the API repository and by the lint in the docs build. A breaking change is caught by oasdiff in the API repository. A renamed operation used by a guide is caught by the op link check in the docs build. An invalid spec is caught in both places.",[80,1154],{"x":82,"y":82,"width":83,"height":1155,"fill":85},"252",[87,1157,90,1158,90,1161,90,1167,90,1170,90,1174,90,1177,90,1179,90,1182,90,1185,90,1187,90,1190,90,1193,90,1195,90,1198,90,1201,90,1206,90,1211,90,1214,90,1218,90,1223,90,1226,90,1230,90,1233,90,1236,90,1240,90,1244,90,1248,90,1251,90,1255,90,1259,70],{"style":89},[106,1159],{"d":1160,"fill":109,"stroke":110,"style":100},"M20.0 86.0 L740.0 86.0",[80,1162],{"x":1163,"y":1164,"width":1165,"height":1166,"rx":209,"fill":121,"opacity":122,"stroke":123,"style":745},"214.0","90.0","257.0","25.6",[80,1168],{"x":1169,"y":1164,"width":1165,"height":1166,"rx":209,"fill":104,"opacity":99,"stroke":104,"style":745},"479.0",[106,1171],{"d":1172,"fill":109,"stroke":1173,"style":745},"M20.0 119.6 L740.0 119.6","#d9e2ef",[80,1175],{"x":1163,"y":1176,"width":1165,"height":1166,"rx":209,"fill":121,"opacity":122,"stroke":123,"style":745},"123.6",[80,1178],{"x":1169,"y":1176,"width":1165,"height":1166,"rx":209,"fill":104,"opacity":99,"stroke":104,"style":745},[106,1180],{"d":1181,"fill":109,"stroke":1173,"style":745},"M20.0 153.2 L740.0 153.2",[80,1183],{"x":1163,"y":811,"width":1165,"height":1184,"rx":209,"fill":104,"opacity":99,"stroke":104,"style":745},"41.2",[80,1186],{"x":1169,"y":811,"width":1165,"height":1184,"rx":209,"fill":121,"opacity":122,"stroke":123,"style":745},[106,1188],{"d":1189,"fill":109,"stroke":1173,"style":745},"M20.0 202.4 L740.0 202.4",[80,1191],{"x":1163,"y":1192,"width":1165,"height":1166,"rx":209,"fill":121,"opacity":122,"stroke":123,"style":745},"206.4",[80,1194],{"x":1169,"y":1192,"width":1165,"height":1166,"rx":209,"fill":121,"opacity":122,"stroke":123,"style":745},[106,1196],{"d":1197,"fill":109,"stroke":1173,"style":745},"M20.0 236.0 L740.0 236.0",[134,1199,1200],{"x":136,"y":137,"fill":138,"style":139},"Which check catches which problem",[134,1202,1205],{"x":137,"y":1203,"fill":138,"style":1204},"75.2","font-size:12px;text-anchor:start;font-weight:700","Problem",[134,1207,1210],{"x":1208,"y":1203,"fill":138,"style":1209},"342.5","font-size:12px;text-anchor:middle;font-weight:700","API repository",[134,1212,167],{"x":1213,"y":1203,"fill":138,"style":1209},"607.5",[134,1215,1217],{"x":137,"y":1216,"fill":138,"style":1204},"106.4","Missing description",[134,1219,1222],{"x":1208,"y":1220,"fill":138,"style":1221},"106.2","font-size:11.5px;text-anchor:middle","Redocly lint",[134,1224,1225],{"x":1213,"y":1220,"fill":138,"style":1221},"lint again",[134,1227,1229],{"x":137,"y":1228,"fill":138,"style":1204},"140.0","Breaking change",[134,1231,1127],{"x":1208,"y":1232,"fill":138,"style":1221},"139.8",[134,1234,1235],{"x":1213,"y":1232,"fill":138,"style":1221},"not checked",[134,1237,1239],{"x":137,"y":1238,"fill":138,"style":1204},"173.6","Renamed operation in a",[134,1241,1243],{"x":137,"y":1242,"fill":138,"style":1204},"189.2","guide",[134,1245,1247],{"x":1208,"y":1246,"fill":138,"style":1221},"181.2","not visible",[134,1249,1250],{"x":1213,"y":1246,"fill":138,"style":1221},"op: link check",[134,1252,1254],{"x":137,"y":1253,"fill":138,"style":1204},"222.8","Invalid spec",[134,1256,1258],{"x":1208,"y":1257,"fill":138,"style":1221},"222.6","lint fails",[134,1260,1261],{"x":1213,"y":1257,"fill":138,"style":1221},"build fails",[217,1263,1264],{},"Problems are caught as close as possible to the change that caused them.",[37,1266,1268],{"id":1267},"customising-the-generated-layout","Customising the Generated Layout",[14,1270,1271,1272,1275,1276,1279,1280,1283],{},"The plugin's default operation page lists parameters, request body and responses in that order. Readers of this API most often wanted an example request first, so the site overrides Starlight's ",[21,1273,1274],{},"MarkdownContent"," component for pages under ",[21,1277,1278],{},"\u002Fapi\u002F"," to move the first ",[21,1281,1282],{},"x-codeSamples"," entry from the spec above the parameter tables, rendered as Starlight tabs for curl, Node and Python. The override is about 50 lines and does not fork the plugin; it reads the operation from the page's route data. A second small change shows the operation's required OAuth scopes as a badge next to the method and path, because support tickets showed readers missing the scope requirement buried in the security section.",[37,1285,1287],{"id":1286},"performance-of-the-generated-pages","Performance of the Generated Pages",[1289,1290,1291,1307],"table",{},[1292,1293,1294],"thead",{},[1295,1296,1297,1301,1304],"tr",{},[1298,1299,1300],"th",{},"Measure",[1298,1302,1303],{},"Value",[1298,1305,1306],{},"Tool",[1308,1309,1310,1322,1333,1344,1355],"tbody",{},[1295,1311,1312,1316,1319],{},[1313,1314,1315],"td",{},"Pages generated",[1313,1317,1318],{},"240 operations, 85 schemas, 1 overview",[1313,1320,1321],{},"Build output",[1295,1323,1324,1327,1330],{},[1313,1325,1326],{},"Build time added",[1313,1328,1329],{},"9 s (38 s → 47 s)",[1313,1331,1332],{},"hyperfine",[1295,1334,1335,1338,1341],{},[1313,1336,1337],{},"Operation page, transferred",[1313,1339,1340],{},"41 KB (19 KB more when try-it opened)",[1313,1342,1343],{},"DevTools",[1295,1345,1346,1349,1352],{},[1313,1347,1348],{},"LCP, operation page, mobile",[1313,1350,1351],{},"1.0 s",[1313,1353,1354],{},"Lighthouse 12",[1295,1356,1357,1360,1363],{},[1313,1358,1359],{},"Search",[1313,1361,1362],{},"Pagefind indexes reference pages with guides",[1313,1364,1321],{},[14,1366,1367],{},"The generated pages are ordinary Starlight pages, so they get the same theme, search and dark mode as the guides.",[37,1369,1371],{"id":1370},"measured-impact","Measured Impact",[14,1373,1374],{},"Compared with the hand-maintained reference the site had before:",[1289,1376,1377,1392],{},[1292,1378,1379],{},[1295,1380,1381,1383,1386,1389],{},[1298,1382,1300],{},[1298,1384,1385],{},"Hand-written",[1298,1387,1388],{},"Generated",[1298,1390,1391],{},"Source",[1308,1393,1394,1408,1421,1435],{},[1295,1395,1396,1399,1402,1405],{},[1313,1397,1398],{},"Endpoints documented",[1313,1400,1401],{},"201 of 240",[1313,1403,1404],{},"240 of 240",[1313,1406,1407],{},"Spec vs pages",[1295,1409,1410,1413,1416,1418],{},[1313,1411,1412],{},"Reference errors reported by readers, per quarter",[1313,1414,1415],{},"23",[1313,1417,741],{},[1313,1419,1420],{},"Support tickets",[1295,1422,1423,1426,1429,1432],{},[1313,1424,1425],{},"Writer hours on reference, per release",[1313,1427,1428],{},"~14",[1313,1430,1431],{},"~3 (spec descriptions)",[1313,1433,1434],{},"Time tracking",[1295,1436,1437,1440,1443,1446],{},[1313,1438,1439],{},"Broken guide links to endpoints after a release",[1313,1441,1442],{},"5–10",[1313,1444,1445],{},"0 (build fails)",[1313,1447,1448],{},"Link checker",[37,1450,1452],{"id":1451},"pitfalls-rollback","Pitfalls & Rollback",[42,1454,1455,1461,1467,1473,1479],{},[45,1456,1457,1460],{},[1121,1458,1459],{},"Generating from an unpinned spec."," Docs then describe an API that has not shipped; pin the version.",[45,1462,1463,1466],{},[1121,1464,1465],{},"Accepting thin spec descriptions."," Generated pages expose them; lint for them in the API repository.",[45,1468,1469,1472],{},[1121,1470,1471],{},"Linking guides to reference by URL."," Use operation IDs resolved at build time.",[45,1474,1475,1478],{},[1121,1476,1477],{},"Making the try-it console load by default."," Keep it an opt-in island.",[45,1480,1481,1484,1485,1487],{},[1121,1482,1483],{},"Rollback:"," remove the plugin and its sidebar groups; guides' ",[21,1486,1137],{}," links would then fail the build, so switch the remark plugin to emit plain text before removing the reference.",[37,1489,1491],{"id":1490},"conclusion","Conclusion",[14,1493,1494],{},"Generating Starlight reference pages from a pinned OpenAPI spec makes the reference exactly as accurate as the spec, and moves writers' effort to where it pays: descriptions in the spec and guides that link to operations by ID. For a 240-operation payments API, it documented every endpoint, cut reader-reported reference errors from 23 a quarter to 2, and added 9 seconds to the build.",[37,1496,1498],{"id":1497},"faq","FAQ",[1500,1501,1503],"h3",{"id":1502},"should-api-reference-pages-be-generated-or-written-by-hand","Should API reference pages be generated or written by hand?",[14,1505,1506],{},"Generated, from the same OpenAPI specification the API is built or tested against. Hand-written reference drifts from the real API within weeks. Generated pages are always as accurate as the spec, and writers spend their time on guides, examples and descriptions inside the spec rather than on tables of parameters.",[1500,1508,1510],{"id":1509},"does-generating-hundreds-of-operation-pages-slow-the-starlight-build","Does generating hundreds of operation pages slow the Starlight build?",[14,1512,1513],{},"Somewhat. On the site in this guide, 240 operation pages and 85 schema pages added 9 seconds to a 38-second build. The cost is in rendering, not parsing the spec, and it scales with the number of operations. Splitting a very large spec into tagged groups keeps sidebars usable but does not change build time much.",[1500,1515,1517],{"id":1516},"can-i-use-an-interactive-api-console-instead-of-static-pages","Can I use an interactive API console instead of static pages?",[14,1519,1520],{},"You can embed one, but static pages should come first. They are searchable, indexable, readable without JavaScript and fast. An interactive try-it console works well as an optional island on each operation page, loaded only when the reader asks for it.",[1500,1522,1524],{"id":1523},"how-do-i-keep-the-spec-and-the-docs-in-sync","How do I keep the spec and the docs in sync?",[14,1526,1527],{},"Store the spec in the API's repository as the source of truth, publish it as a build artifact or package on each release, and have the docs build fetch the version it documents. A CI check that lints and diffs the spec on every API pull request catches undocumented changes before release.",[37,1529,1531],{"id":1530},"related","Related",[42,1533,1534,1543,1548,1555,1562],{},[45,1535,1536,1539,1540,1542],{},[1121,1537,1538],{},"Parent:"," ",[26,1541,29],{"href":28}," — what each framework offers for reference docs.",[45,1544,1545,1547],{},[26,1546,34],{"href":33}," — the selection criteria.",[45,1549,1550,1554],{},[26,1551,1553],{"href":1552},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fcustomizing-starlight-without-forking-the-theme\u002F","Customizing Starlight Without Forking the Theme"," — adjusting generated pages' layout.",[45,1556,1557,1561],{},[26,1558,1560],{"href":1559},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Floading-remote-content-with-astro-content-layer-loaders\u002F","Loading Remote Content With Astro Content Layer Loaders"," — another way to bring external data into an Astro build.",[45,1563,1564,1568],{},[26,1565,1567],{"href":1566},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ftesting-structured-data-and-meta-tags\u002F","Testing Structured Data and Meta Tags"," — checks that also apply to generated pages.",[1570,1571,1572],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .stb5B, html code.shiki .stb5B{--shiki-default:#005CC5;--shiki-default-text-decoration:underline;--shiki-dark:#79B8FF;--shiki-dark-text-decoration:underline}html pre.shiki code .s2frl, html code.shiki .s2frl{--shiki-default:#24292E;--shiki-default-text-decoration:underline;--shiki-dark:#E1E4E8;--shiki-dark-text-decoration:underline}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":233,"searchDepth":247,"depth":247,"links":1574},[1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1594],{"id":39,"depth":247,"text":40},{"id":56,"depth":247,"text":57},{"id":222,"depth":247,"text":223},{"id":392,"depth":247,"text":393},{"id":591,"depth":247,"text":592},{"id":840,"depth":247,"text":841},{"id":1095,"depth":247,"text":1096},{"id":1110,"depth":247,"text":1111},{"id":1267,"depth":247,"text":1268},{"id":1286,"depth":247,"text":1287},{"id":1370,"depth":247,"text":1371},{"id":1451,"depth":247,"text":1452},{"id":1490,"depth":247,"text":1491},{"id":1497,"depth":247,"text":1498,"children":1589},[1590,1591,1592,1593],{"id":1502,"depth":278,"text":1503},{"id":1509,"depth":278,"text":1510},{"id":1516,"depth":278,"text":1517},{"id":1523,"depth":278,"text":1524},{"id":1530,"depth":247,"text":1531},[1596,1599,1602,1603],{"name":1597,"item":1598},"Home","\u002F",{"name":1600,"item":1601},"Choosing the Right Static Site Generator for Production","\u002Fchoosing-the-right-static-site-generator-for-production\u002F",{"name":29,"item":28},{"name":5,"item":1604},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fgenerating-api-reference-pages-in-starlight-from-openapi\u002F","2026-10-02","Build REST API reference pages in Starlight from an OpenAPI spec at build time, link them with the guides, validate the spec in CI and keep pages fast.",[1608,1609,1610,1611],{"q":1503,"a":1506},{"q":1510,"a":1513},{"q":1517,"a":1520},{"q":1524,"a":1527},{},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fgenerating-api-reference-pages-in-starlight-from-openapi",{"title":5,"description":1606},"choosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fgenerating-api-reference-pages-in-starlight-from-openapi\u002Findex","article","WPyr6b4-zzRXfxL24Ov7UwRQVgUCsnDQQnB2Ze2GmYQ",[1619,1622,1625,1628,1631,1634,1637,1640,1643,1646,1649,1652,1655,1658,1661,1664,1667,1670,1673,1675,1678,1681,1684,1687,1690,1693,1696,1698,1701,1704,1705,1707,1710,1713,1716,1719,1722,1725,1728,1731,1734,1737,1740,1743,1746,1749,1752,1755,1758,1761,1764,1767,1770,1773,1775,1778,1781,1784,1787,1790,1793,1796,1799,1802,1805,1808,1811,1814,1817,1820,1823,1826,1829,1832,1835,1838,1841,1844,1847,1850,1853,1856,1859,1862,1865,1868,1871,1874,1877,1880,1883,1886,1889,1892,1895,1898,1901,1904,1907,1910,1913,1916,1919,1922,1925,1928,1931,1934,1937,1940,1943,1946,1949,1952,1955,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,2089,2092,2095,2098,2101,2104,2107,2110,2113,2116,2119,2122,2125,2128,2131,2134,2137,2140,2143,2146,2149,2152,2155,2158,2161,2164,2167,2170,2173,2176,2179,2182,2185,2188,2191,2194,2197,2200,2202,2205,2208,2211,2214,2217,2220,2223,2226,2229,2232,2235,2238,2241,2244,2247,2250,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,2700,2703,2706,2709,2712,2715,2718,2721,2724,2727,2730,2733,2736,2739,2742,2745,2748,2751,2754,2756],{"path":1620,"title":1621},"\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":1623,"title":1624},"\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":1626,"title":1627},"\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":1629,"title":1630},"\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":1632,"title":1633},"\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":1635,"title":1636},"\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":1638,"title":1639},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites","Accessibility for Static Sites",{"path":1641,"title":1642},"\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":1644,"title":1645},"\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":1647,"title":1648},"\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":1650,"title":1651},"\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":1653,"title":1654},"\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":1656,"title":1657},"\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":1659,"title":1660},"\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":1662,"title":1663},"\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":1665,"title":1666},"\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":1668,"title":1669},"\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":1671,"title":1672},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites","Astro vs Eleventy for Documentation Sites",{"path":1674,"title":1560},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Floading-remote-content-with-astro-content-layer-loaders",{"path":1676,"title":1677},"\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":1679,"title":1680},"\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":1682,"title":1683},"\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":1685,"title":1686},"\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":1688,"title":1689},"\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":1691,"title":1692},"\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":1694,"title":1695},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fcomparing-docs-framework-build-times","Comparing Docs Framework Build Times",{"path":1697,"title":1553},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fcustomizing-starlight-without-forking-the-theme",{"path":1699,"title":1700},"\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":1702,"title":1703},"\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":1613,"title":5},{"path":1706,"title":29},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress",{"path":1708,"title":1709},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Finternationalizing-starlight-docs","Internationalizing Starlight Docs",{"path":1711,"title":1712},"\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":1714,"title":1715},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmigrating-from-mkdocs-to-starlight","Migrating from MkDocs to Starlight",{"path":1717,"title":1718},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmigrating-mkdocs-documentation-to-vitepress","Migrating MkDocs Documentation to VitePress",{"path":1720,"title":1721},"\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":1723,"title":1724},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fversioned-documentation-with-docusaurus","Versioned Documentation with Docusaurus",{"path":1726,"title":1727},"\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":1729,"title":1730},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fvitepress-for-library-documentation","VitePress for Library Documentation",{"path":1732,"title":1733},"\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":1735,"title":1736},"\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":1738,"title":1739},"\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":1741,"title":1742},"\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":1744,"title":1745},"\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":1747,"title":1748},"\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":1750,"title":1751},"\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":1753,"title":1754},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories","Hugo Build Times for Large Repositories",{"path":1756,"title":1757},"\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":1759,"title":1760},"\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":1762,"title":1763},"\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":1765,"title":1766},"\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":1768,"title":1769},"\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":1771,"title":1772},"\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":1774,"title":1600},"\u002Fchoosing-the-right-static-site-generator-for-production",{"path":1776,"title":1777},"\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":1779,"title":1780},"\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":1782,"title":1783},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fi18n-routing-in-astro","i18n Routing in Astro",{"path":1785,"title":1786},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites","Internationalization for Static Sites",{"path":1788,"title":1789},"\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":1791,"title":1792},"\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":1794,"title":1795},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fmultilingual-sites-with-hugo","Multilingual Sites with Hugo",{"path":1797,"title":1798},"\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":1800,"title":1801},"\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":1803,"title":1804},"\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":1806,"title":1807},"\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":1809,"title":1810},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fdeploying-jekyll-with-github-actions","Deploying Jekyll with GitHub Actions",{"path":1812,"title":1813},"\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":1815,"title":1816},"\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":1818,"title":1819},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem","Jekyll Plugin Ecosystem",{"path":1821,"title":1822},"\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":1824,"title":1825},"\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":1827,"title":1828},"\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":1830,"title":1831},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fspeeding-up-slow-jekyll-builds","Speeding Up Slow Jekyll Builds",{"path":1833,"title":1834},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fupgrading-jekyll-and-ruby-versions-safely","Upgrading Jekyll and Ruby Versions Safely",{"path":1836,"title":1837},"\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":1839,"title":1840},"\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":1842,"title":1843},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators","Migrating Between Static Site Generators",{"path":1845,"title":1846},"\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":1848,"title":1849},"\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":1851,"title":1852},"\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":1854,"title":1855},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-docusaurus-to-starlight","Migrating from Docusaurus to Starlight",{"path":1857,"title":1858},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-gatsby-to-astro","Migrating from Gatsby to Astro",{"path":1860,"title":1861},"\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":1863,"title":1864},"\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":1866,"title":1867},"\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":1869,"title":1870},"\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":1872,"title":1873},"\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":1875,"title":1876},"\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":1878,"title":1879},"\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":1881,"title":1882},"\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":1884,"title":1885},"\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":1887,"title":1888},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites","Next.js Static Export for Content Sites",{"path":1890,"title":1891},"\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":1893,"title":1894},"\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":1896,"title":1897},"\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":1899,"title":1900},"\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":1902,"title":1903},"\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":1905,"title":1906},"\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":1908,"title":1909},"\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":1911,"title":1912},"\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":1914,"title":1915},"\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":1917,"title":1918},"\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":1920,"title":1921},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fcustomizing-the-pagefind-ui","Customizing the Pagefind UI",{"path":1923,"title":1924},"\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":1926,"title":1927},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites","Search for Static Sites",{"path":1929,"title":1930},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Findexing-hugo-sites-with-pagefind","Indexing Hugo Sites with Pagefind",{"path":1932,"title":1933},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fmultilingual-search-on-static-sites","Multilingual Search on Static Sites",{"path":1935,"title":1936},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-algolia-docsearch","Pagefind vs Algolia DocSearch",{"path":1938,"title":1939},"\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":1941,"title":1942},"\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":1944,"title":1945},"\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":1947,"title":1948},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Ftracking-zero-result-searches","Tracking Zero-Result Searches",{"path":1950,"title":1951},"\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":1953,"title":1954},"\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":1956,"title":34},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fchoosing-an-ssg-for-api-reference-documentation",{"path":1958,"title":1959},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fevaluating-ssg-accessibility-defaults","Evaluating SSG Accessibility Defaults",{"path":1961,"title":1962},"\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":1964,"title":1965},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix","SSG Framework Selection Matrix",{"path":1967,"title":1968},"\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":1970,"title":1971},"\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":1973,"title":1974},"\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":1976,"title":1977},"\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":1979,"title":1980},"\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":1982,"title":1983},"\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":1985,"title":1986},"\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":1988,"title":1989},"\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":1991,"title":1992},"\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":1994,"title":1995},"\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":1997,"title":1998},"\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":2000,"title":2001},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites","Technical SEO for Static Sites",{"path":2003,"title":2004},"\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":2006,"title":2007},"\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":2009,"title":2010},"\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":2012,"title":2013},"\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":2015,"title":2016},"\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":2018,"title":2019},"\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":2021,"title":2022},"\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":2024,"title":2025},"\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":2027,"title":2028},"\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":2030,"title":2031},"\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":2033,"title":2034},"\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":2036,"title":2037},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs","CDN Caching Rules for SSGs",{"path":2039,"title":2040},"\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":2042,"title":2043},"\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":2045,"title":2046},"\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":2048,"title":2049},"\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":2051,"title":2052},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Ftiered-caching-and-origin-shield","Tiered Caching and Origin Shield",{"path":2054,"title":2055},"\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":2057,"title":2058},"\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":2060,"title":2061},"\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":2063,"title":2064},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization","CSS and JavaScript Asset Optimization",{"path":2066,"title":2067},"\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":2069,"title":2070},"\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":2072,"title":2073},"\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":2075,"title":2076},"\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":2078,"title":2079},"\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":2081,"title":2082},"\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":2084,"title":2085},"\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":2087,"title":2088},"\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":2090,"title":2091},"\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":2093,"title":2094},"\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":2096,"title":2097},"\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":2099,"title":2100},"\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":2102,"title":2103},"\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":2105,"title":2106},"\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":2108,"title":2109},"\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":2111,"title":2112},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites","Cumulative Layout Shift Fixes for Static Sites",{"path":2114,"title":2115},"\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":2117,"title":2118},"\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":2120,"title":2121},"\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":2123,"title":2124},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fauditing-font-payload-per-page","Auditing Font Payload per Page",{"path":2126,"title":2127},"\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":2129,"title":2130},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Ffont-display-optional-vs-swap","font-display: optional vs swap",{"path":2132,"title":2133},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites","Font Loading Strategies for Static Sites",{"path":2135,"title":2136},"\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":2138,"title":2139},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fpreloading-fonts-without-double-downloads","Preloading Fonts Without Double Downloads",{"path":2141,"title":2142},"\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":2144,"title":2145},"\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":2147,"title":2148},"\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":2150,"title":2151},"\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":2153,"title":2154},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fvariable-fonts-vs-static-weights","Variable Fonts vs Static Weights",{"path":2156,"title":2157},"\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":2159,"title":2160},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fblur-up-placeholders-with-lqip","Blur-Up Placeholders with LQIP",{"path":2162,"title":2163},"\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":2165,"title":2166},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fcaching-processed-images-between-builds","Caching Processed Images Between Builds",{"path":2168,"title":2169},"\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":2171,"title":2172},"\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":2174,"title":2175},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro","Image Optimization Pipelines in Astro",{"path":2177,"title":2178},"\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":2180,"title":2181},"\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":2183,"title":2184},"\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":2186,"title":2187},"\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":2189,"title":2190},"\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":2192,"title":2193},"\u002Fperformance-optimization-core-web-vitals-for-ssgs","Core Web Vitals Optimization for SSGs",{"path":2195,"title":2196},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fastro-islands-vs-full-hydration-performance","Astro Islands vs Full Hydration Performance",{"path":2198,"title":2199},"\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":2201,"title":1107},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fdeferring-hydration-with-client-visible-in-astro",{"path":2203,"title":2204},"\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":2206,"title":2207},"\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":2209,"title":2210},"\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":2212,"title":2213},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering","JavaScript Hydration & Partial Rendering",{"path":2215,"title":2216},"\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":2218,"title":2219},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fpreact-vs-react-islands-bundle-size","Preact vs React Islands Bundle Size",{"path":2221,"title":2222},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Freplacing-react-islands-with-web-components","Replacing React Islands with Web Components",{"path":2224,"title":2225},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fserver-islands-in-astro","Server Islands in Astro",{"path":2227,"title":2228},"\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":2230,"title":2231},"\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":2233,"title":2234},"\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":2236,"title":2237},"\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":2239,"title":2240},"\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":2242,"title":2243},"\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":2245,"title":2246},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites","Largest Contentful Paint Optimization for Static Sites",{"path":2248,"title":2249},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Fmeasuring-lcp-subparts-with-devtools","Measuring LCP Subparts with DevTools",{"path":2251,"title":2252},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Foptimizing-lcp-on-astro-with-priority-hints","Optimizing LCP on Astro with Priority Hints",{"path":2254,"title":2255},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Freducing-lcp-from-hero-images-on-static-sites","Reducing LCP from Hero Images on Static Sites",{"path":2257,"title":2258},"\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":2260,"title":2261},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci","Performance Budgets and Lighthouse CI",{"path":2263,"title":2264},"\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":2266,"title":2267},"\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":2269,"title":2270},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fper-template-performance-budgets","Per-Template Performance Budgets",{"path":2272,"title":2273},"\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":2275,"title":2276},"\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":2278,"title":2279},"\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":2281,"title":2282},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fsetting-up-lighthouse-ci-for-a-static-site","Setting Up Lighthouse CI for a Static Site",{"path":2284,"title":2285},"\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":2287,"title":2288},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Ftracking-page-weight-over-time","Tracking Page Weight Over Time",{"path":2290,"title":2291},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fwriting-a-performance-budget-that-fails-builds","Writing a Performance Budget That Fails Builds",{"path":2293,"title":2294},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads","Auditing Unused Preloads",{"path":2296,"title":2297},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fearly-hints-103-on-cloudflare","Early Hints (103) on Cloudflare",{"path":2299,"title":2300},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Ffetchpriority-beyond-the-hero-image","Fetchpriority Beyond the Hero Image",{"path":2302,"title":2303},"\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":2305,"title":2306},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed","Resource Hints and Navigation Speed",{"path":2308,"title":2309},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Finstant-navigation-with-speculation-rules","Instant Navigation with Speculation Rules",{"path":2311,"title":2312},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fpreconnect-vs-dns-prefetch-on-static-sites","Preconnect vs DNS-Prefetch on Static Sites",{"path":2314,"title":2315},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fprefetching-links-in-astro","Prefetching Links in Astro",{"path":2317,"title":2318},"\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":2320,"title":2321},"\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":2323,"title":2324},"\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":2326,"title":2327},"\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":2329,"title":2330},"\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":2332,"title":2333},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites","Third-Party Script Performance on Static Sites",{"path":2335,"title":2336},"\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":2338,"title":2339},"\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":2341,"title":2342},"\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":2344,"title":2345},"\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":2347,"title":2348},"\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":2350,"title":2351},"\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":2353,"title":2354},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fautomating-eleventy-deployments-with-cloudflare-pages","Automating Eleventy Deployments on Cloudflare Pages",{"path":2356,"title":2357},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fbranch-deploy-controls-on-cloudflare-pages","Branch Deploy Controls on Cloudflare Pages",{"path":2359,"title":2360},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fcloudflare-pages-functions-middleware","Cloudflare Pages Functions Middleware",{"path":2362,"title":2363},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fconfiguring-redirects-on-cloudflare-pages","Configuring Redirects on Cloudflare Pages",{"path":2365,"title":2366},"\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":2368,"title":2369},"\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":2371,"title":2372},"\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":2374,"title":2375},"\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":2377,"title":2378},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Ffixing-redirect-loops-on-cloudflare-pages","Fixing Redirect Loops on Cloudflare Pages",{"path":2380,"title":2381},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup","Cloudflare Pages Edge Caching Setup",{"path":2383,"title":2384},"\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":2386,"title":2387},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fchecking-links-in-pull-requests","Checking Links in Pull Requests",{"path":2389,"title":2390},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fcontent-linting-with-markdownlint","Content Linting with markdownlint",{"path":2392,"title":2393},"\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":2395,"title":2396},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Feditorial-checks-with-vale-in-ci","Editorial Checks with Vale in CI",{"path":2398,"title":2399},"\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":2401,"title":2402},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams","Content Workflows for Documentation Teams",{"path":2404,"title":2405},"\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":2407,"title":2408},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Frelease-notes-and-changelogs-from-git","Release Notes and Changelogs from Git",{"path":2410,"title":2411},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fscheduled-content-publishing-with-github-actions","Scheduled Content Publishing With GitHub Actions",{"path":2413,"title":2414},"\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":2416,"title":2417},"\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":2419,"title":2420},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fbuilding-astro-sites-with-github-actions","Building Astro Sites with GitHub Actions",{"path":2422,"title":2423},"\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":2425,"title":2426},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fconcurrency-groups-to-cancel-stale-builds","Concurrency Groups to Cancel Stale Builds",{"path":2428,"title":2429},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fdeploying-to-github-pages-with-actions","Deploying to GitHub Pages with Actions",{"path":2431,"title":2432},"\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":2434,"title":2435},"\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":2437,"title":2438},"\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":2440,"title":2441},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds","GitHub Actions for Automated SSG Builds",{"path":2443,"title":2444},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fmatrix-builds-for-multi-site-monorepos","Matrix Builds for Multi-Site Monorepos",{"path":2446,"title":2447},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fpinning-actions-by-commit-sha","Pinning Actions by Commit SHA",{"path":2449,"title":2450},"\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":2452,"title":2453},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Freusable-workflows-for-ssg-builds","Reusable Workflows for SSG Builds",{"path":2455,"title":2456},"\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":2458,"title":2459},"\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":2461,"title":2462},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fdeploying-only-changed-files","Deploying Only Changed Files",{"path":2464,"title":2465},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fenabling-incremental-builds-in-eleventy","Enabling Incremental Builds in Eleventy",{"path":2467,"title":2468},"\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":2470,"title":2471},"\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":2473,"title":2474},"\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":2476,"title":2477},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs","Incremental Builds and Build Caching for SSGs",{"path":2479,"title":2480},"\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":2482,"title":2483},"\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":2485,"title":2486},"\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":2488,"title":2489},"\u002Fproduction-ready-deployment-cicd-workflows","Production-Ready Deployment & CI\u002FCD for SSGs",{"path":2491,"title":2492},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Falerting-on-cache-hit-ratio-drops","Alerting on Cache Hit Ratio Drops",{"path":2494,"title":2495},"\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":2497,"title":2498},"\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":2500,"title":2501},"\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":2503,"title":2504},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production","Monitoring Static Sites in Production",{"path":2506,"title":2507},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Flogging-404s-at-the-edge","Logging 404s at the Edge",{"path":2509,"title":2510},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fmonitoring-tls-certificate-expiry","Monitoring TLS Certificate Expiry",{"path":2512,"title":2513},"\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":2515,"title":2516},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fsynthetic-monitoring-with-scheduled-playwright-checks","Synthetic Monitoring With Scheduled Playwright Checks",{"path":2518,"title":2519},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Ftracking-deploy-markers-in-analytics","Tracking Deploy Markers in Analytics",{"path":2521,"title":2522},"\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":2524,"title":2525},"\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":2527,"title":2528},"\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":2530,"title":2531},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fconfiguring-vercel-for-hugo-and-eleventy","Configuring Vercel for Hugo and Eleventy",{"path":2533,"title":2534},"\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":2536,"title":2537},"\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":2539,"title":2540},"\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":2542,"title":2543},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies","Netlify vs Vercel Deployment Strategies",{"path":2545,"title":2546},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-build-hooks-for-content-updates","Netlify Build Hooks for Content Updates",{"path":2548,"title":2549},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-edge-functions-for-static-sites","Netlify Edge Functions for Static Sites",{"path":2551,"title":2552},"\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":2554,"title":2555},"\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":2557,"title":2558},"\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":2560,"title":2561},"\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":2563,"title":2564},"\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":2566,"title":2567},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fcleaning-up-stale-preview-deployments","Cleaning Up Stale Preview Deployments",{"path":2569,"title":2570},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fcommenting-on-preview-deploys","Commenting on Preview Deploys",{"path":2572,"title":2573},"\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":2575,"title":2576},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests","Preview Environments for Pull Requests",{"path":2578,"title":2579},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpassword-protecting-preview-deployments","Password-Protecting Preview Deployments",{"path":2581,"title":2582},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpreview-deploys-for-monorepos","Preview Deploys for Monorepos",{"path":2584,"title":2585},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpreviewing-headless-cms-drafts","Previewing Headless CMS Drafts",{"path":2587,"title":2588},"\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":2590,"title":2591},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fvisual-regression-testing-on-preview-deploys","Visual Regression Testing on Preview Deploys",{"path":2593,"title":2594},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fatomic-deploys-vs-incremental-uploads","Atomic Deploys vs Incremental Uploads",{"path":2596,"title":2597},"\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":2599,"title":2600},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fcanary-releases-for-static-sites","Canary Releases for Static Sites",{"path":2602,"title":2603},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Ffeature-flags-on-static-sites","Feature Flags on Static Sites",{"path":2605,"title":2606},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites","Rollbacks and Deploy Safety for Static Sites",{"path":2608,"title":2609},"\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":2611,"title":2612},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fpost-deploy-verification-checklists","Post-Deploy Verification Checklists",{"path":2614,"title":2615},"\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":2617,"title":2618},"\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":2620,"title":2621},"\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":2623,"title":2624},"\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":2626,"title":2627},"\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":2629,"title":2630},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fauditing-npm-dependencies-in-ssg-pipelines","Auditing npm Dependencies in SSG Pipelines",{"path":2632,"title":2633},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fenabling-hsts-and-preload-safely","Enabling HSTS and Preload Safely",{"path":2635,"title":2636},"\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":2638,"title":2639},"\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":2641,"title":2642},"\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":2644,"title":2645},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites","Security Headers and Hardening for Static Sites",{"path":2647,"title":2648},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fpermissions-policy-and-cross-origin-headers","Permissions-Policy and Cross-Origin Headers",{"path":2650,"title":2651},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecuring-deploy-credentials-with-github-oidc","Securing Deploy Credentials with GitHub OIDC",{"path":2653,"title":2654},"\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":2656,"title":2657},"\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":2659,"title":2660},"\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":2662,"title":2663},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsubresource-integrity-for-third-party-assets","Subresource Integrity for Third-Party Assets",{"path":2665,"title":2666},"\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":2668,"title":2669},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fbrotli-and-gzip-precompression-served-by-nginx","Brotli and Gzip Precompression Served by Nginx",{"path":2671,"title":2672},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fclean-urls-and-trailing-slashes-on-s3","Clean URLs and Trailing Slashes on S3",{"path":2674,"title":2675},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fcloudfront-functions-for-redirects","CloudFront Functions for Redirects",{"path":2677,"title":2678},"\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":2680,"title":2681},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fhosting-on-azure-static-web-apps","Hosting on Azure Static Web Apps",{"path":2683,"title":2684},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites","Self-Hosting Static Sites on S3, Nginx and Caddy",{"path":2686,"title":2687},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fnginx-vs-caddy-for-serving-static-sites","Nginx vs Caddy for Serving Static Sites",{"path":2689,"title":2690},"\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":2692,"title":2693},"\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":2695,"title":2696},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-caddy","Serving a Static Site with Caddy",{"path":2698,"title":2699},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-nginx","Serving a Static Site with Nginx",{"path":2701,"title":2702},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fstatic-hosting-on-google-cloud-storage","Static Hosting on Google Cloud Storage",{"path":2704,"title":2705},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fzero-downtime-deploys-with-symlink-swaps","Zero-Downtime Deploys with Symlink Swaps",{"path":2707,"title":2708},"\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":2710,"title":2711},"\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":2713,"title":2714},"\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":2716,"title":2717},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites","Serverless Functions for Static Sites",{"path":2719,"title":2720},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fnetlify-functions-vs-cloudflare-workers","Netlify Functions vs Cloudflare Workers",{"path":2722,"title":2723},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fnewsletter-signup-with-an-edge-function","Newsletter Signup with an Edge Function",{"path":2725,"title":2726},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fprotecting-a-static-site-behind-authentication","Protecting a Static Site Behind Authentication",{"path":2728,"title":2729},"\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":2731,"title":2732},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Frate-limiting-edge-functions","Rate Limiting Edge Functions",{"path":2734,"title":2735},"\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":2737,"title":2738},"\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":2740,"title":2741},"\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":2743,"title":2744},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci","Testing Static Sites in CI",{"path":2746,"title":2747},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Fsnapshot-testing-build-output","Snapshot Testing Build Output",{"path":2749,"title":2750},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ftesting-redirects-and-headers-before-deploy","Testing Redirects and Headers Before Deploy",{"path":2752,"title":2753},"\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":2755,"title":1567},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ftesting-structured-data-and-meta-tags",{"path":2757,"title":2758},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Fvalidating-html-output-in-ci","Validating HTML Output in CI",{"kind":2760,"tools":2764},{"label":2761,"plural":2762,"u":2763},"How-to","How-tos","\u002Fguides\u002Fhow-to\u002F",[2765],{"label":2766,"u":2767},"Starlight","\u002Ftools\u002Fstarlight\u002F",1790943194314]