[{"data":1,"prerenderedAt":148},["ShallowReactive",2],{"hub:tools-github-actions":3},{"path":4,"key":5,"title":6,"h1":7,"description":8,"crumbs":9,"blocks":17},"\u002Ftools\u002Fgithub-actions\u002F","tools-github-actions","GitHub Actions for Static Site Builds","GitHub Actions","Guides for building and deploying static sites with GitHub Actions: caching, matrix builds, reusable workflows, concurrency and pinning.",[10,13,16],[11,12],"Home","\u002F",[14,15],"Tools","\u002Ftools\u002F",[7,4],[18,21,23,26,39,41,48,116,118],{"k":19,"text":20},"p","GitHub Actions is where most static sites on this site are built, tested and deployed from, so its guides are about the pipeline itself rather than any one generator: caching dependencies and generator output between runs, fanning out over many sites with matrix builds, sharing one pipeline across repositories with reusable workflows, cancelling superseded runs, and pinning third-party actions so a moved tag cannot change what runs with your deploy credentials.",{"k":19,"text":22},"Every guide reports CI minutes and wall-clock time before and after, because a pipeline change that makes builds safer but twice as slow tends to get reverted.",{"k":24,"html":25},"fig","\u003Cfigure>\n\u003Csvg viewBox=\"0 0 760 294\" role=\"img\" aria-labelledby=\"hub-github-actions-hero-title hub-github-actions-hero-desc\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\">\n  \u003Ctitle id=\"hub-github-actions-hero-title\">Sequence of jobs in a typical GitHub Actions workflow for a static site\u003C\u002Ftitle>\n  \u003Cdesc id=\"hub-github-actions-hero-desc\">A push triggers the workflow. The build job restores caches and builds the site. The test job checks the output. The preview job deploys and comments the URL. On merge, the deploy job runs with short-lived credentials.\u003C\u002Fdesc>\n  \u003Crect x=\"0\" y=\"0\" width=\"760\" height=\"294\" fill=\"#ffffff\"\u002F>\n  \u003Cg style=\"font-family:system-ui, sans-serif;font-size:12px\">\n    \u003Crect x=\"30.0\" y=\"56.0\" width=\"160.0\" height=\"57.2\" rx=\"8\" fill=\"#f8fafc\" stroke=\"#d9e2ef\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Crect x=\"210.0\" y=\"56.0\" width=\"160.0\" height=\"57.2\" rx=\"8\" fill=\"#1982c4\" opacity=\"0.14\" stroke=\"#1982c4\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Crect x=\"390.0\" y=\"56.0\" width=\"160.0\" height=\"57.2\" rx=\"8\" fill=\"#ffca3a\" opacity=\"0.24\" stroke=\"#a97b00\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Crect x=\"570.0\" y=\"56.0\" width=\"160.0\" height=\"57.2\" rx=\"8\" fill=\"#8ac926\" opacity=\"0.2\" stroke=\"#5a8a16\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Cpath d=\"M114.0 148.1 L284.0 148.1\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:1.8px;marker-end:url(#hub-github-actions-hero-arrow)\"\u002F>\n    \u003Cpath d=\"M294.0 196.0 L464.0 196.0\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:1.8px;marker-end:url(#hub-github-actions-hero-arrow)\"\u002F>\n    \u003Cpath d=\"M466.0 229.0 L116.0 229.0\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:1.8px;stroke-dasharray:5 4;marker-end:url(#hub-github-actions-hero-arrow)\"\u002F>\n    \u003Cpath d=\"M294.0 261.9 L644.0 261.9\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:1.8px;marker-end:url(#hub-github-actions-hero-arrow)\"\u002F>\n    \u003Cpath d=\"M110.0 115.2 L110.0 277.9\" fill=\"none\" stroke=\"#d9e2ef\" style=\"stroke-width:1.5px;stroke-dasharray:4 4\"\u002F>\n    \u003Cpath d=\"M290.0 115.2 L290.0 277.9\" fill=\"none\" stroke=\"#d9e2ef\" style=\"stroke-width:1.5px;stroke-dasharray:4 4\"\u002F>\n    \u003Cpath d=\"M470.0 115.2 L470.0 277.9\" fill=\"none\" stroke=\"#d9e2ef\" style=\"stroke-width:1.5px;stroke-dasharray:4 4\"\u002F>\n    \u003Cpath d=\"M650.0 115.2 L650.0 277.9\" fill=\"none\" stroke=\"#d9e2ef\" style=\"stroke-width:1.5px;stroke-dasharray:4 4\"\u002F>\n    \u003Ctext x=\"380.0\" y=\"30.0\" fill=\"#1f2937\" style=\"font-size:16px;text-anchor:middle;font-weight:700\">A pull request through a static site pipeline\u003C\u002Ftext>\n    \u003Ctext x=\"110.0\" y=\"82.4\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Push\u003C\u002Ftext>\n    \u003Ctext x=\"110.0\" y=\"99.3\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">pull request\u003C\u002Ftext>\n    \u003Ctext x=\"290.0\" y=\"82.4\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Build\u003C\u002Ftext>\n    \u003Ctext x=\"290.0\" y=\"99.3\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">cached\u003C\u002Ftext>\n    \u003Ctext x=\"470.0\" y=\"82.4\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Test + preview\u003C\u002Ftext>\n    \u003Ctext x=\"470.0\" y=\"99.3\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">checks, URL\u003C\u002Ftext>\n    \u003Ctext x=\"650.0\" y=\"82.4\" fill=\"#1f2937\" style=\"font-size:13px;text-anchor:middle;font-weight:700\">Deploy\u003C\u002Ftext>\n    \u003Ctext x=\"650.0\" y=\"99.3\" fill=\"#556071\" style=\"font-size:11px;text-anchor:middle\">on merge, OIDC\u003C\u002Ftext>\n    \u003Ctext x=\"200.0\" y=\"140.1\" fill=\"#1f2937\" style=\"font-size:11.5px;text-anchor:middle\">restore cache, build\u003C\u002Ftext>\n    \u003Ctext x=\"380.0\" y=\"173.1\" fill=\"#1f2937\" style=\"font-size:11.5px;text-anchor:middle\">artifact to tests and\u003C\u002Ftext>\n    \u003Ctext x=\"380.0\" y=\"188.0\" fill=\"#1f2937\" style=\"font-size:11.5px;text-anchor:middle\">preview\u003C\u002Ftext>\n    \u003Ctext x=\"290.0\" y=\"221.0\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:middle\">checks and preview comment\u003C\u002Ftext>\n    \u003Ctext x=\"470.0\" y=\"253.9\" fill=\"#1f2937\" style=\"font-size:11.5px;text-anchor:middle\">on main: deploy\u003C\u002Ftext>\n  \u003C\u002Fg>\n  \u003Cdefs>\n    \u003Cmarker id=\"hub-github-actions-hero-arrow\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\n      \u003Cpath d=\"M0 0 L10 5 L0 10 z\" fill=\"#556071\"\u002F>\n    \u003C\u002Fmarker>\n  \u003C\u002Fdefs>\n\u003C\u002Fsvg>\n\u003Cfigcaption>Each arrow corresponds to one or more guides below.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>",{"k":27,"h":28,"items":29},"group","Choosing the Right Static Site Generator for Production",[30,35],{"t":31,"u":32,"d":33,"y":34},"Deploying Jekyll with GitHub Actions","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fdeploying-jekyll-with-github-actions\u002F","Replace the classic GitHub Pages Jekyll builder with a GitHub Actions workflow: any plugin, any Jekyll version, caching, previews and Pages deployment.","How-to",{"t":36,"u":37,"d":38,"y":34},"Parallel Hugo Builds Across CI Jobs","\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fparallel-hugo-builds-across-ci-jobs\u002F","Split a very large Hugo site into segments built in parallel CI jobs, merge the output safely, and measure when parallel builds beat a single larger runner.",{"k":24,"html":40},"\u003Cfigure>\n\u003Csvg viewBox=\"0 0 760 295\" role=\"img\" aria-labelledby=\"hub-github-actions-kinds-title hub-github-actions-kinds-desc\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\">\n  \u003Ctitle id=\"hub-github-actions-kinds-title\">Number of GitHub Actions guides of each kind\u003C\u002Ftitle>\n  \u003Cdesc id=\"hub-github-actions-kinds-desc\">Vertical bars: How-tos 18, Fixes 1, Comparisons 0 and Concepts 0.\u003C\u002Fdesc>\n  \u003Crect x=\"0\" y=\"0\" width=\"760\" height=\"295\" fill=\"#ffffff\"\u002F>\n  \u003Cg style=\"font-family:system-ui, sans-serif;font-size:12px\">\n    \u003Crect x=\"80.0\" y=\"76.0\" width=\"90.0\" height=\"170.0\" rx=\"3\" fill=\"#1982c4\" opacity=\"0.3\" stroke=\"#1982c4\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"250.0\" y=\"236.6\" width=\"90.0\" height=\"9.4\" rx=\"3\" fill=\"#ff595e\" opacity=\"0.3\" stroke=\"#d83b41\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"420.0\" y=\"243.0\" width=\"90.0\" height=\"3.0\" rx=\"3\" fill=\"#ffca3a\" opacity=\"0.45\" stroke=\"#a97b00\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"590.0\" y=\"243.0\" width=\"90.0\" height=\"3.0\" rx=\"3\" fill=\"#6a4c93\" opacity=\"0.3\" stroke=\"#6a4c93\" style=\"stroke-width:1px\"\u002F>\n    \u003Cpath d=\"M30.0 246.0 L730.0 246.0\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Ctext x=\"380.0\" y=\"30.0\" fill=\"#1f2937\" style=\"font-size:16px;text-anchor:middle;font-weight:700\">GitHub Actions guides by kind\u003C\u002Ftext>\n    \u003Ctext x=\"125.0\" y=\"69.0\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:middle;font-weight:700\">18\u003C\u002Ftext>\n    \u003Ctext x=\"125.0\" y=\"264.0\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:middle\">How-tos\u003C\u002Ftext>\n    \u003Ctext x=\"295.0\" y=\"229.6\" fill=\"#b32b30\" style=\"font-size:12px;text-anchor:middle;font-weight:700\">1\u003C\u002Ftext>\n    \u003Ctext x=\"295.0\" y=\"264.0\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:middle\">Fixes\u003C\u002Ftext>\n    \u003Ctext x=\"465.0\" y=\"236.0\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:middle;font-weight:700\">0\u003C\u002Ftext>\n    \u003Ctext x=\"465.0\" y=\"264.0\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:middle\">Comparisons\u003C\u002Ftext>\n    \u003Ctext x=\"635.0\" y=\"236.0\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:middle;font-weight:700\">0\u003C\u002Ftext>\n    \u003Ctext x=\"635.0\" y=\"264.0\" fill=\"#556071\" style=\"font-size:11.5px;text-anchor:middle\">Concepts\u003C\u002Ftext>\n  \u003C\u002Fg>\n\u003C\u002Fsvg>\n\u003Cfigcaption>19 guides use GitHub Actions in depth; each is listed below under the section it belongs to.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>",{"k":27,"h":42,"items":43},"Core Web Vitals Optimization for SSGs",[44],{"t":45,"u":46,"d":47,"y":34},"Setting Up Lighthouse CI for a Static Site","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fsetting-up-lighthouse-ci-for-a-static-site\u002F","Wire Lighthouse CI into GitHub Actions against every preview deploy: URL selection, assertions, a required status check and stored reports, in about an hour.",{"k":27,"h":49,"items":50},"Production-Ready Deployment & CI\u002FCD for SSGs",[51,55,59,63,67,71,75,79,83,87,91,95,99,103,107,111],{"t":52,"u":53,"d":54,"y":34},"Automating Preview Deploy Pipelines with GitHub Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fautomating-preview-deploy-pipelines-with-github-actions\u002F","Build an ephemeral per-PR preview pipeline in GitHub Actions — build the SSG, deploy to a unique URL, comment the link, and tear it down when the PR closes.",{"t":56,"u":57,"d":58,"y":34},"Building Astro Sites with GitHub Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fbuilding-astro-sites-with-github-actions\u002F","A production GitHub Actions workflow for Astro: pinned Node, dependency and image caches, astro check, build artifacts and a deploy job that only runs on main.",{"t":60,"u":61,"d":62,"y":34},"Caching Hugo Builds in GitHub Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fcaching-hugo-builds-in-github-actions\u002F","Cache Hugo resources\u002F_gen and the module cache in GitHub Actions with content-hashed keys. Includes the workflow, cache key design, and measured CI minutes saved.",{"t":64,"u":65,"d":66,"y":34},"Caching node_modules in GitHub Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fcaching-node-modules-in-github-actions-for-faster-ssg-builds\u002F","Cut SSG CI time by caching npm in GitHub Actions — actions\u002Fsetup-node built-in cache vs actions\u002Fcache, lockfile-hash keys, and the install minutes you actually save.",{"t":68,"u":69,"d":70,"y":34},"Concurrency Groups to Cancel Stale Builds","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fconcurrency-groups-to-cancel-stale-builds\u002F","Use GitHub Actions concurrency groups to cancel superseded static site builds on pull requests, serialize production deploys, and cut wasted CI minutes.",{"t":72,"u":73,"d":74,"y":34},"Deploying to Cloudflare From GitHub Actions With Wrangler","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fdeploying-to-cloudflare-from-github-actions-with-wrangler\u002F","Deploy a static site to Cloudflare Workers Static Assets or Pages from GitHub Actions with Wrangler: scoped tokens, PR previews, caching and rollback.",{"t":76,"u":77,"d":78,"y":34},"GitHub Actions for Hugo Deployments","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fhow-to-set-up-github-actions-for-hugo-deployments\u002F","Deploy Hugo with GitHub Actions using the extended edition for SCSS and WebP — a two-job build-and-publish pipeline, resource caching, and the Hugo-specific gotchas.",{"t":80,"u":81,"d":82,"y":34},"Matrix Builds for Multi-Site Monorepos","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fmatrix-builds-for-multi-site-monorepos\u002F","Build and deploy only the sites a change affects in a monorepo, using a dynamic GitHub Actions matrix generated from changed paths, with per-site caches.",{"t":84,"u":85,"d":86,"y":34},"Pinning Actions by Commit SHA","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fpinning-actions-by-commit-sha\u002F","Pin third-party GitHub Actions in static site workflows to full commit SHAs, keep them updated with Renovate or Dependabot, and restrict which actions may run.",{"t":88,"u":89,"d":90,"y":34},"Publishing Any Generator to GitHub Pages With Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fpublishing-any-generator-to-github-pages-with-actions\u002F","One reusable GitHub Actions workflow that publishes Hugo, Astro, Eleventy, Jekyll or VitePress sites to GitHub Pages, with base paths, caching and a 404 page.",{"t":92,"u":93,"d":94,"y":34},"Pull Request Previews for GitHub Pages Sites","\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpull-request-previews-for-github-pages-sites\u002F","Give a GitHub Pages site a preview per pull request: deploy builds to a preview host or a subfolder, comment the URL, handle base paths and clean up on close.",{"t":96,"u":97,"d":98,"y":34},"Reusable Workflows for SSG Builds","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Freusable-workflows-for-ssg-builds\u002F","Share one build, test and deploy pipeline across many static sites with GitHub Actions reusable workflows and composite actions, versioned and called by tag.",{"t":100,"u":101,"d":102,"y":34},"Scheduled Content Publishing With GitHub Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fscheduled-content-publishing-with-github-actions\u002F","Publish reviewed pull requests at a set time with GitHub Actions, for embargoed launches and releases, with time zones, approvals and failed-build guards.",{"t":104,"u":105,"d":106,"y":34},"Securing Deploy Credentials with GitHub OIDC","\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecuring-deploy-credentials-with-github-oidc\u002F","Replace long-lived deploy tokens with short-lived OIDC credentials in GitHub Actions for AWS, Cloudflare and Netlify, scoped to one branch and one deploy job.",{"t":108,"u":109,"d":110,"y":34},"Zero-Downtime Deploys with Symlink Swaps","\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fzero-downtime-deploys-with-symlink-swaps\u002F","Deploy a static site to a VM atomically: one directory per release, an atomic symlink swap, one-second rollback, retention and a GitHub Actions workflow.",{"t":112,"u":113,"d":114,"y":115},"Fixing Flaky Static Site Builds in GitHub Actions","\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Ffixing-flaky-static-site-builds-in-github-actions\u002F","Track down static site builds that fail intermittently in GitHub Actions, from network fetches and cache races to memory limits and timing tests.","Fix",{"k":24,"html":117},"\u003Cfigure>\n\u003Csvg viewBox=\"0 0 760 278\" role=\"img\" aria-labelledby=\"hub-github-actions-topics-title hub-github-actions-topics-desc\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\">\n  \u003Ctitle id=\"hub-github-actions-topics-title\">Topics with the most GitHub Actions guides\u003C\u002Ftitle>\n  \u003Cdesc id=\"hub-github-actions-topics-desc\">Horizontal bars, largest first: GitHub Actions for Automated SSG Builds 9, Preview Environments for Pull Requests 2, Jekyll Plugin Ecosystem 1, Performance Budgets and Lighthouse CI 1, Incremental Builds and Build Caching for SSGs 1 and Security Headers and Hardening for Static Sites 1.\u003C\u002Fdesc>\n  \u003Crect x=\"0\" y=\"0\" width=\"760\" height=\"278\" fill=\"#ffffff\"\u002F>\n  \u003Cg style=\"font-family:system-ui, sans-serif;font-size:12px\">\n    \u003Crect x=\"350.0\" y=\"65.0\" width=\"365.6\" height=\"20.0\" rx=\"3\" fill=\"#6a4c93\" opacity=\"0.3\" stroke=\"#6a4c93\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"99.0\" width=\"81.2\" height=\"20.0\" rx=\"3\" fill=\"#6a4c93\" opacity=\"0.3\" stroke=\"#6a4c93\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"133.0\" width=\"40.6\" height=\"20.0\" rx=\"3\" fill=\"#6a4c93\" opacity=\"0.3\" stroke=\"#6a4c93\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"167.0\" width=\"40.6\" height=\"20.0\" rx=\"3\" fill=\"#6a4c93\" opacity=\"0.3\" stroke=\"#6a4c93\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"201.0\" width=\"40.6\" height=\"20.0\" rx=\"3\" fill=\"#6a4c93\" opacity=\"0.3\" stroke=\"#6a4c93\" style=\"stroke-width:1px\"\u002F>\n    \u003Crect x=\"350.0\" y=\"235.0\" width=\"40.6\" height=\"20.0\" rx=\"3\" fill=\"#6a4c93\" opacity=\"0.3\" stroke=\"#6a4c93\" style=\"stroke-width:1px\"\u002F>\n    \u003Cpath d=\"M350.0 60.0 L350.0 260.0\" fill=\"none\" stroke=\"#556071\" style=\"stroke-width:1.5px\"\u002F>\n    \u003Ctext x=\"380.0\" y=\"30.0\" fill=\"#1f2937\" style=\"font-size:16px;text-anchor:middle;font-weight:700\">Where GitHub Actions comes up\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"79.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">GitHub Actions for Automated SSG Builds\u003C\u002Ftext>\n    \u003Ctext x=\"723.6\" y=\"79.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">9\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"113.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Preview Environments for Pull Requests\u003C\u002Ftext>\n    \u003Ctext x=\"439.2\" y=\"113.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">2\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"147.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Jekyll Plugin Ecosystem\u003C\u002Ftext>\n    \u003Ctext x=\"398.6\" y=\"147.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">1\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"181.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Performance Budgets and Lighthouse CI\u003C\u002Ftext>\n    \u003Ctext x=\"398.6\" y=\"181.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">1\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"215.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Incremental Builds and Build Caching\u003C\u002Ftext>\n    \u003Ctext x=\"398.6\" y=\"215.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">1\u003C\u002Ftext>\n    \u003Ctext x=\"20.0\" y=\"249.2\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start\">Security Headers and Hardening\u003C\u002Ftext>\n    \u003Ctext x=\"398.6\" y=\"249.5\" fill=\"#1f2937\" style=\"font-size:12px;text-anchor:start;font-weight:700\">1\u003C\u002Ftext>\n  \u003C\u002Fg>\n\u003C\u002Fsvg>\n\u003Cfigcaption>Topic pages give the wider context for each group; the numbers count only guides that use this tool in depth.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>",{"k":27,"h":119,"items":120},"Often used with GitHub Actions",[121,126,130,135,140,144],{"t":122,"u":123,"d":124,"y":125},"GitHub Pages","\u002Ftools\u002Fgithub-pages\u002F","Publishing from Actions and custom domains.","3 shared guides",{"t":127,"u":128,"d":129,"y":125},"Hugo","\u002Ftools\u002Fhugo\u002F","Build time at scale, image caches, modules and multilingual sites.",{"t":131,"u":132,"d":133,"y":134},"Cloudflare","\u002Ftools\u002Fcloudflare\u002F","Pages and Workers hosting, cache rules and edge functions.","2 shared guides",{"t":136,"u":137,"d":138,"y":139},"Jekyll","\u002Ftools\u002Fjekyll\u002F","Plugins, reproducible builds, upgrades and migration away.","1 shared guides",{"t":141,"u":142,"d":143,"y":139},"Lighthouse","\u002Ftools\u002Flighthouse\u002F","Budgets, Lighthouse CI and lab against field data.",{"t":145,"u":146,"d":147,"y":139},"Astro","\u002Ftools\u002Fastro\u002F","Islands, content collections, astro:assets and deployment.",1790943190467]