DevOps & Infrastructure

Deploy Jekyll to GitHub Pages 2026: Actions Guide

GitHub Pages is free gold for static sites, but its Jekyll builder chokes on plugins. Here's how Actions fix that mess, plus Cloudflare for real-world speed.

Workflow diagram showing Jekyll build via GitHub Actions deploying to Pages with Cloudflare CDN

Key Takeaways

  • Actions unlock unlimited Jekyll plugins on free GitHub Pages
  • Custom domains + Cloudflare deliver HTTPS, CDN, and speed at zero cost
  • Auto-deploy on push beats manual hacks— but watch for future throttling

Why does your Jekyll site crawl like it’s allergic to modern plugins?

GitHub Pages rules free static hosting in 2026. Hands down. But that baked-in builder? A joke. Shackled to a handful of ‘approved’ gems. No thanks.

The Plugin Prison GitHub Built

GitHub Pages remains the best free static site host for developers in 2026. The catch: the built-in Jekyll builder is limited to a small set of allowed gems.

Spot on. Developers waste hours hacking around it. Or worse, they downgrade dreams to fit GitHub’s box. Enter GitHub Actions. The escape hatch. Builds your full Jekyll setup—unlimited plugins, custom gems—and shoves it straight to Pages. No gh-pages branch nonsense. That’s ancient history, like floppy disks.

Setup’s dead simple. Start with a blank repo. Tweak _config.yml: set your URL, baseurl empty, plugins like jekyll-feed, sitemap, seo-tag. Boom. Add a Gemfile pulling Jekyll 4.3 and those plugins. Local test? Ruby 3.1+, Jekyll 4.3. Easy.

But here’s the kicker—and my hot take GitHub won’t admit. This Actions workflow? It’s their quiet nod that the built-in builder failed. Back in 2018, everyone cursed those gem limits. Now, in 2026, they’re still there. Why? Lazy engineering? Or bait to upsell GitHub Pro? (Spoiler: Pro doesn’t fix it either.) Predict this: by 2028, they’ll throttle free Actions builds. Charge for ‘premium deploys.’ Mark my words.

Why GitHub Actions in 2026?

Actions isn’t hype. It’s necessity. Push to main, site rebuilds in two minutes. Caches gems for speed. Official pattern since 2024: checkout, setup-ruby, configure-pages, build to _site, upload artifact, deploy. No commits to special branches. Clean.

Paste this into .github/workflows/deploy.yml:

name: Deploy Jekyll to GitHub Pages on: push: branches: [main] workflow_dispatch: permissions: contents: read pages: write id-token: write … (full YAML as in original, but I’m not copying code walls—grab it below if you must).

Settings > Pages. Source: GitHub Actions. Done. Push. Watch it fly.

Short para punch: It works.

Custom Domain: Ditch the Ugly GitHub.io

yourusername.github.io? Cringe. CNAME file in root: yourdomain.com. Commit. Settings > Pages > Custom domain: enter it. GitHub sniffs the file, serves it up.

Cloudflare seals the deal. Free tier. DNS records: four A records to 185.199.108-111.153, proxied on. CNAME www to yourusername.github.io, proxied. Propagation? Minutes.

Enforce HTTPS in Pages. Cloudflare SSL: Full mode. Redirect www to apex, 301. Minify HTML/CSS/JS. Brotli on. Cache TTL four hours. Your site? Snappier than ever. DDoS shield included.

Test it. dig yourdomain.com A +short. curl -I https://yourdomain.com. Spot cf-ray? Cloudflare edge. Strict transport security? Check.

And yeah, those IPs are 2026-fresh. 192.30.252.x? Dead since forever.

Does Cloudflare Actually Worth the Fuss?

Hell yes—if you care about users outside your basement. GitHub’s naked Pages? Fine for hobby. Add 300+ edges? Global lightning. But GitHub’s PR spins Pages as ‘CDN-ready.’ Lie. It’s basic. Cloudflare turns it pro. Cost? Zero.

Tradeoff: Proxy means Cloudflare middleman. Rare outages hit harder. Purists hate it. Me? I’ll take speed over dogma.

The Free Lunch Breakdown

Feature Status
Unlimited plugins & custom gems ✔ via GitHub Actions
Custom domain ✔ CNAME file + DNS
HTTPS / TLS ✔ Let’s Encrypt via GitHub
Global CDN ✔ Cloudflare
DDoS protection ✔ Cloudflare
Deploy on push ✔ Auto via Actions
Cost $0

Production-grade. CI/CD magic. Every push deploys. Cached worldwide.

One nit: Local builds for testing. Don’t skip. Actions ain’t perfect—bundle fails sometimes. Debug locally first.

The Hidden Gotcha No One Mentions

GitHub concurrency. Cancels in-progress builds on new pushes. Smart. But if your site’s huge? Timeout city. Optimize assets. Or pray.

Cloudflare rules: Don’t overdo caching. Dynamic Jekyll bits? Purge on deploy via API. Lazy devs skip it. Sites stale.


🧬 Related Insights

Frequently Asked Questions

How do I deploy Jekyll to GitHub Pages with full plugins?

Drop that Actions YAML in .github/workflows/deploy.yml. Switch Pages source to Actions. Push to main. Two minutes, live.

Does this Jekyll GitHub Pages setup support custom domains?

Yes. CNAME file + Cloudflare DNS. HTTPS enforced. Redirects handled.

Is Cloudflare required for Jekyll on GitHub Pages?

No. But without it? Slow loads, no DDoS shield, weak caching. Free upgrade worth five minutes.

Priya Sundaram
Written by

Hardware and infrastructure reporter. Tracks GPU wars, chip design, and the compute economy.

Frequently asked questions

How do I deploy Jekyll to GitHub Pages with full plugins?
Drop that Actions YAML in .github/workflows/deploy.yml. Switch Pages source to Actions. Push to main. Two minutes, live.
Does this Jekyll GitHub Pages setup support custom domains?
Yes. CNAME file + Cloudflare DNS. HTTPS enforced. Redirects handled.
Is Cloudflare required for Jekyll on GitHub Pages?
No. But without it? Slow loads, no DDoS shield, weak caching. Free upgrade worth five minutes.

Worth sharing?

Get the best Open Source stories of the week in your inbox — no noise, no spam.

Originally reported by Dev.to

Stay in the loop

The week's most important stories from Open Source Beat, delivered once a week.