[{"data":1,"prerenderedAt":1578},["ShallowReactive",2],{"page:\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-algolia-docsearch":3,"all-docs-nav":1037},{"id":4,"title":5,"body":6,"breadcrumb":1012,"dateModified":1022,"datePublished":1022,"description":1023,"extension":1024,"faq":1025,"meta":1030,"navigation":1031,"path":1032,"seo":1033,"slug":12,"stem":1034,"type":1035,"__hash__":1036},"content\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-algolia-docsearch\u002Findex.md","Pagefind vs Algolia DocSearch",{"type":7,"value":8,"toc":994},"minimark",[9,13,31,40,45,65,69,103,219,228,410,414,417,493,504,508,511,568,648,651,655,658,670,674,743,746,825,829,832,856,863,866,870,909,913,916,920,925,928,932,935,939,942,946,949,953,990],[10,11,5],"h1",{"id":12},"pagefind-vs-algolia-docsearch",[14,15,16,17,21,22,26,27,30],"p",{},"For documentation sites the search decision usually narrows to two options. ",[18,19,20],"strong",{},"Algolia DocSearch"," is the long-standing default: a hosted index, a polished ",[23,24,25],"code",{},"Ctrl+K"," modal, typo tolerance and analytics, free for qualifying open-source docs. ",[18,28,29],{},"Pagefind"," is the build-time challenger: an index generated from your HTML, shipped as static files, queried in the reader's browser, and free for everyone. Both are excellent. They fail differently, cost differently and suit different teams.",[14,32,33,34,39],{},"This comparison runs both on the same 2,000-page documentation site for four weeks — half of readers served each, randomly assigned by a cookie — and measures relevance, latency, freshness and cost. The background on build-time versus hosted search is in ",[35,36,38],"a",{"href":37},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002F","Search for Static Sites",".",[41,42,44],"h2",{"id":43},"prerequisites","Prerequisites",[46,47,48,52,55,62],"ul",{},[49,50,51],"li",{},"A documentation site with stable URLs and heading anchors.",[49,53,54],{},"For DocSearch: acceptance into the DocSearch programme, or an Algolia account with a crawler configured.",[49,56,57,58,39],{},"For Pagefind: a post-build step as described in ",[35,59,61],{"href":60},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fadding-pagefind-to-an-astro-site\u002F","Adding Pagefind to an Astro Site",[49,63,64],{},"A first-party analytics endpoint if you want comparable click data for both.",[41,66,68],{"id":67},"how-each-is-set-up","How Each Is Set Up",[14,70,71,74,75,78,79,82,83,86,87,90,91,94,95,98,99,102],{},[18,72,73],{},"DocSearch"," has two halves. A crawler, configured with CSS selectors for your page hierarchy (",[23,76,77],{},"lvl0"," for the section, ",[23,80,81],{},"lvl1"," for the ",[23,84,85],{},"\u003Ch1>",", ",[23,88,89],{},"lvl2","–",[23,92,93],{},"lvl6"," for subheadings, ",[23,96,97],{},"content"," for paragraphs), visits the site on a schedule and writes one record per heading section into an Algolia index. The front end loads ",[23,100,101],{},"@docsearch\u002Fjs",", binds the modal to a button and sends each keystroke to Algolia's API.",[104,105,110],"pre",{"className":106,"code":107,"language":108,"meta":109,"style":109},"language-js shiki shiki-themes github-light github-dark","\u002F\u002F DocSearch front end\nimport docsearch from '@docsearch\u002Fjs';\ndocsearch({\n  container: '#docsearch',\n  appId: 'YOUR_APP_ID',\n  apiKey: 'YOUR_SEARCH_ONLY_KEY',   \u002F\u002F search-only key, safe to expose\n  indexName: 'example_docs',\n  searchParameters: { facetFilters: ['version:3.2'] },\n});\n","js","",[23,111,112,121,142,152,164,175,190,201,213],{"__ignoreMap":109},[113,114,117],"span",{"class":115,"line":116},"line",1,[113,118,120],{"class":119},"sJ8bj","\u002F\u002F DocSearch front end\n",[113,122,124,128,132,135,139],{"class":115,"line":123},2,[113,125,127],{"class":126},"szBVR","import",[113,129,131],{"class":130},"sVt8B"," docsearch ",[113,133,134],{"class":126},"from",[113,136,138],{"class":137},"sZZnC"," '@docsearch\u002Fjs'",[113,140,141],{"class":130},";\n",[113,143,145,149],{"class":115,"line":144},3,[113,146,148],{"class":147},"sScJk","docsearch",[113,150,151],{"class":130},"({\n",[113,153,155,158,161],{"class":115,"line":154},4,[113,156,157],{"class":130},"  container: ",[113,159,160],{"class":137},"'#docsearch'",[113,162,163],{"class":130},",\n",[113,165,167,170,173],{"class":115,"line":166},5,[113,168,169],{"class":130},"  appId: ",[113,171,172],{"class":137},"'YOUR_APP_ID'",[113,174,163],{"class":130},[113,176,178,181,184,187],{"class":115,"line":177},6,[113,179,180],{"class":130},"  apiKey: ",[113,182,183],{"class":137},"'YOUR_SEARCH_ONLY_KEY'",[113,185,186],{"class":130},",   ",[113,188,189],{"class":119},"\u002F\u002F search-only key, safe to expose\n",[113,191,193,196,199],{"class":115,"line":192},7,[113,194,195],{"class":130},"  indexName: ",[113,197,198],{"class":137},"'example_docs'",[113,200,163],{"class":130},[113,202,204,207,210],{"class":115,"line":203},8,[113,205,206],{"class":130},"  searchParameters: { facetFilters: [",[113,208,209],{"class":137},"'version:3.2'",[113,211,212],{"class":130},"] },\n",[113,214,216],{"class":115,"line":215},9,[113,217,218],{"class":130},"});\n",[14,220,221,223,224,227],{},[18,222,29],{}," has one half: ",[23,225,226],{},"pagefind --site dist"," after the build, then a UI loaded on demand. Its \"records\" are pages with sub-results per heading, and ranking uses the weights you add in markup.",[229,230,231,406],"figure",{},[232,233,240,241,240,245,240,249,240,256,240,392],"svg",{"viewBox":234,"role":235,"ariaLabelledBy":236,"xmlns":239},"0 0 760 290","img",[237,238],"pvd-flow-title","pvd-flow-desc","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","\n  ",[242,243,244],"title",{"id":237},"Update paths for each search setup",[246,247,248],"desc",{"id":238},"For Pagefind, a merged pull request triggers the build, which renders pages and the index together, and one deploy publishes both, so search is fresh the moment the site is. For DocSearch, the deploy publishes pages first; the crawler visits later on its schedule and updates the Algolia index, leaving a window where search and site disagree.",[250,251],"rect",{"x":252,"y":252,"width":253,"height":254,"fill":255},"0","760","290","#ffffff",[257,258,260,261,260,269,260,274,260,284,260,290,260,296,260,300,260,306,260,310,260,315,260,318,260,321,260,324,260,326,260,330,260,336,260,340,260,345,260,349,260,358,260,364,260,387,240],"g",{"style":259},"font-family:system-ui, sans-serif;font-size:12px","\n    ",[262,263,268],"text",{"x":264,"y":265,"fill":266,"style":267},"380","28","#1f2937","font-size:16px;font-weight:700;text-anchor:middle","When does a new page become findable?",[262,270,29],{"x":271,"y":272,"fill":266,"style":273},"30","80","font-weight:700",[250,275],{"x":276,"y":277,"width":278,"height":279,"rx":280,"fill":281,"stroke":282,"style":283},"130","60","120","36","8","#f8fafc","#d9e2ef","stroke-width:1.5px",[262,285,289],{"x":286,"y":287,"fill":266,"style":288},"190","83","text-anchor:middle","merge",[250,291],{"x":292,"y":277,"width":293,"height":279,"rx":280,"fill":294,"opacity":295,"stroke":294,"style":283},"280","170","#6a4c93","0.14",[262,297,299],{"x":298,"y":287,"fill":266,"style":288},"365","build: pages + index",[250,301],{"x":302,"y":277,"width":278,"height":279,"rx":280,"fill":303,"opacity":304,"stroke":305,"style":283},"480","#8ac926","0.18","#5a8a16",[262,307,309],{"x":308,"y":287,"fill":266,"style":288},"540","deploy",[262,311,314],{"x":312,"y":287,"fill":313,"style":273},"620","#3f6410","findable now",[262,316,73],{"x":271,"y":317,"fill":266,"style":273},"180",[250,319],{"x":276,"y":320,"width":278,"height":279,"rx":280,"fill":281,"stroke":282,"style":283},"160",[262,322,289],{"x":286,"y":323,"fill":266,"style":288},"183",[250,325],{"x":292,"y":320,"width":278,"height":279,"rx":280,"fill":294,"opacity":295,"stroke":294,"style":283},[262,327,329],{"x":328,"y":323,"fill":266,"style":288},"340","build + deploy",[250,331],{"x":332,"y":320,"width":276,"height":279,"rx":280,"fill":333,"opacity":334,"stroke":335,"style":283},"430","#ffca3a","0.26","#a97b00",[262,337,339],{"x":338,"y":323,"fill":266,"style":288},"495","crawler (daily)",[250,341],{"x":342,"y":320,"width":343,"height":279,"rx":280,"fill":344,"opacity":295,"stroke":344,"style":283},"590","140","#1982c4",[262,346,348],{"x":347,"y":323,"fill":266,"style":288},"660","Algolia index",[250,350],{"x":351,"y":352,"width":286,"height":353,"rx":354,"fill":355,"opacity":295,"stroke":356,"style":357},"400","214","26","6","#ff595e","#d83b41","stroke-width:1px",[262,359,363],{"x":338,"y":360,"fill":361,"style":362},"232","#b32b30","font-size:11px;font-weight:700;text-anchor:middle","0–24 h stale window",[257,365,369,370,369,375,369,378,369,381,369,384,260],{"stroke":366,"fill":367,"style":368},"#556071","none","stroke-width:2px","\n      ",[371,372],"path",{"d":373,"style":374},"M252 78 L276 78","marker-end:url(#pvd-arrow)",[371,376],{"d":377,"style":374},"M452 78 L476 78",[371,379],{"d":380,"style":374},"M252 178 L276 178",[371,382],{"d":383,"style":374},"M402 178 L426 178",[371,385],{"d":386,"style":374},"M562 178 L586 178",[262,388,391],{"x":264,"y":389,"fill":366,"style":390},"274","font-size:11px;text-anchor:middle","Pushing records from CI after deploy removes the window, at the cost of a write key in the pipeline",[393,394,260,395,240],"defs",{},[396,397,369,403,260],"marker",{"id":398,"viewBox":399,"refX":280,"refY":400,"markerWidth":401,"markerHeight":401,"orient":402},"pvd-arrow","0 0 10 10","5","7","auto-start-reverse",[371,404],{"d":405,"fill":366},"M0 0 L10 5 L0 10 z",[407,408,409],"figcaption",{},"Freshness is structural: Pagefind cannot be stale relative to the pages it shipped with; a crawler-fed index always can.",[41,411,413],{"id":412},"relevance","Relevance",[14,415,416],{},"A 60-query test set from the site's previous analytics was run against both indexes, and the four-week split test recorded which result position readers clicked.",[418,419,420,435],"table",{},[421,422,423],"thead",{},[424,425,426,430,432],"tr",{},[427,428,429],"th",{},"Measure",[427,431,20],{},[427,433,434],{},"Pagefind (weighted headings)",[436,437,438,450,461,471,482],"tbody",{},[424,439,440,444,447],{},[441,442,443],"td",{},"Right page first (60 queries)",[441,445,446],{},"49",[441,448,449],{},"47",[424,451,452,455,458],{},[441,453,454],{},"Right page in top 3",[441,456,457],{},"57",[441,459,460],{},"56",[424,462,463,466,469],{},[441,464,465],{},"Misspelled queries answered (12 in set)",[441,467,468],{},"10",[441,470,400],{},[424,472,473,476,479],{},[441,474,475],{},"Clicks on first result (field)",[441,477,478],{},"72%",[441,480,481],{},"69%",[424,483,484,487,490],{},[441,485,486],{},"Searches followed by a second search",[441,488,489],{},"18%",[441,491,492],{},"21%",[14,494,495,496,499,500,503],{},"The gap concentrates in misspellings. DocSearch's typo tolerance matched \"deplyoment\" and \"cahce\" correctly; Pagefind returned nothing for both. For correctly spelled queries the two ranked almost identically. Pagefind's gap can be narrowed with a small synonym step: for the ten most common misspellings in your logs, add the misspelled term invisibly to the target page with ",[23,497,498],{},"\u003Cspan data-pagefind-index-attrs hidden>"," or via ",[23,501,502],{},"data-pagefind-meta"," keywords — crude, but it closed three of the seven misses.",[41,505,507],{"id":506},"latency-and-page-cost","Latency and Page Cost",[14,509,510],{},"Latency was measured with the Chrome DevTools performance panel on a Moto G Power profile over simulated fast 4G, from keypress to rendered results.",[418,512,513,523],{},[421,514,515],{},[424,516,517,519,521],{},[427,518,429],{},[427,520,20],{},[427,522,29],{},[436,524,525,536,547,558],{},[424,526,527,530,533],{},[441,528,529],{},"First query, cold (library + data)",[441,531,532],{},"610 ms",[441,534,535],{},"420 ms",[424,537,538,541,544],{},[441,539,540],{},"Subsequent keystrokes",[441,542,543],{},"60–110 ms (network)",[441,545,546],{},"8–40 ms (local)",[424,548,549,552,555],{},[441,550,551],{},"JS loaded on open (gzip)",[441,553,554],{},"36 KB",[441,556,557],{},"31 KB + 72 KB WebAssembly",[424,559,560,563,566],{},[441,561,562],{},"JS loaded on pages where search is not opened",[441,564,565],{},"0 KB (lazy)",[441,567,565],{},[229,569,570,645],{},[232,571,240,576,240,579,240,582,240,585],{"viewBox":572,"role":235,"ariaLabelledBy":573,"xmlns":239},"0 0 760 270",[574,575],"pvd-lat-title","pvd-lat-desc",[242,577,578],{"id":574},"Keystroke-to-results latency over a typed query",[246,580,581],{"id":575},"A line chart across eight keystrokes. Algolia starts at 610 milliseconds for the first keystroke and then stays between 60 and 110 milliseconds per keystroke. Pagefind starts at 420 milliseconds and then falls to between 8 and 40 milliseconds per keystroke.",[250,583],{"x":252,"y":252,"width":253,"height":584,"fill":255},"270",[257,586,260,587,260,590,260,594,260,597,260,600,260,605,260,609,260,613,260,618,260,621,260,628,260,632,260,637,260,641,240],{"style":259},[262,588,589],{"x":264,"y":265,"fill":266,"style":267},"Milliseconds from keypress to results, typing \"deploy h\"",[115,591],{"x1":272,"y1":592,"x2":593,"y2":592,"stroke":366,"style":283},"220","720",[115,595],{"x1":272,"y1":596,"x2":272,"y2":592,"stroke":366,"style":283},"50",[115,598],{"x1":272,"y1":599,"x2":593,"y2":599,"stroke":282,"style":357},"135",[262,601,252],{"x":602,"y":603,"fill":366,"style":604},"72","224","font-size:11px;text-anchor:end",[262,606,608],{"x":602,"y":607,"fill":366,"style":604},"139","350",[262,610,612],{"x":602,"y":611,"fill":366,"style":604},"54","700",[614,615],"polyline",{"points":616,"fill":367,"stroke":344,"style":617},"110,72 190,196 270,202 350,193 430,200 510,197 590,201 670,195","stroke-width:2.5px",[614,619],{"points":620,"fill":367,"stroke":294,"style":617},"110,118 190,210 270,216 350,214 430,217 510,218 590,216 670,217",[262,622,627],{"x":623,"y":624,"fill":625,"style":626},"122","68","#166a9e","font-size:11px;font-weight:700","Algolia 610 ms cold",[262,629,631],{"x":623,"y":630,"fill":294,"style":626},"114","Pagefind 420 ms cold",[262,633,636],{"x":634,"y":635,"fill":625,"style":626},"560","186","60–110 ms",[262,638,640],{"x":634,"y":639,"fill":294,"style":626},"238","8–40 ms",[262,642,644],{"x":351,"y":643,"fill":366,"style":390},"258","keystrokes 1 to 8 · Moto G Power profile · fast 4G · median of 5 sessions",[407,646,647],{},"Once warm, local search answers faster than any network round-trip can; the hosted service's advantage is on the first query, not the rest.",[14,649,650],{},"Readers far from Algolia's data centres saw the biggest difference: a test from Johannesburg measured 180–240 ms per keystroke against Algolia's nearest region, while Pagefind stayed local after the first query.",[41,652,654],{"id":653},"analytics-privacy-and-control","Analytics, Privacy and Control",[14,656,657],{},"DocSearch's strongest non-technical advantage is analytics: top queries, queries with no results, click position, all in a dashboard non-engineers can use. Pagefind has none by default, because queries never leave the browser. That is also its strongest privacy argument: no third party receives reader queries, which simplifies privacy notices and removes a processor from your data-protection inventory.",[14,659,660,661,664,665,669],{},"The pragmatic middle ground is a first-party beacon. Send ",[23,662,663],{},"{ q, resultCount, clickedRank }"," to an endpoint you control — a Worker writing to an analytics store is enough, as in ",[35,666,668],{"href":667},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fproxying-third-party-apis-from-an-edge-function\u002F","Proxying Third-Party APIs from an Edge Function"," — and you get the three metrics that matter without a vendor. On this site the beacon took 25 lines and produced a zero-result report that led to nine new pages in the following month.",[41,671,673],{"id":672},"cost-over-a-year","Cost Over a Year",[418,675,676,691],{},[421,677,678],{},[424,679,680,683,686,689],{},[427,681,682],{},"Cost line",[427,684,685],{},"Algolia DocSearch (programme)",[427,687,688],{},"Algolia (paid, same traffic)",[427,690,29],{},[436,692,693,705,717,730],{},[424,694,695,698,700,703],{},[441,696,697],{},"Service fee",[441,699,252],{},[441,701,702],{},"usage-based; ~310,000 searches\u002Fmonth here",[441,704,252],{},[424,706,707,710,712,714],{},[441,708,709],{},"Build time added",[441,711,252],{},[441,713,252],{},[441,715,716],{},"~7 s per build",[424,718,719,722,725,728],{},[441,720,721],{},"Engineering setup",[441,723,724],{},"~1 day (crawler config)",[441,726,727],{},"~1 day",[441,729,727],{},[424,731,732,735,738,740],{},[441,733,734],{},"Ongoing maintenance",[441,736,737],{},"crawler config drift",[441,739,737],{},[441,741,742],{},"markup weights",[14,744,745],{},"For a site eligible for the DocSearch programme, cost is not a differentiator. For a commercial product's docs, a paid plan at this traffic is a recurring line item that Pagefind replaces with seven seconds of build time.",[229,747,748,822],{},[232,749,240,754,240,757,240,760,240,762],{"viewBox":750,"role":235,"ariaLabelledBy":751,"xmlns":239},"0 0 760 280",[752,753],"pvd-pick-title","pvd-pick-desc",[242,755,756],{"id":752},"Which one fits which team",[246,758,759],{"id":753},"A two-column comparison of strengths. DocSearch fits teams that want typo tolerance, analytics dashboards, cross-site search and are eligible for the free programme. Pagefind fits teams that want zero running cost, guaranteed freshness, no third-party data sharing and fast repeat queries.",[250,761],{"x":252,"y":252,"width":253,"height":292,"fill":255},[257,763,260,764,260,767,260,774,260,779,260,784,260,787,260,791,260,795,260,800,260,803,260,806,260,810,260,813,260,816,260,819,240],{"style":259},[262,765,766],{"x":264,"y":265,"fill":266,"style":267},"Pick by the constraint you cannot give up",[250,768],{"x":769,"y":596,"width":770,"height":771,"rx":772,"fill":344,"opacity":773,"stroke":344,"style":283},"40","330","200","12","0.1",[262,775,20],{"x":776,"y":777,"fill":266,"style":778},"205","78","font-size:14px;font-weight:700;text-anchor:middle",[262,780,783],{"x":781,"y":782,"fill":266},"62","112","typo tolerance out of the box",[262,785,786],{"x":781,"y":343,"fill":266},"analytics dashboard for writers",[262,788,790],{"x":781,"y":789,"fill":266},"168","one index across several sites",[262,792,794],{"x":781,"y":793,"fill":266},"196","free if eligible for the programme",[262,796,799],{"x":781,"y":797,"fill":366,"style":798},"230","font-size:11px","cost: a vendor on every query",[250,801],{"x":802,"y":596,"width":770,"height":771,"rx":772,"fill":294,"opacity":773,"stroke":294,"style":283},"390",[262,804,29],{"x":805,"y":777,"fill":266,"style":778},"555",[262,807,809],{"x":808,"y":782,"fill":266},"412","zero running cost at any traffic",[262,811,812],{"x":808,"y":343,"fill":266},"index always matches the deploy",[262,814,815],{"x":808,"y":789,"fill":266},"queries never leave the browser",[262,817,818],{"x":808,"y":793,"fill":266},"8–40 ms repeat keystrokes",[262,820,821],{"x":808,"y":797,"fill":366,"style":798},"cost: weaker on misspellings",[407,823,824],{},"Neither column is \"better\"; each is a set of guarantees the other cannot make.",[41,826,828],{"id":827},"migrating-between-them","Migrating Between Them",[14,830,831],{},"Switching in either direction is cheaper than teams expect, provided the search component was built as an interface rather than wired directly to one vendor.",[14,833,834,835,838,839,90,841,843,844,847,848,851,852,855],{},"Moving from DocSearch to Pagefind takes three steps. Add the Pagefind post-build step and content boundary, and deploy it alongside DocSearch with the new UI hidden behind a query parameter (",[23,836,837],{},"?search=pagefind",") so the team can compare results on production content. Port the ranking intent: DocSearch's ",[23,840,77],{},[23,842,89],{}," hierarchy maps to Pagefind heading weights and a ",[23,845,846],{},"section"," meta value, and any ",[23,849,850],{},"facetFilters"," for versions become ",[23,853,854],{},"data-pagefind-filter"," attributes. Finally, replace the DocSearch analytics dashboard with a first-party beacon before the switch, not after, so there is a baseline for zero-result rates to compare against. On this site the whole migration took a day and a half.",[14,857,858,859,862],{},"Moving from Pagefind to DocSearch runs the other way: apply to the programme or configure a crawler, map your heading structure to hierarchy selectors, and verify that the crawler sees the same content boundary Pagefind did. The most common surprise is that the crawler indexes pages Pagefind excluded — tag archives, changelog pages, the 404 page — because exclusion lived in Pagefind attributes the crawler ignores. Add equivalent ",[23,860,861],{},"selectors_exclude"," rules and a URL exclusion list.",[14,864,865],{},"In both directions, keep the reader-facing contract stable: the same keyboard shortcut, the same result layout, the same deep links to headings. Readers notice changes in how search behaves far more than changes in which engine answers, and a stable contract is what makes the split test above possible in the first place.",[41,867,869],{"id":868},"pitfalls-rollback","Pitfalls & Rollback",[46,871,872,878,884,890,896],{},[49,873,874,877],{},[18,875,876],{},"Exposing the wrong Algolia key."," Only the search-only key belongs in the browser. An admin key in a front-end bundle allows anyone to rewrite your index.",[49,879,880,883],{},[18,881,882],{},"Crawler selector drift."," A template redesign that renames heading classes silently breaks DocSearch's hierarchy; results lose their section labels. Re-test the crawler config after layout changes.",[49,885,886,889],{},[18,887,888],{},"Pagefind without a content boundary."," Navigation text indexed on every page ruins relevance; see the boundary step in the Astro guide.",[49,891,892,895],{},[18,893,894],{},"Comparing on demo sites."," Both are excellent on fifty pages. Test on your own corpus and your own real queries.",[49,897,898,901,902,86,905,908],{},[18,899,900],{},"Rollback:"," the two are front-end swaps behind one search button. Keep the component interface identical — ",[23,903,904],{},"open()",[23,906,907],{},"close()"," — and switching back is a one-line import change and a redeploy.",[41,910,912],{"id":911},"conclusion","Conclusion",[14,914,915],{},"On a 2,000-page docs site, DocSearch and a tuned Pagefind were within two queries of each other on relevance, with DocSearch ahead on misspellings and analytics and Pagefind ahead on freshness, repeat-query speed, privacy and cost. Teams eligible for the DocSearch programme who value the analytics dashboard should take it. Everyone else should start with Pagefind, add a first-party query beacon, and revisit only if misspelled queries show up as a real problem in the logs.",[41,917,919],{"id":918},"faq","FAQ",[921,922,924],"h3",{"id":923},"is-algolia-docsearch-free","Is Algolia DocSearch free?",[14,926,927],{},"DocSearch is free for publicly available technical documentation and open-source projects that qualify for the programme. Other sites use a paid Algolia plan billed on search requests and records, so the cost depends on traffic.",[921,929,931],{"id":930},"which-gives-better-search-results","Which gives better search results?",[14,933,934],{},"On our 60-query test set, DocSearch ranked the right page first 49 times and a tuned Pagefind setup 47 times. The gap was mostly typo tolerance; for correctly spelled queries the two were nearly identical.",[921,936,938],{"id":937},"can-pagefind-give-me-search-analytics","Can Pagefind give me search analytics?",[14,940,941],{},"Not by itself, because queries never leave the browser. You can send your own beacon with the query and the clicked result to an endpoint you control, which gives the most useful analytics with a few lines of code.",[921,943,945],{"id":944},"how-quickly-do-new-pages-appear-in-search","How quickly do new pages appear in search?",[14,947,948],{},"With Pagefind, immediately on deploy, because the index ships in the same artifact. With DocSearch's crawler, on the next crawl, which is typically daily. Pushing records from CI after each deploy closes that gap for Algolia.",[41,950,952],{"id":951},"related","Related",[46,954,955,964,969,976,983],{},[49,956,957,960,961,963],{},[18,958,959],{},"Parent:"," ",[35,962,38],{"href":37}," — the full landscape of static search.",[49,965,966,968],{},[35,967,61],{"href":60}," — the tuned Pagefind setup used here.",[49,970,971,975],{},[35,972,974],{"href":973},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fmultilingual-search-on-static-sites\u002F","Multilingual Search on Static Sites"," — where hosted search's language handling matters most.",[49,977,978,982],{},[35,979,981],{"href":980},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fdocusaurus-vs-starlight-for-product-documentation\u002F","Docusaurus vs Starlight for Product Documentation"," — a real migration from DocSearch to Pagefind.",[49,984,985,989],{},[35,986,988],{"href":987},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fself-hosting-analytics-to-cut-third-party-requests\u002F","Self-Hosting Analytics to Cut Third-Party Requests"," — the first-party beacon approach.",[991,992,993],"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 .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);}",{"title":109,"searchDepth":123,"depth":123,"links":995},[996,997,998,999,1000,1001,1002,1003,1004,1005,1011],{"id":43,"depth":123,"text":44},{"id":67,"depth":123,"text":68},{"id":412,"depth":123,"text":413},{"id":506,"depth":123,"text":507},{"id":653,"depth":123,"text":654},{"id":672,"depth":123,"text":673},{"id":827,"depth":123,"text":828},{"id":868,"depth":123,"text":869},{"id":911,"depth":123,"text":912},{"id":918,"depth":123,"text":919,"children":1006},[1007,1008,1009,1010],{"id":923,"depth":144,"text":924},{"id":930,"depth":144,"text":931},{"id":937,"depth":144,"text":938},{"id":944,"depth":144,"text":945},{"id":951,"depth":123,"text":952},[1013,1016,1019,1020],{"name":1014,"item":1015},"Home","\u002F",{"name":1017,"item":1018},"Choosing the Right Static Site Generator for Production","\u002Fchoosing-the-right-static-site-generator-for-production\u002F",{"name":38,"item":37},{"name":5,"item":1021},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-algolia-docsearch\u002F","2026-09-18","Build-time Pagefind against hosted Algolia DocSearch on one 2,000-page docs site: relevance, latency, freshness, analytics, privacy and total cost.","md",[1026,1027,1028,1029],{"q":924,"a":927},{"q":931,"a":934},{"q":938,"a":941},{"q":945,"a":948},{},true,"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-algolia-docsearch",{"title":5,"description":1023},"choosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-algolia-docsearch\u002Findex","article","rznjxZNhP99Qyc-oJ2Z_ZPo7xr2skcq2w9oPg1OEk8A",[1038,1041,1044,1047,1050,1053,1056,1059,1061,1064,1067,1070,1073,1076,1079,1082,1085,1088,1091,1094,1096,1099,1102,1105,1108,1111,1114,1117,1120,1123,1126,1129,1132,1135,1138,1141,1144,1147,1150,1153,1156,1158,1161,1163,1166,1168,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,1364,1366,1369,1372,1375,1378,1381,1384,1387,1390,1393,1396,1399,1402,1405,1408,1411,1414,1417,1420,1423,1426,1429,1432,1435,1438,1441,1444,1447,1450,1453,1456,1459,1462,1465,1468,1471,1474,1477,1480,1483,1486,1489,1492,1495,1498,1501,1504,1507,1510,1513,1516,1519,1522,1525,1528,1531,1534,1537,1540,1543,1546,1549,1552,1555,1558,1561,1564,1567,1570,1573,1576],{"path":1039,"title":1040},"\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":1042,"title":1043},"\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":1045,"title":1046},"\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":1048,"title":1049},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites","Astro vs Eleventy for Documentation Sites",{"path":1051,"title":1052},"\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":1054,"title":1055},"\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":1057,"title":1058},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fcustomizing-starlight-without-forking-the-theme","Customizing Starlight Without Forking the Theme",{"path":1060,"title":981},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fdocusaurus-vs-starlight-for-product-documentation",{"path":1062,"title":1063},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress","Docs Frameworks: Docusaurus, Starlight and VitePress",{"path":1065,"title":1066},"\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":1068,"title":1069},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmigrating-from-mkdocs-to-starlight","Migrating from MkDocs to Starlight",{"path":1071,"title":1072},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fversioned-documentation-with-docusaurus","Versioned Documentation with Docusaurus",{"path":1074,"title":1075},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fvitepress-for-library-documentation","VitePress for Library Documentation",{"path":1077,"title":1078},"\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":1080,"title":1081},"\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":1083,"title":1084},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories","Hugo Build Times for Large Repositories",{"path":1086,"title":1087},"\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":1089,"title":1090},"\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":1092,"title":1093},"\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":1095,"title":1017},"\u002Fchoosing-the-right-static-site-generator-for-production",{"path":1097,"title":1098},"\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":1100,"title":1101},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem","Jekyll Plugin Ecosystem",{"path":1103,"title":1104},"\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":1106,"title":1107},"\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":1109,"title":1110},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fspeeding-up-slow-jekyll-builds","Speeding Up Slow Jekyll Builds",{"path":1112,"title":1113},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fupgrading-jekyll-and-ruby-versions-safely","Upgrading Jekyll and Ruby Versions Safely",{"path":1115,"title":1116},"\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":1118,"title":1119},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators","Migrating Between Static Site Generators",{"path":1121,"title":1122},"\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":1124,"title":1125},"\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":1127,"title":1128},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-gatsby-to-astro","Migrating from Gatsby to Astro",{"path":1130,"title":1131},"\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":1133,"title":1134},"\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":1136,"title":1137},"\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":1139,"title":1140},"\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":1142,"title":1143},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites","Next.js Static Export for Content Sites",{"path":1145,"title":1146},"\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":1148,"title":1149},"\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":1151,"title":1152},"\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":1154,"title":1155},"\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":1157,"title":61},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fadding-pagefind-to-an-astro-site",{"path":1159,"title":1160},"\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":1162,"title":38},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites",{"path":1164,"title":1165},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Findexing-hugo-sites-with-pagefind","Indexing Hugo Sites with Pagefind",{"path":1167,"title":974},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fmultilingual-search-on-static-sites",{"path":1032,"title":5},{"path":1170,"title":1171},"\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":1173,"title":1174},"\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":1176,"title":1177},"\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":1179,"title":1180},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fevaluating-ssg-accessibility-defaults","Evaluating SSG Accessibility Defaults",{"path":1182,"title":1183},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix","SSG Framework Selection Matrix",{"path":1185,"title":1186},"\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":1188,"title":1189},"\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":1191,"title":1192},"\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":1194,"title":1195},"\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":1197,"title":1198},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs","CDN Caching Rules for SSGs",{"path":1200,"title":1201},"\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":1203,"title":1204},"\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":1206,"title":1207},"\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":1209,"title":1210},"\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":1212,"title":1213},"\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":1215,"title":1216},"\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":1218,"title":1219},"\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":1221,"title":1222},"\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":1224,"title":1225},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites","Cumulative Layout Shift Fixes for Static Sites",{"path":1227,"title":1228},"\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":1230,"title":1231},"\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":1233,"title":1234},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Ffont-display-optional-vs-swap","font-display: optional vs swap",{"path":1236,"title":1237},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites","Font Loading Strategies for Static Sites",{"path":1239,"title":1240},"\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":1242,"title":1243},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fpreloading-fonts-without-double-downloads","Preloading Fonts Without Double Downloads",{"path":1245,"title":1246},"\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":1248,"title":1249},"\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":1251,"title":1252},"\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":1254,"title":1255},"\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":1257,"title":1258},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro","Image Optimization Pipelines in Astro",{"path":1260,"title":1261},"\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":1263,"title":1264},"\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":1266,"title":1267},"\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":1269,"title":1270},"\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":1272,"title":1273},"\u002Fperformance-optimization-core-web-vitals-for-ssgs","Core Web Vitals Optimization for SSGs",{"path":1275,"title":1276},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fastro-islands-vs-full-hydration-performance","Astro Islands vs Full Hydration Performance",{"path":1278,"title":1279},"\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":1281,"title":1282},"\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":1284,"title":1285},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering","JavaScript Hydration & Partial Rendering",{"path":1287,"title":1288},"\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":1290,"title":1291},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Freplacing-react-islands-with-web-components","Replacing React Islands with Web Components",{"path":1293,"title":1294},"\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":1296,"title":1297},"\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":1299,"title":1300},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites","Largest Contentful Paint Optimization for Static Sites",{"path":1302,"title":1303},"\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":1305,"title":1306},"\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":1308,"title":1309},"\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":1311,"title":1312},"\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":1314,"title":1315},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci","Performance Budgets and Lighthouse CI",{"path":1317,"title":1318},"\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":1320,"title":1321},"\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":1323,"title":1324},"\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":1326,"title":1327},"\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":1329,"title":1330},"\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":1332,"title":1333},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads","Auditing Unused Preloads",{"path":1335,"title":1336},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed","Resource Hints and Navigation Speed",{"path":1338,"title":1339},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Finstant-navigation-with-speculation-rules","Instant Navigation with Speculation Rules",{"path":1341,"title":1342},"\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":1344,"title":1345},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fprefetching-links-in-astro","Prefetching Links in Astro",{"path":1347,"title":1348},"\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":1350,"title":1351},"\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":1353,"title":1354},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites","Third-Party Script Performance on Static Sites",{"path":1356,"title":1357},"\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":1359,"title":1360},"\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":1362,"title":1363},"\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":1365,"title":988},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fself-hosting-analytics-to-cut-third-party-requests",{"path":1367,"title":1368},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fautomating-eleventy-deployments-with-cloudflare-pages","Automating Eleventy Deployments on Cloudflare Pages",{"path":1370,"title":1371},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fconfiguring-redirects-on-cloudflare-pages","Configuring Redirects on Cloudflare Pages",{"path":1373,"title":1374},"\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":1376,"title":1377},"\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":1379,"title":1380},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup","Cloudflare Pages Edge Caching Setup",{"path":1382,"title":1383},"\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":1385,"title":1386},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fchecking-links-in-pull-requests","Checking Links in Pull Requests",{"path":1388,"title":1389},"\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":1391,"title":1392},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Feditorial-checks-with-vale-in-ci","Editorial Checks with Vale in CI",{"path":1394,"title":1395},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams","Content Workflows for Documentation Teams",{"path":1397,"title":1398},"\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":1400,"title":1401},"\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":1403,"title":1404},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fbuilding-astro-sites-with-github-actions","Building Astro Sites with GitHub Actions",{"path":1406,"title":1407},"\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":1409,"title":1410},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fdeploying-to-github-pages-with-actions","Deploying to GitHub Pages with Actions",{"path":1412,"title":1413},"\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":1415,"title":1416},"\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":1418,"title":1419},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds","GitHub Actions for Automated SSG Builds",{"path":1421,"title":1422},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fmatrix-builds-for-multi-site-monorepos","Matrix Builds for Multi-Site Monorepos",{"path":1424,"title":1425},"\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":1427,"title":1428},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fenabling-incremental-builds-in-eleventy","Enabling Incremental Builds in Eleventy",{"path":1430,"title":1431},"\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":1433,"title":1434},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs","Incremental Builds and Build Caching for SSGs",{"path":1436,"title":1437},"\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":1439,"title":1440},"\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":1442,"title":1443},"\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":1445,"title":1446},"\u002Fproduction-ready-deployment-cicd-workflows","Production-Ready Deployment & CI\u002FCD for SSGs",{"path":1448,"title":1449},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Falerting-on-cache-hit-ratio-drops","Alerting on Cache Hit Ratio Drops",{"path":1451,"title":1452},"\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":1454,"title":1455},"\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":1457,"title":1458},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production","Monitoring Static Sites in Production",{"path":1460,"title":1461},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Flogging-404s-at-the-edge","Logging 404s at the Edge",{"path":1463,"title":1464},"\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":1466,"title":1467},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fconfiguring-vercel-for-hugo-and-eleventy","Configuring Vercel for Hugo and Eleventy",{"path":1469,"title":1470},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies","Netlify vs Vercel Deployment Strategies",{"path":1472,"title":1473},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-build-hooks-for-content-updates","Netlify Build Hooks for Content Updates",{"path":1475,"title":1476},"\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":1478,"title":1479},"\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":1481,"title":1482},"\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":1484,"title":1485},"\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":1487,"title":1488},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fcleaning-up-stale-preview-deployments","Cleaning Up Stale Preview Deployments",{"path":1490,"title":1491},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests","Preview Environments for Pull Requests",{"path":1493,"title":1494},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpassword-protecting-preview-deployments","Password-Protecting Preview Deployments",{"path":1496,"title":1497},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpreviewing-headless-cms-drafts","Previewing Headless CMS Drafts",{"path":1499,"title":1500},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fvisual-regression-testing-on-preview-deploys","Visual Regression Testing on Preview Deploys",{"path":1502,"title":1503},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fatomic-deploys-vs-incremental-uploads","Atomic Deploys vs Incremental Uploads",{"path":1505,"title":1506},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fcanary-releases-for-static-sites","Canary Releases for Static Sites",{"path":1508,"title":1509},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Ffeature-flags-on-static-sites","Feature Flags on Static Sites",{"path":1511,"title":1512},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites","Rollbacks and Deploy Safety for Static Sites",{"path":1514,"title":1515},"\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":1517,"title":1518},"\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":1520,"title":1521},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fauditing-npm-dependencies-in-ssg-pipelines","Auditing npm Dependencies in SSG Pipelines",{"path":1523,"title":1524},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fenabling-hsts-and-preload-safely","Enabling HSTS and Preload Safely",{"path":1526,"title":1527},"\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":1529,"title":1530},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites","Security Headers and Hardening for Static Sites",{"path":1532,"title":1533},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecuring-deploy-credentials-with-github-oidc","Securing Deploy Credentials with GitHub OIDC",{"path":1535,"title":1536},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsubresource-integrity-for-third-party-assets","Subresource Integrity for Third-Party Assets",{"path":1538,"title":1539},"\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":1541,"title":1542},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fclean-urls-and-trailing-slashes-on-s3","Clean URLs and Trailing Slashes on S3",{"path":1544,"title":1545},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fcloudfront-functions-for-redirects","CloudFront Functions for Redirects",{"path":1547,"title":1548},"\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":1550,"title":1551},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites","Self-Hosting Static Sites on S3, Nginx and Caddy",{"path":1553,"title":1554},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-caddy","Serving a Static Site with Caddy",{"path":1556,"title":1557},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-nginx","Serving a Static Site with Nginx",{"path":1559,"title":1560},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fzero-downtime-deploys-with-symlink-swaps","Zero-Downtime Deploys with Symlink Swaps",{"path":1562,"title":1563},"\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":1565,"title":1566},"\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":1568,"title":1569},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites","Serverless Functions for Static Sites",{"path":1571,"title":1572},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fnetlify-functions-vs-cloudflare-workers","Netlify Functions vs Cloudflare Workers",{"path":1574,"title":1575},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fprotecting-a-static-site-behind-authentication","Protecting a Static Site Behind Authentication",{"path":1577,"title":668},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fproxying-third-party-apis-from-an-edge-function",1789722847270]