[{"data":1,"prerenderedAt":1393},["ShallowReactive",2],{"page:\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Ftotal-cost-of-ownership-for-static-site-generators":3,"all-docs-nav":855},{"id":4,"title":5,"body":6,"breadcrumb":830,"dateModified":840,"datePublished":840,"description":841,"extension":842,"faq":843,"meta":848,"navigation":849,"path":850,"seo":851,"slug":12,"stem":852,"type":853,"__hash__":854},"content\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Ftotal-cost-of-ownership-for-static-site-generators\u002Findex.md","Total Cost of Ownership for Static Site Generators",{"type":7,"value":8,"toc":808},"minimark",[9,13,17,26,31,44,48,51,91,208,212,215,435,438,536,540,548,556,560,576,655,659,667,671,679,683,691,695,727,731,734,738,743,746,750,753,757,760,764,767,771],[10,11,5],"h1",{"id":12},"total-cost-of-ownership-for-static-site-generators",[14,15,16],"p",{},"Framework comparisons usually weigh features and benchmarks. Budgets are decided by something else: how many hours the site costs every month for years after launch. A generator that builds in half the time but needs an engineer for every content change, or one that is free to host but breaks its theme on every major release, can cost several times more than the \"slower\" alternative. Hosting — the line item people ask about first — is almost never the deciding number.",[14,18,19,20,25],{},"This guide builds a three-year total-cost-of-ownership model for five realistic choices, using time logs from real sites where available and clearly labelled estimates elsewhere. It extends the ",[21,22,24],"a",{"href":23},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002F","SSG Framework Selection Matrix"," with the cost axis teams most often skip.",[27,28,30],"h2",{"id":29},"prerequisites","Prerequisites",[32,33,34,38,41],"ul",{},[35,36,37],"li",{},"A realistic picture of the site: page count, growth rate, how often it changes and who changes it.",[35,39,40],{},"Your team's loaded hourly cost (salary plus overhead); the model below uses 90 USD\u002Fhour as a placeholder.",[35,42,43],{},"Time logs or honest estimates from the last site you ran — they beat any published benchmark.",[27,45,47],{"id":46},"the-cost-components","The Cost Components",[14,49,50],{},"Over three years, a static site's cost falls into six buckets:",[52,53,54,61,67,73,79,85],"ol",{},[35,55,56,60],{},[57,58,59],"strong",{},"Initial build"," — scaffolding, templates, design, content migration.",[35,62,63,66],{},[57,64,65],{},"Content operations"," — hours per month spent on the mechanics of publishing, beyond writing itself: fixing build errors, asking an engineer for help, waiting on previews.",[35,68,69,72],{},[57,70,71],{},"Upgrades"," — generator, dependencies and runtime, including breakage from customisations.",[35,74,75,78],{},[57,76,77],{},"Feature work"," — search, forms, i18n, versioning: whatever the site needs beyond pages.",[35,80,81,84],{},[57,82,83],{},"Build and CI minutes"," — usually small, but real at scale.",[35,86,87,90],{},[57,88,89],{},"Hosting and services"," — CDN, functions, search, forms, monitoring.",[92,93,94,204],"figure",{},[95,96,103,104,103,108,103,112,103,119],"svg",{"viewBox":97,"role":98,"ariaLabelledBy":99,"xmlns":102},"0 0 760 290","img",[100,101],"tco-share-title","tco-share-desc","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","\n  ",[105,106,107],"title",{"id":100},"Where three-year cost goes for a typical docs site",[109,110,111],"desc",{"id":101},"A stacked bar of three-year cost for a 1,500-page documentation site. Content operations 38 percent, upgrades 21 percent, initial build 18 percent, feature work 17 percent, hosting and services 4 percent, and CI minutes 2 percent.",[113,114],"rect",{"x":115,"y":115,"width":116,"height":117,"fill":118},"0","760","290","#ffffff",[120,121,123,124,123,132,123,142,123,148,123,155,123,159,123,165,123,169,123,174,123,178,123,184,123,190,123,196,123,200,103],"g",{"style":122},"font-family:system-ui, sans-serif;font-size:12px","\n    ",[125,126,131],"text",{"x":127,"y":128,"fill":129,"style":130},"380","28","#1f2937","font-size:16px;font-weight:700;text-anchor:middle","Three-year cost by bucket, 1,500-page docs site",[113,133],{"x":134,"y":135,"width":136,"height":137,"fill":138,"opacity":139,"stroke":140,"style":141},"30","80","266","50","#ff595e","0.28","#d83b41","stroke-width:1px",[125,143,147],{"x":144,"y":145,"fill":129,"style":146},"163","110","text-anchor:middle","content operations 38%",[113,149],{"x":150,"y":135,"width":151,"height":137,"fill":152,"opacity":153,"stroke":154,"style":141},"296","147","#ffca3a","0.38","#a97b00",[125,156,158],{"x":157,"y":145,"fill":129,"style":146},"369","upgrades 21%",[113,160],{"x":161,"y":135,"width":162,"height":137,"fill":163,"opacity":164,"stroke":163,"style":141},"443","126","#1982c4","0.25",[125,166,168],{"x":167,"y":145,"fill":129,"style":146},"506","initial 18%",[113,170],{"x":171,"y":135,"width":172,"height":137,"fill":173,"opacity":164,"stroke":173,"style":141},"569","119","#6a4c93",[125,175,177],{"x":176,"y":145,"fill":129,"style":146},"628","features 17%",[113,179],{"x":180,"y":135,"width":128,"height":137,"fill":181,"opacity":182,"stroke":183,"style":141},"688","#8ac926","0.4","#5a8a16",[113,185],{"x":186,"y":135,"width":187,"height":137,"fill":188,"stroke":189,"style":141},"716","14","#f8fafc","#556071",[125,191,195],{"x":192,"y":193,"fill":189,"style":194},"702","152","font-size:11px;text-anchor:middle","hosting 4% · CI 2%",[125,197,199],{"x":127,"y":198,"fill":129,"style":146},"200","People-time buckets: 94% · infrastructure buckets: 6%",[125,201,203],{"x":127,"y":202,"fill":189,"style":194},"252","Time logs from one team's docs site over three years, valued at 90 USD\u002Fhour",[205,206,207],"figcaption",{},"Hosting is the smallest bucket; the ongoing cost of publishing and upgrading is the largest.",[27,209,211],{"id":210},"the-model","The Model",[14,213,214],{},"Five choices for a 1,500-page documentation-plus-blog site growing 30% a year, edited mostly by six writers with one part-time engineer. Hours are estimates grounded in time logs from comparable sites; adjust every number to your team.",[216,217,218,243],"table",{},[219,220,221],"thead",{},[222,223,224,228,231,234,237,240],"tr",{},[225,226,227],"th",{},"Bucket (3 years, hours unless noted)",[225,229,230],{},"Hugo",[225,232,233],{},"Eleventy",[225,235,236],{},"Astro",[225,238,239],{},"Starlight",[225,241,242],{},"Next.js export",[244,245,246,267,286,304,321,337,369,387,403],"tbody",{},[222,247,248,252,255,258,261,264],{},[249,250,251],"td",{},"Initial build (templates, migration)",[249,253,254],{},"160",[249,256,257],{},"150",[249,259,260],{},"140",[249,262,263],{},"70",[249,265,266],{},"180",[222,268,269,272,275,278,280,283],{},[249,270,271],{},"Content ops: engineer help per month × 36",[249,273,274],{},"6 → 216",[249,276,277],{},"5 → 180",[249,279,277],{},[249,281,282],{},"2 → 72",[249,284,285],{},"8 → 288",[222,287,288,291,294,296,299,301],{},[249,289,290],{},"Content ops: writer friction per month × 36",[249,292,293],{},"10 → 360",[249,295,285],{},[249,297,298],{},"12 → 432",[249,300,277],{},[249,302,303],{},"14 → 504",[222,305,306,308,311,314,316,319],{},[249,307,71],{},[249,309,310],{},"40",[249,312,313],{},"60",[249,315,145],{},[249,317,318],{},"90",[249,320,257],{},[222,322,323,326,328,330,332,335],{},[249,324,325],{},"Feature work (search, forms, i18n)",[249,327,318],{},[249,329,318],{},[249,331,263],{},[249,333,334],{},"20",[249,336,318],{},[222,338,339,344,349,354,359,364],{},[249,340,341],{},[57,342,343],{},"People hours total",[249,345,346],{},[57,347,348],{},"866",[249,350,351],{},[57,352,353],{},"768",[249,355,356],{},[57,357,358],{},"932",[249,360,361],{},[57,362,363],{},"432",[249,365,366],{},[57,367,368],{},"1,212",[222,370,371,374,376,379,382,384],{},[249,372,373],{},"CI minutes (USD)",[249,375,313],{},[249,377,378],{},"120",[249,380,381],{},"260",[249,383,266],{},[249,385,386],{},"420",[222,388,389,392,395,397,399,401],{},[249,390,391],{},"Hosting and services (USD)",[249,393,394],{},"0–400",[249,396,394],{},[249,398,394],{},[249,400,394],{},[249,402,394],{},[222,404,405,410,415,420,425,430],{},[249,406,407],{},[57,408,409],{},"Approximate total (USD at 90\u002Fh)",[249,411,412],{},[57,413,414],{},"~78,000",[249,416,417],{},[57,418,419],{},"~69,000",[249,421,422],{},[57,423,424],{},"~84,000",[249,426,427],{},[57,428,429],{},"~39,000",[249,431,432],{},[57,433,434],{},"~109,000",[14,436,437],{},"The spread is almost entirely people time. Starlight wins here because it arrives with search, navigation and i18n configured (low feature work), its authoring is forgiving for writers (low friction) and it needs less initial template work. Next.js export is the most expensive because pure content does not benefit from its application features while writers and engineers pay for its complexity.",[92,439,440,533],{},[95,441,103,445,103,448,103,451,103,453],{"viewBox":97,"role":98,"ariaLabelledBy":442,"xmlns":102},[443,444],"tco-tot-title","tco-tot-desc",[105,446,447],{"id":443},"Three-year cost by generator",[109,449,450],{"id":444},"Bars of estimated three-year cost for the model docs site: Starlight about 39,000 US dollars, Eleventy about 69,000, Hugo about 78,000, Astro about 84,000 and Next.js static export about 109,000. Infrastructure is under one percent of each bar.",[113,452],{"x":115,"y":115,"width":116,"height":117,"fill":118},[120,454,123,455,123,458,123,465,123,469,123,475,123,481,123,484,123,488,123,493,123,496,123,500,123,505,123,508,123,512,123,517,123,520,123,524,123,529,103],{"style":122},[125,456,457],{"x":127,"y":128,"fill":129,"style":130},"Estimated three-year cost (thousand USD)",[459,460],"line",{"x1":198,"y1":461,"x2":198,"y2":462,"stroke":463,"style":464},"46","246","#d9e2ef","stroke-width:1.5px",[125,466,239],{"x":310,"y":467,"fill":129,"style":468},"74","font-weight:700",[113,470],{"x":198,"y":471,"width":472,"height":473,"rx":474,"fill":181,"opacity":182,"stroke":183,"style":141},"58","176","24","4",[125,476,480],{"x":477,"y":478,"fill":479,"style":468},"384","75","#3f6410","39",[125,482,233],{"x":310,"y":483,"fill":129,"style":468},"114",[113,485],{"x":198,"y":486,"width":487,"height":473,"rx":474,"fill":163,"opacity":164,"stroke":163,"style":141},"98","310",[125,489,492],{"x":490,"y":491,"fill":129,"style":468},"518","115","69",[125,494,230],{"x":310,"y":495,"fill":129,"style":468},"154",[113,497],{"x":198,"y":498,"width":499,"height":473,"rx":474,"fill":163,"opacity":164,"stroke":163,"style":141},"138","351",[125,501,504],{"x":502,"y":503,"fill":129,"style":468},"559","155","78",[125,506,236],{"x":310,"y":507,"fill":129,"style":468},"194",[113,509],{"x":198,"y":510,"width":511,"height":473,"rx":474,"fill":152,"opacity":153,"stroke":154,"style":141},"178","378",[125,513,516],{"x":514,"y":515,"fill":129,"style":468},"586","195","84",[125,518,242],{"x":310,"y":519,"fill":129,"style":468},"234",[113,521],{"x":198,"y":522,"width":523,"height":473,"rx":474,"fill":138,"opacity":139,"stroke":140,"style":141},"218","490",[125,525,528],{"x":526,"y":527,"fill":129,"style":468},"698","235","109",[125,530,532],{"x":127,"y":531,"fill":189,"style":194},"272","Model docs site, six writers, one part-time engineer; hours at 90 USD",[205,534,535],{},"A different team — engineers writing, no versioning, a design-heavy marketing site — would reorder these bars completely; the model matters more than this result.",[27,537,539],{"id":538},"why-friction-dominates","Why Friction Dominates",[14,541,542,543,547],{},"The single largest line is writer friction: hours per month lost to build errors, waiting on previews, asking how to add a tab or an image, and fixing broken links. It is also the line teams never measure. Two numbers make it visible within a month: failed builds per 100 content changes (from CI), and the number of \"how do I…\" messages in the docs channel. On the site that informed the model, moving from MDX-everywhere to plain Markdown with a small component vocabulary cut failed builds per 100 edits from 4.1 to 0.9 — covered in ",[21,544,546],{"href":545},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmdx-vs-markdoc-for-docs-content\u002F","MDX vs Markdoc for Docs Content"," — which alone was worth about five hours a month.",[14,549,550,551,555],{},"Build time enters here too, as a people cost. A 40-second preview versus a 4-minute preview is not a CI bill; it is six writers waiting, or context-switching, dozens of times a week. ",[21,552,554],{"href":553},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fastro-vs-eleventy-build-times-at-10000-pages\u002F","Astro vs Eleventy Build Times at 10,000 Pages"," quantifies how that scales.",[27,557,559],{"id":558},"upgrade-cost-is-predictable","Upgrade Cost Is Predictable",[14,561,562,563,566,567,570,571,575],{},"Upgrade cost looks unpredictable but follows two observable factors. ",[57,564,565],{},"Release cadence of breaking changes",": count majors (and, for pre-1.0 projects, breaking minors) in the last 24 months. ",[57,568,569],{},"Depth of customisation",": ejected or copied theme components, custom plugins against internal APIs, patched dependencies. Multiplying the first by the second, calibrated against your last upgrade's hours, predicted actual upgrade effort within about 30% across four sites. Keeping customisation shallow — the approach in ",[21,572,574],{"href":573},"\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"," — is the most effective way to cut this bucket.",[92,577,578,652],{},[95,579,103,584,103,587,103,590,103,593],{"viewBox":580,"role":98,"ariaLabelledBy":581,"xmlns":102},"0 0 760 250",[582,583],"tco-up-title","tco-up-desc",[105,585,586],{"id":582},"Upgrade hours by customisation depth",[109,588,589],{"id":583},"Four points of annual upgrade hours against customisation depth for sites on the same generator. Configuration only: 6 hours a year. Component overrides: 14 hours. A few ejected components: 38 hours. A forked theme: 96 hours.",[113,591],{"x":115,"y":115,"width":116,"height":592,"fill":118},"250",[120,594,123,595,123,598,123,601,123,606,123,611,123,614,123,617,123,622,123,626,123,631,123,636,123,639,123,642,123,645,123,648,103],{"style":122},[125,596,597],{"x":127,"y":128,"fill":129,"style":130},"Annual upgrade hours vs customisation depth",[459,599],{"x1":263,"y1":198,"x2":600,"y2":198,"stroke":189,"style":464},"720",[113,602],{"x":145,"y":603,"width":604,"height":605,"fill":181,"opacity":182,"stroke":183,"style":141},"190","100","10",[125,607,610],{"x":254,"y":608,"fill":129,"style":609},"182","font-weight:700;text-anchor:middle","6",[113,612],{"x":381,"y":472,"width":604,"height":473,"fill":181,"opacity":613,"stroke":183,"style":141},"0.3",[125,615,187],{"x":487,"y":616,"fill":129,"style":609},"168",[113,618],{"x":619,"y":620,"width":604,"height":621,"fill":152,"opacity":153,"stroke":154,"style":141},"410","134","66",[125,623,625],{"x":624,"y":162,"fill":129,"style":609},"460","38",[113,627],{"x":628,"y":629,"width":604,"height":630,"fill":138,"opacity":139,"stroke":140,"style":141},"560","36","164",[125,632,635],{"x":633,"y":634,"fill":129,"style":609},"610","54","96",[125,637,638],{"x":254,"y":522,"fill":189,"style":194},"config only",[125,640,641],{"x":487,"y":522,"fill":189,"style":194},"overrides",[125,643,644],{"x":624,"y":522,"fill":189,"style":194},"some ejected",[125,646,647],{"x":633,"y":522,"fill":189,"style":194},"forked theme",[125,649,651],{"x":127,"y":650,"fill":189,"style":194},"242","Time logs from four sites on the same generator over two years",[205,653,654],{},"Customisation depth multiplied upgrade cost sixteenfold across otherwise similar sites.",[27,656,658],{"id":657},"the-exit-cost","The Exit Cost",[14,660,661,662,666],{},"A three-year model should include the cost of leaving, because most sites change generator eventually. Exit cost depends on how portable the content is: plain Markdown with standard front matter moves between generators in days, as the migrations in ",[21,663,665],{"href":664},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002F","Migrating Between Static Site Generators"," show, while content full of framework-specific components, MDX imports and generator-specific shortcodes can take weeks. A simple proxy is the share of content files that contain anything other than Markdown and front matter; on the model site it was 9% for Hugo and Eleventy, 14% for Starlight and 38% for the Next.js MDX setup. Multiply by a per-file conversion estimate and add it to the table as a contingent cost. It rarely changes the ranking, but it often changes how teams write content from day one.",[27,668,670],{"id":669},"hosting-and-services-for-completeness","Hosting and Services, For Completeness",[14,672,673,674,678],{},"For the model site's traffic (about 1.2 million page views a month), static hosting on Cloudflare Pages, Netlify or GitHub Pages costs nothing, and paid tiers cost 20–50 USD a month where team features are needed. Self-hosting on S3 and CloudFront cost about 42 USD a month — see ",[21,675,677],{"href":676},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fdeploying-a-static-site-to-s3-and-cloudfront\u002F","Deploying a Static Site to S3 and CloudFront",". Hosted search is the one service that can become material: a commercial Algolia plan at this traffic would have been the largest infrastructure line; Pagefind costs nothing to run.",[27,680,682],{"id":681},"using-the-model","Using the Model",[14,684,685,686,690],{},"Treat the table as a template, not an answer. Fill it with your own team's numbers — hourly cost, who edits, how often, what features you need — and run it for the two or three generators that pass your hard requirements. The exercise is valuable even when the totals are close, because it forces agreement on who will maintain the site and how. Record the assumptions next to the decision; in a year, comparing actual hours with estimates is the best input to the next decision, and to the selection process in ",[21,687,689],{"href":688},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fssg-selection-checklist-for-engineering-teams\u002F","SSG Selection Checklist for Engineering Teams",".",[27,692,694],{"id":693},"pitfalls-rollback","Pitfalls & Rollback",[32,696,697,703,709,715,721],{},[35,698,699,702],{},[57,700,701],{},"Optimising the hosting bill."," It is usually under 5% of total cost. Optimise people time first.",[35,704,705,708],{},[57,706,707],{},"Ignoring writer friction."," It is the largest recurring cost and the least measured.",[35,710,711,714],{},[57,712,713],{},"Assuming zero upgrade cost."," Every generator has breaking changes; customisation depth multiplies them.",[35,716,717,720],{},[57,718,719],{},"Copying someone else's model."," A team of engineers writing their own docs has a completely different cost profile.",[35,722,723,726],{},[57,724,725],{},"Rollback:"," a TCO model is an input to a decision, not a commitment; revisit it at each major upgrade with real numbers.",[27,728,730],{"id":729},"conclusion","Conclusion",[14,732,733],{},"Over three years, the cost of a static site is overwhelmingly people: content operations, upgrades and feature work, with hosting and CI a rounding error. For a writer-maintained 1,500-page docs site, a docs framework with good defaults came out at roughly half the cost of general-purpose generators, and a Next.js export at nearly three times — but a different team would reorder that list. Measure friction, predict upgrade cost from cadence and customisation depth, and choose the generator that minimises the hours your team will actually spend.",[27,735,737],{"id":736},"faq","FAQ",[739,740,742],"h3",{"id":741},"what-dominates-the-cost-of-running-a-static-site","What dominates the cost of running a static site?",[14,744,745],{},"People. Engineering and writer time for setup, customisation, upgrades and support outweighs hosting and CI minutes by one to two orders of magnitude for almost every static site. Hosting is usually free or a few dollars a month.",[739,747,749],{"id":748},"which-generator-is-cheapest-to-own","Which generator is cheapest to own?",[14,751,752],{},"It depends on team skills more than on the tool. In our model, a Starlight docs site maintained by writers was cheapest for documentation, and Hugo was cheapest for a large, stable content site maintained by one engineer. Next.js static export was the most expensive for pure content.",[739,754,756],{"id":755},"how-do-i-estimate-upgrade-cost","How do I estimate upgrade cost?",[14,758,759],{},"Look at the generator's release history for the last two years, count breaking releases, and multiply by the hours your team spent on the last comparable upgrade. Customisations such as ejected theme components multiply that cost.",[739,761,763],{"id":762},"should-ci-build-minutes-influence-the-choice","Should CI build minutes influence the choice?",[14,765,766],{},"Only at large scale or on paid plans. For most sites, build time matters for how long people wait on previews, which is a people cost, not a CI cost.",[27,768,770],{"id":769},"related","Related",[32,772,773,782,787,794,801],{},[35,774,775,778,779,781],{},[57,776,777],{},"Parent:"," ",[21,780,24],{"href":23}," — the other selection axes.",[35,783,784,786],{},[21,785,689],{"href":688}," — running a pilot to get real numbers.",[35,788,789,793],{},[21,790,792],{"href":791},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fbest-ssg-for-technical-writers-without-coding-experience\u002F","Best SSG for Technical Writers Without Coding Experience"," — reducing the friction line.",[35,795,796,800],{},[21,797,799],{"href":798},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002F","Docs Frameworks: Docusaurus, Starlight and VitePress"," — where the low-cost option came from.",[35,802,803,807],{},[21,804,806],{"href":805},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fevaluating-ssg-accessibility-defaults\u002F","Evaluating SSG Accessibility Defaults"," — another cost that shows up later.",{"title":809,"searchDepth":810,"depth":810,"links":811},"",2,[812,813,814,815,816,817,818,819,820,821,822,829],{"id":29,"depth":810,"text":30},{"id":46,"depth":810,"text":47},{"id":210,"depth":810,"text":211},{"id":538,"depth":810,"text":539},{"id":558,"depth":810,"text":559},{"id":657,"depth":810,"text":658},{"id":669,"depth":810,"text":670},{"id":681,"depth":810,"text":682},{"id":693,"depth":810,"text":694},{"id":729,"depth":810,"text":730},{"id":736,"depth":810,"text":737,"children":823},[824,826,827,828],{"id":741,"depth":825,"text":742},3,{"id":748,"depth":825,"text":749},{"id":755,"depth":825,"text":756},{"id":762,"depth":825,"text":763},{"id":769,"depth":810,"text":770},[831,834,837,838],{"name":832,"item":833},"Home","\u002F",{"name":835,"item":836},"Choosing the Right Static Site Generator for Production","\u002Fchoosing-the-right-static-site-generator-for-production\u002F",{"name":24,"item":23},{"name":5,"item":839},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Ftotal-cost-of-ownership-for-static-site-generators\u002F","2026-09-18","Estimate the three-year cost of running a static site on Hugo, Eleventy, Astro, Next.js export or a docs framework: people time, builds, hosting, upgrades.","md",[844,845,846,847],{"q":742,"a":745},{"q":749,"a":752},{"q":756,"a":759},{"q":763,"a":766},{},true,"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Ftotal-cost-of-ownership-for-static-site-generators",{"title":5,"description":841},"choosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Ftotal-cost-of-ownership-for-static-site-generators\u002Findex","article","GKW4ls0VYXj3zNIbrhTUEBtJeGzfVwVhOwRqE1xl-XQ",[856,858,861,864,867,870,873,875,878,880,882,885,888,891,894,897,900,903,906,909,911,914,917,920,923,926,929,932,934,937,940,943,946,949,952,955,958,961,964,967,970,973,976,979,982,985,988,991,994,997,999,1001,1004,1006,1007,1010,1013,1016,1019,1022,1025,1028,1031,1034,1037,1040,1043,1046,1049,1052,1055,1058,1061,1064,1067,1070,1073,1076,1079,1082,1085,1088,1091,1094,1097,1100,1103,1106,1109,1112,1115,1118,1121,1124,1127,1130,1133,1136,1139,1142,1145,1148,1151,1154,1157,1160,1163,1166,1169,1172,1175,1178,1181,1184,1187,1190,1193,1196,1199,1202,1205,1208,1211,1214,1217,1220,1223,1226,1229,1232,1235,1238,1241,1244,1247,1250,1253,1256,1259,1262,1265,1268,1271,1274,1277,1280,1283,1286,1289,1292,1295,1298,1301,1304,1307,1310,1313,1316,1319,1322,1325,1328,1331,1334,1337,1340,1343,1346,1349,1352,1355,1358,1361,1363,1366,1369,1372,1375,1378,1381,1384,1387,1390],{"path":857,"title":554},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fastro-vs-eleventy-build-times-at-10000-pages",{"path":859,"title":860},"\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":862,"title":863},"\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":865,"title":866},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites","Astro vs Eleventy for Documentation Sites",{"path":868,"title":869},"\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":871,"title":872},"\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":874,"title":574},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fcustomizing-starlight-without-forking-the-theme",{"path":876,"title":877},"\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":879,"title":799},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress",{"path":881,"title":546},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmdx-vs-markdoc-for-docs-content",{"path":883,"title":884},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmigrating-from-mkdocs-to-starlight","Migrating from MkDocs to Starlight",{"path":886,"title":887},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fversioned-documentation-with-docusaurus","Versioned Documentation with Docusaurus",{"path":889,"title":890},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fvitepress-for-library-documentation","VitePress for Library Documentation",{"path":892,"title":893},"\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":895,"title":896},"\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":898,"title":899},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories","Hugo Build Times for Large Repositories",{"path":901,"title":902},"\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":904,"title":905},"\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":907,"title":908},"\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":910,"title":835},"\u002Fchoosing-the-right-static-site-generator-for-production",{"path":912,"title":913},"\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":915,"title":916},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem","Jekyll Plugin Ecosystem",{"path":918,"title":919},"\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":921,"title":922},"\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":924,"title":925},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fspeeding-up-slow-jekyll-builds","Speeding Up Slow Jekyll Builds",{"path":927,"title":928},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fupgrading-jekyll-and-ruby-versions-safely","Upgrading Jekyll and Ruby Versions Safely",{"path":930,"title":931},"\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":933,"title":665},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators",{"path":935,"title":936},"\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":938,"title":939},"\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":941,"title":942},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-gatsby-to-astro","Migrating from Gatsby to Astro",{"path":944,"title":945},"\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":947,"title":948},"\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":950,"title":951},"\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":953,"title":954},"\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":956,"title":957},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites","Next.js Static Export for Content Sites",{"path":959,"title":960},"\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":962,"title":963},"\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":965,"title":966},"\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":968,"title":969},"\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":971,"title":972},"\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":974,"title":975},"\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":977,"title":978},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites","Search for Static Sites",{"path":980,"title":981},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Findexing-hugo-sites-with-pagefind","Indexing Hugo Sites with Pagefind",{"path":983,"title":984},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fmultilingual-search-on-static-sites","Multilingual Search on Static Sites",{"path":986,"title":987},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-algolia-docsearch","Pagefind vs Algolia DocSearch",{"path":989,"title":990},"\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":992,"title":993},"\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":995,"title":996},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fchoosing-an-ssg-for-api-reference-documentation","Choosing an SSG for API Reference Documentation",{"path":998,"title":806},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fevaluating-ssg-accessibility-defaults",{"path":1000,"title":24},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix",{"path":1002,"title":1003},"\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":1005,"title":689},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fssg-selection-checklist-for-engineering-teams",{"path":850,"title":5},{"path":1008,"title":1009},"\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":1011,"title":1012},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs","CDN Caching Rules for SSGs",{"path":1014,"title":1015},"\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":1017,"title":1018},"\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":1020,"title":1021},"\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":1023,"title":1024},"\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":1026,"title":1027},"\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":1029,"title":1030},"\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":1032,"title":1033},"\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":1035,"title":1036},"\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":1038,"title":1039},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites","Cumulative Layout Shift Fixes for Static Sites",{"path":1041,"title":1042},"\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":1044,"title":1045},"\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":1047,"title":1048},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Ffont-display-optional-vs-swap","font-display: optional vs swap",{"path":1050,"title":1051},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites","Font Loading Strategies for Static Sites",{"path":1053,"title":1054},"\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":1056,"title":1057},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fpreloading-fonts-without-double-downloads","Preloading Fonts Without Double Downloads",{"path":1059,"title":1060},"\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":1062,"title":1063},"\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":1065,"title":1066},"\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":1068,"title":1069},"\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":1071,"title":1072},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro","Image Optimization Pipelines in Astro",{"path":1074,"title":1075},"\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":1077,"title":1078},"\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":1080,"title":1081},"\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":1083,"title":1084},"\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":1086,"title":1087},"\u002Fperformance-optimization-core-web-vitals-for-ssgs","Core Web Vitals Optimization for SSGs",{"path":1089,"title":1090},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fastro-islands-vs-full-hydration-performance","Astro Islands vs Full Hydration Performance",{"path":1092,"title":1093},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fdeferring-hydration-with-client-visible-in-astro","Deferring Hydration with client:visible in Astro",{"path":1095,"title":1096},"\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":1098,"title":1099},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering","JavaScript Hydration & Partial Rendering",{"path":1101,"title":1102},"\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":1104,"title":1105},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Freplacing-react-islands-with-web-components","Replacing React Islands with Web Components",{"path":1107,"title":1108},"\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":1110,"title":1111},"\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":1113,"title":1114},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites","Largest Contentful Paint Optimization for Static Sites",{"path":1116,"title":1117},"\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":1119,"title":1120},"\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":1122,"title":1123},"\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":1125,"title":1126},"\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":1128,"title":1129},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci","Performance Budgets and Lighthouse CI",{"path":1131,"title":1132},"\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":1134,"title":1135},"\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":1137,"title":1138},"\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":1140,"title":1141},"\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":1143,"title":1144},"\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":1146,"title":1147},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads","Auditing Unused Preloads",{"path":1149,"title":1150},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed","Resource Hints and Navigation Speed",{"path":1152,"title":1153},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Finstant-navigation-with-speculation-rules","Instant Navigation with Speculation Rules",{"path":1155,"title":1156},"\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":1158,"title":1159},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fprefetching-links-in-astro","Prefetching Links in Astro",{"path":1161,"title":1162},"\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":1164,"title":1165},"\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":1167,"title":1168},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites","Third-Party Script Performance on Static Sites",{"path":1170,"title":1171},"\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":1173,"title":1174},"\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":1176,"title":1177},"\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":1179,"title":1180},"\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":1182,"title":1183},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fautomating-eleventy-deployments-with-cloudflare-pages","Automating Eleventy Deployments on Cloudflare Pages",{"path":1185,"title":1186},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fconfiguring-redirects-on-cloudflare-pages","Configuring Redirects on Cloudflare Pages",{"path":1188,"title":1189},"\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":1191,"title":1192},"\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":1194,"title":1195},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup","Cloudflare Pages Edge Caching Setup",{"path":1197,"title":1198},"\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":1200,"title":1201},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fchecking-links-in-pull-requests","Checking Links in Pull Requests",{"path":1203,"title":1204},"\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":1206,"title":1207},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Feditorial-checks-with-vale-in-ci","Editorial Checks with Vale in CI",{"path":1209,"title":1210},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams","Content Workflows for Documentation Teams",{"path":1212,"title":1213},"\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":1215,"title":1216},"\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":1218,"title":1219},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fbuilding-astro-sites-with-github-actions","Building Astro Sites with GitHub Actions",{"path":1221,"title":1222},"\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":1224,"title":1225},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fdeploying-to-github-pages-with-actions","Deploying to GitHub Pages with Actions",{"path":1227,"title":1228},"\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":1230,"title":1231},"\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":1233,"title":1234},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds","GitHub Actions for Automated SSG Builds",{"path":1236,"title":1237},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fmatrix-builds-for-multi-site-monorepos","Matrix Builds for Multi-Site Monorepos",{"path":1239,"title":1240},"\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":1242,"title":1243},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fenabling-incremental-builds-in-eleventy","Enabling Incremental Builds in Eleventy",{"path":1245,"title":1246},"\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":1248,"title":1249},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs","Incremental Builds and Build Caching for SSGs",{"path":1251,"title":1252},"\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":1254,"title":1255},"\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":1257,"title":1258},"\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":1260,"title":1261},"\u002Fproduction-ready-deployment-cicd-workflows","Production-Ready Deployment & CI\u002FCD for SSGs",{"path":1263,"title":1264},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Falerting-on-cache-hit-ratio-drops","Alerting on Cache Hit Ratio Drops",{"path":1266,"title":1267},"\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":1269,"title":1270},"\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":1272,"title":1273},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production","Monitoring Static Sites in Production",{"path":1275,"title":1276},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Flogging-404s-at-the-edge","Logging 404s at the Edge",{"path":1278,"title":1279},"\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":1281,"title":1282},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fconfiguring-vercel-for-hugo-and-eleventy","Configuring Vercel for Hugo and Eleventy",{"path":1284,"title":1285},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies","Netlify vs Vercel Deployment Strategies",{"path":1287,"title":1288},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-build-hooks-for-content-updates","Netlify Build Hooks for Content Updates",{"path":1290,"title":1291},"\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":1293,"title":1294},"\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":1296,"title":1297},"\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":1299,"title":1300},"\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":1302,"title":1303},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fcleaning-up-stale-preview-deployments","Cleaning Up Stale Preview Deployments",{"path":1305,"title":1306},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests","Preview Environments for Pull Requests",{"path":1308,"title":1309},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpassword-protecting-preview-deployments","Password-Protecting Preview Deployments",{"path":1311,"title":1312},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpreviewing-headless-cms-drafts","Previewing Headless CMS Drafts",{"path":1314,"title":1315},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fvisual-regression-testing-on-preview-deploys","Visual Regression Testing on Preview Deploys",{"path":1317,"title":1318},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fatomic-deploys-vs-incremental-uploads","Atomic Deploys vs Incremental Uploads",{"path":1320,"title":1321},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fcanary-releases-for-static-sites","Canary Releases for Static Sites",{"path":1323,"title":1324},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Ffeature-flags-on-static-sites","Feature Flags on Static Sites",{"path":1326,"title":1327},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites","Rollbacks and Deploy Safety for Static Sites",{"path":1329,"title":1330},"\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":1332,"title":1333},"\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":1335,"title":1336},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fauditing-npm-dependencies-in-ssg-pipelines","Auditing npm Dependencies in SSG Pipelines",{"path":1338,"title":1339},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fenabling-hsts-and-preload-safely","Enabling HSTS and Preload Safely",{"path":1341,"title":1342},"\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":1344,"title":1345},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites","Security Headers and Hardening for Static Sites",{"path":1347,"title":1348},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecuring-deploy-credentials-with-github-oidc","Securing Deploy Credentials with GitHub OIDC",{"path":1350,"title":1351},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsubresource-integrity-for-third-party-assets","Subresource Integrity for Third-Party Assets",{"path":1353,"title":1354},"\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":1356,"title":1357},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fclean-urls-and-trailing-slashes-on-s3","Clean URLs and Trailing Slashes on S3",{"path":1359,"title":1360},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fcloudfront-functions-for-redirects","CloudFront Functions for Redirects",{"path":1362,"title":677},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fdeploying-a-static-site-to-s3-and-cloudfront",{"path":1364,"title":1365},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites","Self-Hosting Static Sites on S3, Nginx and Caddy",{"path":1367,"title":1368},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-caddy","Serving a Static Site with Caddy",{"path":1370,"title":1371},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-nginx","Serving a Static Site with Nginx",{"path":1373,"title":1374},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fzero-downtime-deploys-with-symlink-swaps","Zero-Downtime Deploys with Symlink Swaps",{"path":1376,"title":1377},"\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":1379,"title":1380},"\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":1382,"title":1383},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites","Serverless Functions for Static Sites",{"path":1385,"title":1386},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fnetlify-functions-vs-cloudflare-workers","Netlify Functions vs Cloudflare Workers",{"path":1388,"title":1389},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fprotecting-a-static-site-behind-authentication","Protecting a Static Site Behind Authentication",{"path":1391,"title":1392},"\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",1789722847877]