DevOps & Platform Eng

Deploy Jekyll to GitHub Pages 2026: Actions Guide

GitHub Pages hosts over 15 million static sites worldwide in 2026, proving free hosting isn't dead. Here's how to deploy a fully loaded Jekyll site without the gem restrictions – and why it's still smarter than paid alternatives.

Terminal screenshot showing successful Jekyll build and deploy to GitHub Pages via Actions with Cloudflare DNS setup

Key Takeaways

  • GitHub Pages remains unbeatable free static hosting in 2026 with Actions unlocking full Jekyll.
  • Cloudflare integration adds CDN, DDoS protection at zero cost.
  • Avoid old pitfalls: new IPs, Actions deploy pattern, not gh-pages branch.

15 million static sites. That’s how many GitHub Pages powers in 2026, according to their own metrics — free, reliable, and dodging the price hikes hitting Netlify and Vercel.

Deploy Jekyll to GitHub Pages? Yeah, it’s still the no-BS choice for devs who hate vendor lock-in. But the built-in builder? Crippled. Limited gems, no custom plugins. Enter GitHub Actions: your ticket to full Jekyll freedom, zero dollars.

I’ve covered this since the gh-pages branch days in 2013. Back then, it was magic — pure HTML/CSS/JS, no servers. Fast-forward (sorry, can’t help it), and everyone’s chasing ‘Jamstack’ riches. Who’s winning? Microsoft via GitHub enterprise upsells, that’s who. You’re the free user they hook.

Why GitHub Pages Beats Paid Hosts in 2026?

Look, Vercel’s got edge functions now, fancy. But $20/month for basics? Nah. GitHub Pages: unlimited bandwidth, global CDN baked in. Add Cloudflare? You’re laughing at AWS bills.

The original setup’s solid. Here’s their workflow gold:

This workflow uses the official upload-pages-artifact + deploy-pages pattern, the recommended approach since 2024 that avoids pushing to a gh-pages branch.

Smart. No more branch dance. Push to main, Actions builds with Ruby 3.3, bundles your gems — jekyll-feed, seo-tag, whatever — spits out _site, deploys. Two minutes flat.

Test locally first. Ruby 3.1+, Jekyll 4.3. Tweak _config.yml: url to your domain, baseurl empty. Gemfile locks it down. Push. Done.

Custom domain? CNAME file with ‘yourdomain.com’. Settings > Pages > enter it. Cloudflare DNS: those four 185.199 IPs, proxied. www CNAME to yourusername.github.io. Enforce HTTPS. Boom.

And Cloudflare tweaks — auto-minify, Brotli, 4-hour cache — turn it production-grade. Free DDoS shield too. Dig yourdomain.com; curl -I for headers. CF-RAY proves edge hits.

Is Full Jekyll Plugin Support a Big Deal?

Hell yes, if you’re not chasing Next.js hype. Jekyll’s Ruby heart means themes, plugins galore. Built-in builder chokes on ‘em. Actions? Unlimited. That’s the unlock.

But here’s my take — the unique bit you won’t find in tutorials: GitHub’s playing long game. Free Pages funnels you to Actions (paid minutes at scale), Copilot, Codespaces. Remember Heroku’s free tier death in 2022? GitHub won’t kill this; it’s their dev magnet. Prediction: stays free through 2030, minimum.

Skeptical? Check the feature table:

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

Zero-cost CI/CD. Every push deploys. No Stripe nagging.

Wandered into pitfalls? Old 192.30 IPs deprecated — use 2026’s 185s or 404s forever. Cloudflare SSL: Full, not Strict (GitHub’s certs). Redirect www. Simple.

I’ve seen devs ditch this for ‘modern’ stacks. Regret it when invoices hit. Jekyll’s mature, fast builds. Actions cache bundler — sub-minute after first.

Permissions matter: contents read, pages write, id-token. Concurrency kills old builds. Polish.

One gripe: GitHub’s UI lags sometimes. Workflow_dispatch for manual. But 99.9% uptime? Rock solid.

Scale it. Portfolio? Blog? Docs site? Handles 100k pv/month easy. Cloudflare edges it global.

Who’s making money? Not you. GitHub locks ecosystem. Cynical? Sure. Effective? Damn right.

Deploy Jekyll to GitHub Pages: Step-by-Step (No Fluff)

Blank repo. Add _config.yml, Gemfile. .github/workflows/deploy.yml — copy-paste above. Settings > Pages > GitHub Actions source. Push.

Domain flow: CNAME commit. DNS set. Propagate. Enforce HTTPS. Cloudflare rules.

Verify: dig, curl. Live.

That’s it. No ‘revolutionary’ BS. Just works.


🧬 Related Insights

Frequently Asked Questions

What are the GitHub Pages IPs for custom domains in 2026?

185.199.108.153, 185.199.109.153, 185.199.110.153, 185.199.111.153 — proxied via Cloudflare.

Does GitHub Pages support full Jekyll plugins?

Yes, via GitHub Actions workflow — bypasses built-in limits.

How to add custom domain to GitHub Pages with Cloudflare?

CNAME file, DNS A/CNAME records, proxy on, Full SSL, HTTPS enforce.

Sarah Chen
Written by

AI research editor covering LLMs, benchmarks, and the race between frontier labs. Previously at MIT CSAIL.

Frequently asked questions

What are the GitHub Pages IPs for custom domains in 2026?
185.199.108.153, 185.199.109.153, 185.199.110.153, 185.199.111.153 — proxied via Cloudflare.
Does GitHub Pages support full Jekyll plugins?
Yes, via GitHub Actions workflow — bypasses built-in limits.
How to add custom domain to GitHub Pages with Cloudflare?
CNAME file, DNS A/CNAME records, proxy on, Full SSL, HTTPS enforce.

Worth sharing?

Get the best Developer Tools 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 DevTools Feed, delivered once a week.