Guide Jekyll SEO
How to optimize Jekyll sites pour search — pourquoi its static HTML is crawler-friendly by par défaut, plus the jekyll-seo-tag and jekyll-sitemap plugins, permalinks, collections, robots.txt, and the GitHub Pages plugin whitelist.
Langues
1 indice probant sur cette page
- Données sources liéesdependency liste
Jekyll outputs flat, static HTML — robots d’exploration obtenir complet content on the premier récupérer, with aucun JavaScript rendering delay. So the SEO fonctionner isn't fighting the framework; it's configuration. Install jekyll-seo-tag (title, description, canonical, Ouvrir Graph, Twitter Card, JSON-LD) and jekyll-sitemap (sitemap.xml), and définir url: in _config.yml or les deux produce broken output. Pick clean permalinks (/:title/, pas date-based) pour evergreen content. Créer robots.txt yourself — Jekyll won't. Watch two GitHub Pages traps: the plugin whitelist (seulement a fixed définir runs sans a GitHub Actions construire) and baseurl misconfiguration on project sites, qui breaks every URL canonique.
TL;DR — Jekyll builds votre whole site into plain HTML fichiers ahead of temps, so Google sees votre content on the premier visit — aucun waiting pour JavaScript. That’s a great starting point pour le SEO. The fonctionner is in the setup: install two plugins (
jekyll-seo-tagpour meta tags,jekyll-sitemappour votre sitemap), définir votre site URL in the config, pick clean URLs, and ajouter arobots.txtyourself.
Ce que Jekyll is
Jekyll is a static site generator — a outil que turns votre content (written in
Markdown) and templates into finished HTML fichiers avant anyone visits. It’s
written in Ruby, and it’s the engine behind GitHub Pages, so si you’ve ever
pushed a project’s docs or a personal blog to a github.io adresse, you’ve
probably utilisé Jekyll sans thinking à propos de it. Evidence for this claim Jekyll transforms source content and templates into a static website and is supported by GitHub Pages. Scope: Jekyll and GitHub Pages. Confidence: high · Verified: Jekyll documentation GitHub Pages: Jekyll
The important partie pour le SEO: parce que Jekyll produces plain HTML fichiers, a search engine obtient votre complet content the moment it récupère lune page. There’s aucun JavaScript que has to run premier. Que removes un entier échec mode from the table — it doesn’t guarantee indexation or rankings by itself, since que encore dépend on votre content, configuration, and the metadata covered ci-dessous.
Ce que Jekyll fait pas do pour vous
Here’s the catch beginners hit: Jekyll is crawler-friendly, but it isn’t “SEO-friendly” out of the box. A par défaut Jekyll theme souvent ships with aucun title tags, meta descriptions, or données structurées at tout. Vous have to ajouter ceux. The bon news is two official plugins do almost tout of it:
jekyll-seo-tag— adds votre title tag, meta description, URL canonique, and social-sharing tags automatically.jekyll-sitemap— builds votresitemap.xmlautomatically. Evidence for this claim The jekyll-seo-tag and jekyll-sitemap plugins generate SEO tags and sitemap files for Jekyll sites. Scope: Named Jekyll plugins. Confidence: high · Verified: Jekyll SEO Tag Jekyll Sitemap
The five choses to obtenir correct
- Install
jekyll-seo-tagand put{% seo %}in votre layout’s<head>. - Install
jekyll-sitemapso moteur de recherches obtenir a liste of votre pages. - Définir
url:in_config.ymlto votre réel domain — les deux plugins besoin it, or votre URL canoniques and sitemap point atlocalhostand break. - Utiliser a custom domain, pas the free
username.github.io/repoadresse, pour quelconque site où ranking matters. - Ajouter a
robots.txtyourself — Jekyll doesn’t créer un.
The GitHub Pages surprise
Si vous host on GitHub Pages, vous can’t simplement install quelconque plugin vous vouloir. GitHub
runs Jekyll in a locked-down mode que seulement permet a short liste of plugins.
Thankfully jekyll-seo-tag and jekyll-sitemap are les deux on que liste — so the
essentials fonctionner. Pour anything fancier you’d besoin a différent construire setup (covered
in the Avancé tab).
Vouloir the complet version — the plugin whitelist, the baseurl bug que breaks
URL canoniques, permalinks, collections, and custom données structurées? Switch to the
Avancé tab.
TL;DR — Jekyll emits flat static HTML at construire temps, so content is in the raw réponse on the premier explorer — aucun Web Rendering Service, aucun Wave 2 delay. The SEO fonctionner is configuration, pas architecture. Install
jekyll-seo-tag(title, description, canonical, OG, Twitter Card, JSON-LD) andjekyll-sitemap(sitemap.xml); les deux exigerurl:in_config.ymlor ils produce broken output. Utiliser clean permalinks (/:title/) over date-based ones pour evergreen content. Two GitHub Pages traps dominate: the plugin whitelist (GitHub builds with--safe; non-whitelisted plugins besoin a GitHub Actions construire) and a manquantbaseurlon project sites, qui breaks every generated URL canonique. GitHub Pages aussi pins spécifique plugin versions (3.10.0 core, olderjekyll-seo-tag/jekyll-sitemapreleases), pas simplement qui plugins run. Collections besoinoutput: trueor they’re jamais rendered. Drafts, future-dated posts, andpublished: falsedocuments are excluded from a normal construire, and--incrementalis experimental — don’t utiliser it pour production deploys. Androbots.txtn’est pas auto-generated — faire it yourself.
Pourquoi Jekyll’s static output is bon pour le SEO
Jekyll is a static site generator: it runs votre Markdown and Liquid templates via a construire step and emits finished HTML, une fois, avant quelconque requête. Que timing is the whole SEO advantage. Evidence for this claim Jekyll processes text and templates into static files during a build. Scope: Jekyll build architecture. Confidence: high · Verified: Jekyll documentation
Google’s pipeline is explorer → render → index, and rendering JavaScript is “a separate step” that sits in a queue — what people loosely call the “two-wave” traiter. Wave 1 récupère raw HTML and indexes text and liens immédiatement; Wave 2 queues lune page pour the Web Rendering Service to run JavaScript, “a few seconds to weeks” plus tard selon budget d’exploration. With Jekyll, Wave 1 déjà contient tout votre content — there’s aucun JavaScript requis to render the corps. Wave 1 = Wave 2. Aucun rendering delay, aucun rendering budget spent. Ce is the même argument que rend quelconque static site generator the lowest-risk architecture pour indexability.
The downstream benefits follow:
- Faster TTFB. Pre-built fichiers served from a CDN (GitHub Pages sits behind Fastly; Netlify/Vercel have leur propre edges) mean aucun database requêtes and aucun server processing — bon pour LCP and the rest of Core Web Vitals.
- Aucun requis JS payload pour content → meilleur FCP and LCP que a hydrating SPA.
- Proper Code d’état HTTPs at the CDN couche, pas client-side error handling.
But none of que changements the fundamentals: static sites encore besoin meta tags, sitemaps, URL canoniques, données structurées, and bon content. Jekyll’s output is crawler-friendly; the metadata is on vous.
GitHub Pages and Jekyll SEO
The la plupart courant Jekyll deployment is GitHub Pages — push to a branch with Pages enabled and GitHub auto-builds le site. Que convenience comes with SEO-relevant constraints.
Project sites vs. utilisateur/org sites — l’URL decision
username.github.io/repo-name(a project site) lives on a shared subdomain with thousands of autre unrelated sites. It fonctionne fine pour docs, demos, and personal projects où l’URL itself doesn’t besoin to carry votre brand.- A custom domain (point a
CNAMEat GitHub Pages) puts le site on une URL vous contrôler, with HTTPS auto-provisioned by GitHub. Pour a site où the domain itself matters — a business site, a blog you’re building an audience autour — a custom domain from the commencer avoids a domain migration plus tard.
Si vous expect to déplacer to a custom domain eventually, définir it up early. Quelconque
domain migration signifie 301 redirections (jekyll-redirect-from handles ce) and a
period où inbound liens and quelconque accumulated signals point at the old URL —
avoidable churn si vous pick the final domain up front plutôt que switching
plus tard. Ce is a migration-planning argument, pas a claim que a github.io
subdomain is penalized on its propre.
baseurl — the #1 canonical bug on project sites
Project sites live sous a subfolder (/repo-name/). Si vous don’t définir
baseurl: /repo-name in _config.yml, every URL canonique jekyll-seo-tag
generates — and votre lien internes — va be incorrect, manquant the subfolder. Ce is
the unique la plupart courant canonical-URL bug on Jekyll project sites. (Utilisateur/org sites
served at the domain root don’t besoin baseurl.)
The plugin whitelist
GitHub Pages runs Jekyll with the --safe flag and seulement permet a fixed définir of
plugins. Evidence for this claim GitHub Pages builds Jekyll in safe mode and supports a documented set of plugins. Scope: GitHub Pages hosted builds. Confidence: high · Verified: GitHub Pages: Jekyll plugins The SEO-relevant whitelisted ones:
jekyll-seo-tag✓jekyll-sitemap✓jekyll-redirect-from✓ (pour 301s quand vous modifier URLs)jekyll-paginate✓
Pas whitelisted (and silently won’t run, or va error):
jekyll-last-modified-at— nécessaire pour accurate sitemap<lastmod>from fichier timestamps- Custom structured-data plugins
- Anything dropped in a
_plugins/folder
It’s pas simplement qui plugins — it’s qui versions
GitHub Pages doesn’t seulement restrict qui plugins run; it pins the exact version
of chaque un, and que construire environment itself is pinned to an older Jekyll.
As of the dependency liste’s dernier
mettre à jour, the hosted construire runs Jekyll 3.10.0 with jekyll-seo-tag 2.8.0,
jekyll-sitemap 1.4.0, and jekyll-feed 0.17.0 — pendant que jekyllrb.com’s propre
docs décrire the current upstream release, 4.4.1. A behavior documented in a
plugin’s latest README isn’t guaranteed to exist in the version GitHub Pages
en réalité runs; vérifier pages.github.com/versions.json pour the pinned version
avant relying on a spécifique flag or output. A GitHub Actions construire sidesteps
ce aussi — vous contrôler the Gemfile, so vous obtenir the versions vous pin, pas
GitHub’s.
The GitHub Actions workaround
The fix pour the whitelist isn’t “add more gems” — it’s to arrêter letting GitHub do
the construire. Run Jekyll yourself in CI (actions/jekyll-build-pages, or construire
locally and push _site/ to the deploy branch with peaceiris/actions-gh-pages)
and the whitelist ne … plus s’applique. Now quelconque plugin runs, and vous pick the
Jekyll and plugin versions au lieu de inheriting GitHub’s pinned définir.
The jekyll-seo-tag plugin
Ce is the official, maintained plugin que covers la plupart of the core metadata
Jekyll doesn’t ajouter on its propre. Exactly ce que it emits dépend on qui version
vous have installed, votre _config.yml and front matter, and si votre
layout en réalité calls {% seo %} — GitHub Pages, pour instance, pins a spécifique
version plutôt que toujours shipping the latest release (plus on que ci-dessous).
Vérifier the avancé usage guide
pour votre version’s exact output, and confirmer ce que en réalité landed by grepping
votre propre construit HTML plutôt que assuming it’s complet.
Install:
# Gemfile
gem 'jekyll-seo-tag'# _config.yml
plugins:
- jekyll-seo-tag<!-- _layouts/default.html, before </head> -->
{% seo %}Ce que it generates automatically:
<title>— page title with site nom appended (Page Title | Site Name)<meta name="description">— fromdescription:front matter or le site description<link rel="canonical">— construit fromsite.url+page.url- Ouvrir Graph tags (
og:title,og:description,og:url,og:site_name,og:image) - Twitter Card tags (
twitter:card,twitter:title,twitter:description,twitter:creator,twitter:image) - JSON-LD données structurées (
BlogPostingpour posts,WebSitepour the home page) - Pagination meta (suivant/prev URLs)
Requis _config.yml settings — sans ces the plugin produces broken
output:
title: Your Site Title
description: Your site description
url: "https://yourdomain.com" # CRITICAL — drives canonical URL generation
author:
name: Patrick Stox
twitter: patrickstox
url: https://patrickstox.com # author disambiguation
twitter:
username: patrickstox
card: summary_large_imagePer-page front matter overrides:
---
title: "Jekyll SEO Guide"
description: "How to optimize Jekyll sites for search engines."
image:
path: /assets/jekyll-seo-og.png
width: 1200
height: 630
alt: "Jekyll SEO diagram"
canonical_url: "https://example.com/jekyll-seo/" # override if needed
robots: noindex # per-page noindex
seo:
type: BlogPosting # schema.org type override
date_modified: 2025-01-15 # dateModified override for JSON-LD
---Suppression (quand votre layout déjà outputs its propre):
{% seo title=false %} <!-- suppress the <title> -->
{% seo canonical=false %} <!-- suppress the canonical link -->Un gotcha worth flagging: nombreux minimal themes (notamment minima) ship sans
jekyll-seo-tag wired in. Ajout the gem to votre Gemfile ne fait pashing unless the
theme’s layout en réalité calls {% seo %}.
Sitemaps with jekyll-sitemap
Même install pattern (Gemfile + _config.yml). It generates a sitemaps.org-
compliant sitemap.xml at /sitemap.xml on every construire.
It exige url: in _config.yml — sans it, sitemap entries have aucun
domain.
Controlling <lastmod>, in priority order:
last_modified_at:in front matter (meilleur — explicit contrôler)- Post creation date (fallback — souvent incorrect pour evergreen content mis à jour plus tard)
- Filesystem modification date (nécessite the non-whitelisted
jekyll-last-modified-at)
Meilleur pratique: ajouter last_modified_at: YYYY-MM-DD to every post, and bump it
quand vous mettre à jour content — that’s the freshness signal recrawl prioritization leans
on.
Excluding pages:
# Per-page front matter
sitemap: false
# Global pattern (in _config.yml)
defaults:
- scope:
path: "assets/**/*.pdf"
values:
sitemap: falsePermalink configuration
Permalinks are définir globally in _config.yml or overridden par page in front matter.
| Style | Pattern | SEO notes |
|---|---|---|
date (par défaut) | /:categories/:year/:month/:day/:title.html | Date-heavy, fragile si the post date changements |
pretty | /:categories/:year/:month/:day/:title/ | Trailing slash, aucun .html |
none | /:categories/:title.html | Aucun date burial |
| Custom | /:title/ or /:categories/:title/ | La plupart contrôler — recommended pour evergreen content |
Recommended pour la plupart sites:
permalink: /:title/
# or
permalink: /:categories/:title/Pourquoi éviter date-based URLs pour evergreen posts:
- Modification a post’s
date:front matter changements its URL → inbound liens break. - Deep hierarchy (
/2019/03/14/post-title/) buries content pour aucun raison. - (Pour news and journalism, date URLs are fine and attendu — ce is a per-context appel, pas a universal rule.)
Collections besoin leur propre permalink config:
collections:
case_studies:
output: true
permalink: /case-studies/:name/A warning on modification patterns: une fois URLs are indexé, switching permalink
styles exige 301 redirections (utiliser jekyll-redirect-from). Skip the redirections and
vous break popularité des liens and generate 404s in Search Console.
Collections and SEO
Collections are Jekyll’s custom content types au-delà posts and pages — docs sections, portfolio items, team members, cas studies, FAQs. Two requirements faire or break leur SEO:
-
output: truedoit be définir. Sans it, collection documents are jamais rendered as individual HTML fichiers and therefore can’t be indexé. Ce is a silent indexation killer — le contenu exists in votre repo but jamais becomes a crawlable page.collections: docs: output: true # REQUIRED for indexable pages permalink: /docs/:name/ -
Chaque document nécessite front matter — même an vide
---block. Sans it, Jekyll treats the fichier as a binary static fichier: aucun Liquid processing, aucun metadata, aucunjekyll-seo-tagintegration.
Remarque que collections aren’t inclus in RSS feeds (seulement posts are). Pour grand documentation sites, collections are usually the correct structure anyway.
Publishing states and incremental builds
Jekyll has several independent switches que contrôler ce que en réalité ends up in the construit site. Mixing les up produces soit pages que silently jamais obtenir construit, or draft/future content que ships to production by accident:
- Drafts (
_drafts/) are excluded from a normal construire entirely. Ils seulement apparaître quand vous runbundle exec jekyll serve --drafts(orbuild --drafts) locally — moving a post into_posts/with a réel date is ce que en réalité publishes it. - Future-dated posts (a
date:plus tard que the current temps) are excluded by par défaut.future: truein_config.yml, or the--futureflag, inclut les — handy pour local preview, but leaving it on in a production config signifie scheduled posts go live the moment vous construire, pas on leur intended date. published: falsein front matter excludes a document from the construire regardless of its date — a separate switch from drafts and future posts, and facile to leave définir après testing une page vous meant to ship.- Incremental regeneration (
--incremental) is documented by Jekyll as experimental, and it tracks a limited dependency graph — mainly inclut and layouts. Une page que iteratessite.postsor autre collection données (a tag index, an archive, related-posts logic) peut go stale sous--incrementalsans Jekyll detecting que the underlying posts modifié. Don’t run it as partie of a production deploy; utiliser a completbundle exec jekyll buildpour anything you’re pushing live.
Avant trusting quelconque of ces, construire sans the flags vous utiliser locally
(--drafts, --future, --incremental) and confirmer the output in _site/
matches ce que vous intend to publish — the safest par défaut pour a deploy pipeline
is a clean, complet, non-incremental construire.
Custom head partials with Liquid
Quand jekyll-seo-tag isn’t suffisant, vous construire votre propre _includes/head.html:
<head>
<meta charset="UTF-8">
<title>
{% if page.title %}{{ page.title }} | {{ site.title }}
{% else %}{{ site.title }}{% endif %}
</title>
<meta name="description" content="
{%- if page.description -%}{{ page.description }}
{%- elsif page.excerpt -%}{{ page.excerpt | strip_html | strip_newlines }}
{%- else -%}{{ site.description }}
{%- endif -%}">
<link rel="canonical" href="{{ page.url | prepend: site.url }}">
{% seo %}
</head>Clé Liquid filters pour le SEO:
| strip_html— removes tags from an auto-excerpt (essential pour clean descriptions)| strip_newlines— removes line breaks from excerpts| truncate: 160— an optional template-side character cap, pas a Google limite. Préférer an authored, page-specific description and preview the rendered snippet; fit varies by requête, device, language, and script.| prepend: site.url— builds absolute URLs pour canonical and OG tags| date_to_xmlschema— ISO 8601 dates pour JSON-LDdatePublished/dateModified| default: fallback— fallback quand a variable is nil
Custom JSON-LD au-delà ce que jekyll-seo-tag emits:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": {{ page.title | jsonify }},
"datePublished": "{{ page.date | date_to_xmlschema }}",
"dateModified": "{{ page.last_modified_at | default: page.date | date_to_xmlschema }}",
"author": {
"@type": "Person",
"name": "{{ page.author.name | default: site.author.name }}",
"url": "{{ page.author.url | default: site.author.url }}"
}
}
</script>robots.txt n’est pas auto-generated
Jekyll fait pas créer robots.txt. Vous faire it yourself in le site root.
Inclure an vide front-matter block so Liquid processes the fichier (so {{ site.url }}
resolves):
---
---
User-agent: *
Allow: /
Sitemap: {{ site.url }}/sitemap.xmlSans ce, there’s aucun sitemap référence in robots.txt — and some robots d’exploration utiliser
que as a discovery mechanism. (robots.txt contrôle exploration, pas indexation —
pour the complet picture voir exploration.)
Courant Jekyll SEO myths
“Jekyll handles SEO automatically.” The static output is crawler-friendly, but metadata exige explicit setup. Par défaut themes souvent ship with aucun SEO tags at tout.
“GitHub Pages is fine for SEO — it’s free.” GitHub Pages itself is fine — the
static output is crawler-friendly regardless of host. The catches are the plugin
whitelist (and the spécifique versions it pins, pas simplement qui plugins) and,
si votre brand dépend on l’URL, deciding on a custom domain avant vous construire
an audience on github.io.
“Static sites don’t need sitemaps.” Google peut trouver pages via liens, but a
sitemap speeds discovery and carries <lastmod> signals. jekyll-sitemap rend it
trivial.
“Jekyll is dead.” It’s in mature maintenance mode — v4.4,1 shipped in January 2025. Minimal nouveau fonctionnalités, but maintained and secure, and GitHub Pages va prise en charge it indefinitely. Pour simple blogs and docs, it’s a solid, boring choice.
“I can use any plugin on GitHub Pages.” Aucun — --safe plus a fixed whitelist.
The fix is GitHub Actions, pas plus gems.
Où ce fits
Jekyll is un of the six generators in the static site generators cluster — the GitHub Pages par défaut and the un la plupart developers meet premier. Pour the broader context on how Google renders JavaScript and quand vous en réalité besoin it, voir the JavaScript SEO hub. The build-freshness discipline que s’applique to every SSG — a static site is seulement as current as its dernier construire — s’applique to Jekyll aussi: edits don’t reach moteur de recherches jusqu’à vous rebuild and redeploy.
AI summary
A condensed prendre on the Avancé version:
- Jekyll is a Ruby static site generator and the engine behind GitHub Pages. It emits flat HTML at construire temps, so content is in the raw réponse on the premier explorer — aucun JavaScript rendering step, aucun Wave 2 delay. That’s the core SEO advantage, shared by tout static site generators.
- The SEO fonctionner is configuration, pas architecture. Par défaut themes souvent have aucun SEO metadata at tout.
jekyll-seo-tag(official plugin) auto-generates title, description, canonical, Ouvrir Graph, Twitter Card, and JSON-LD (BlogPosting/WebSite). Ajouter{% seo %}to votre layout’s<head>. Overridable par page in front matter.jekyll-sitemapauto-generatessitemap.xml. Les deux plugins exigerurl:in_config.ymlor output is broken (canonical/sitemap point at localhost).- Permalinks: préférer
/:title/or/:categories/:title/over date-based URLs pour evergreen content (date URLs break si the post date changements). - Collections besoin
output: true(or they’re jamais rendered as pages) and front matter on chaque document (or aucun metadata processing). - Publishing states: drafts (
_drafts/), future-dated posts, andpublished: falsedocuments are tout excluded from a normal construire unless vous explicitly opt in (--drafts,--future).--incrementalis experimental and peut miss pages que depend onsite.posts— don’t utiliser it pour a production deploy. robots.txtn’est pas auto-generated — créer it manually (with vide front matter so Liquid resolves{{ site.url }}in theSitemap:line).- Two GitHub Pages traps: the plugin whitelist (
--safeconstruire; seulementjekyll-seo-tag,jekyll-sitemap,jekyll-redirect-from,jekyll-paginateamong SEO plugins — others besoin a GitHub Actions construire), and manquantbaseurlon project sites, qui breaks every URL canonique. GitHub Pages aussi pins spécifique plugin versions (e.g. Jekyll 3.10.0 core), qui peut trail the latest upstream release. - Si a custom domain matters to votre brand, définir it up early plutôt que on
username.github.io/repo— moving domains plus tard signifie 301s and a period où inbound liens point at the old URL. GitHub Pages aussi pins spécifique plugin versions (pas simplement qui plugins), qui peut trail the latest upstream release. - Construire freshness s’applique as to quelconque SSG: changements seulement reach search après a rebuild + redeploy.
Documentation officielle
Primary-source documentation — from Jekyll, its plugins, GitHub Pages, and the moteur de recherches.
Jekyll
- Jekyll docs — the documentation hub.
- Permalinks — the built-in styles and custom patterns.
- Front Matter — the YAML block que drives per-page metadata.
- Collections — custom content types and the
output: truerequirement. - Plugins — how Jekyll’s plugin system fonctionne.
- Variables — the
site/pagevariables and Liquid filters utilisé in head partials.
Official plugins
- jekyll-seo-tag — the metadata plugin, plus its avancé usage guide.
- jekyll-sitemap — automatic
sitemap.xml. - jekyll-redirect-from — 301 redirections quand vous modifier URLs.
GitHub Pages
- À propos de GitHub Pages and Jekyll — how the auto-build fonctionne.
- À propos de custom domains and GitHub Pages — the custom-domain setup.
- pages.github.com/versions.json — the live plugin whitelist and locked dependency versions.
- Jekyll releases and endoflife.date/jekyll — version and maintenance status.
Moteur de recherches
- JavaScript SEO basics — the explorer → render → index phases (two-wave rendering) que a static construire lets vous skip pour content.
- In-Depth Guide to How Recherche Google Fonctionne — où rendering sits in the pipeline.
- Core Web Vitals (web.dev) — the performances metrics a fast static site benefits from structurally.
Quotes from the source
Là are aucun on-record quotes from Google or Bing reps specifically à propos de Jekyll. Google doesn’t comment on individual static site generators. The SEO cas pour Jekyll rests on Google’s general rendering and static-HTML guidance, qui s’applique to quelconque static site.
Google — rendering is a separate, queued step (the chose Jekyll’s static output removes from the critical chemin)
- “During the crawl, Google renders the page and runs any JavaScript it finds using a recent version of Chrome.” — Recherche Google Central docs. With Jekyll, there’s aucun JavaScript nécessaire to render the corps, so ce step costs vous nothing. Jump to quote
- “Rendering is important because websites often rely on JavaScript to bring content to the page, and without rendering Google might not see that content.” — i.e., si votre content is déjà in the static HTML (as it is with Jekyll), rendering can’t cost vous visibility. Jump to quote
Jekyll SEO checklist
A scannable réussir to confirmer votre Jekyll site is définir up to rank:
-
url:is définir in_config.ymlto votre réel production domain (paslocalhost:4000). - Pour a GitHub Pages project site,
baseurl: /repo-nameis définir (skip on utilisateur/org root sites). -
jekyll-seo-tagis installed and the theme layout en réalité calls{% seo %}in the<head>. -
jekyll-sitemapis installed and/sitemap.xmlis generating. - Sitemap is submitted dans la recherche Google Console and Bing Webmaster Outils.
-
title:,description:, andauthor:are définir in_config.yml. - Chaque post/page has an explicit
description:(don’t rely on auto-excerpt). -
last_modified_at:is on posts and bumped quand content changements. - Permalinks utiliser
/:title/or/:categories/:title/pour evergreen content (pas the date par défaut). - A
robots.txtexists (with vide front matter) and références le sitemap. - Every collection que devrait be indexé has
output: true. - Every collection document has front matter (même an vide
---). - A custom domain is configuré (HTTPS auto-provisioned), pas the bare
github.iosubdomain. - URL/permalink changements are paired with
jekyll-redirect-from301s. - Images are compressed avant commit (Jekyll doesn’t optimize les at construire).
- Un trailing-slash convention is enforced via the permalink style (aucun
/page/vs/pageduplicates). - Production builds run sans
--draftsor--future, and aucun page vous intend to ship encore haspublished: false. - Production deploys utiliser a complet
bundle exec jekyll build, pas--incremental(experimental, and peut misssite.posts-dependent pages).
Jekyll SEO — cheat sheet
The two essential plugins
| Plugin | Fait | Whitelisted on GitHub Pages? | Nécessite |
|---|---|---|---|
jekyll-seo-tag | Title, description, canonical, OG, Twitter Card, JSON-LD | Yes ✓ | url:, {% seo %} in <head> |
jekyll-sitemap | Auto sitemap.xml | Yes ✓ | url: |
jekyll-redirect-from | 301 redirections | Yes ✓ | redirect_from: in front matter |
jekyll-last-modified-at | Filesystem <lastmod> | Aucun ✗ | GitHub Actions construire |
Requis _config.yml keys (or output breaks)
| Clé | Pourquoi |
|---|---|
url: | URL canoniques + sitemap entries; sans it → localhost |
baseurl: | Project sites sous /repo/ — sans it → broken canonicals |
title: / description: | Defaults pour jekyll-seo-tag |
author: | Author info in JSON-LD |
Permalink styles
permalink: valeur | Output | Utiliser pour |
|---|---|---|
date (par défaut) | /cat/2019/03/14/title.html | Éviter pour evergreen |
pretty | /cat/2019/03/14/title/ | Date-relevant content |
none | /cat/title.html | Aucun date burial |
/:title/ | /title/ | La plupart evergreen sites |
Fast facts
- Jekyll output is static HTML → aucun Wave 2 rendering delay; content in the premier récupérer.
robots.txtis PAS auto-generated — créer it (with vide front matter).- Collections besoin
output: trueand front matter, or ils don’t index. - GitHub Pages builds with
--safe+ a plugin whitelist — non-whitelisted plugins besoin a GitHub Actions construire. - Current upstream Jekyll: v4.4,1 (Jan 2025); GitHub Pages runs a locked
v3.10,0 with its propre pinned plugin versions (
jekyll-seo-tag2.8.0,jekyll-sitemap1.4.0,jekyll-feed0.17.0) — vérifier pages.github.com/versions.json pour the current liste. - Si a custom domain matters to votre brand, définir it up avant building an
audience on
username.github.io/repo— avoids a plus tard domain migration.
Construire and vérifier votre Jekyll site locally
Avant trusting production, construire locally and vérifier votre metadata is en réalité in the HTML.
macOS / Linux
# Install dependencies and serve locally (defaults to http://localhost:4000)
bundle install
bundle exec jekyll serve
# Build the production site into _site/ (override the dev url)
JEKYLL_ENV=production bundle exec jekyll build
# Confirm jekyll-seo-tag actually emitted a canonical + title into a built page
grep -i 'rel="canonical"' _site/index.html
grep -i "<title>" _site/index.html
# Confirm the sitemap was generated and points at your real domain (not localhost)
grep -i "<loc>" _site/sitemap.xml | headWindows (PowerShell)
# Install dependencies and serve locally
bundle install
bundle exec jekyll serve
# Build the production site (set the env var for this command)
$env:JEKYLL_ENV="production"; bundle exec jekyll build
# Confirm canonical + title made it into the built HTML
Select-String -Path _site\index.html -Pattern 'rel="canonical"'
Select-String -Path _site\index.html -Pattern "<title>"
# Confirm the sitemap was generated with your real domain
Select-String -Path _site\sitemap.xml -Pattern "<loc>" | Select-Object -First 10Si <loc> entries or the canonical montrer localhost:4000, votre url: isn’t définir (or
JEKYLL_ENV=production wasn’t applied) — fix _config.yml avant deploying.
A starter robots.txt pour Jekyll
Enregistrer ce as robots.txt in votre site root. The vide front-matter block is ce que
rend Liquid traiter the fichier so {{ site.url }} resolves:
---
---
User-agent: *
Allow: /
Sitemap: {{ site.url }}/sitemap.xml Outils pour Jekyll SEO
jekyll-seo-tag— the official metadata plugin (title, description, canonical, OG, Twitter Card, JSON-LD). The unique biggest SEO win pour a Jekyll site.jekyll-sitemap— official automaticsitemap.xml.jekyll-redirect-from— generate 301 redirections in front matter quand vous modifier permalinks.- GitHub Actions (
actions/jekyll-build-pages,peaceiris/actions-gh-pages) — construire Jekyll yourself to escape the GitHub Pages plugin whitelist and run quelconque plugin. - Recherche Google Console — vérifier le site, submit le sitemap, and watch indexation/coverage. Essential pour a nouveau Jekyll site.
- Bing Webmaster Outils — submit le sitemap (vous pouvez import credentials from GSC).
- View Source / Inspection d’URL — confirmer votre title, meta description, and canonical are in the raw HTML (ils devrait be, since Jekyll is static).
- PageSpeed Insights / web.dev — vérifier Core Web Vitals; a static Jekyll site devrait score bien, but unoptimized images are the courant drag.
Jekyll SEO mistakes to éviter
Concrete mistakes personnes en réalité faire setting up Jekyll pour search — prevention, pas diagnosis.
Leaving url: unset in _config.yml
Les deux jekyll-seo-tag and jekyll-sitemap construire absolute URLs from site.url.
Skip it and votre balise canonicals and sitemap <loc> entries soit point at
localhost:4000 (the dev par défaut) or come out with aucun domain at tout — that’s
URL canoniques and a sitemap que actively mislead robots d’exploration au lieu de helping
les. Do ce à la place: définir url: to votre réel production domain in
_config.yml avant the premier deploy, and grep the construit _site/ output pour
localhost to confirmer it didn’t leak via.
Skipping baseurl on a GitHub Pages project site
username.github.io/repo-name sites live sous a /repo-name/ subfolder. Si
baseurl: /repo-name isn’t définir, every URL canonique jekyll-seo-tag generates —
and votre lien internes — is manquant que subfolder, pointing at une URL que
doesn’t exist. Ce is the unique la plupart courant canonical-URL bug on Jekyll project
sites. Do ce à la place: définir baseurl: on project sites (utilisateur/org sites at
the domain root don’t besoin it), and spot-check a construit page’s canonical contre
its réel, live URL.
Assuming a collection is indexable sans output: true
Collections (docs sections, cas studies, team bios) are Jekyll’s custom content
type, but sans output: true in _config.yml, the documents are jamais
rendered as individual HTML fichiers — le contenu sits in votre repo and simply
jamais becomes a crawlable page. There’s aucun error, aucun warning, simplement pages que
jamais exist. Do ce à la place: définir output: true on every collection meant
to be public, and après a construire, confirmer the attendu HTML fichiers en réalité landed
in _site/.
En utilisant date-based permalinks pour evergreen content
The Jekyll par défaut permalink style (/:categories/:year/:month/:day/:title.html)
bakes the publish date into l’URL. Modifier the post’s date: front matter plus tard
— qui personnes do, souvent simplement to bump it pour a re-publish — and l’URL changements
with it, breaking every inbound lien and forcing a redirection cleanup vous didn’t
plan pour. Do ce à la place: utiliser /:title/ or /:categories/:title/ pour
evergreen posts; reserve date-based permalinks pour genuinely date-relevant
content comme news, où the date belongs in l’URL.
Trying to install a non-whitelisted plugin on GitHub Pages and expecting it to run
GitHub builds Jekyll with the --safe flag, qui silently skips or errors on
quelconque plugin outside a fixed whitelist — dropping a gem comme
jekyll-last-modified-at or a custom structured-data plugin into _plugins/
and pushing it ne fait pas faire it run on the par défaut GitHub Pages construire. Do ce
à la place: vérifier the plugin contre
pages.github.com/versions.json premier;
si it’s pas listed, construire with GitHub Actions (actions/jekyll-build-pages or a
local construire pushed via peaceiris/actions-gh-pages) au lieu de fighting the
whitelist.
Assuming Jekyll ships a robots.txt
Jekyll ne fait pas generate robots.txt — there’s aucun plugin toggle, aucun par défaut
fichier, nothing. A site with aucun robots.txt at tout isn’t broken pour indexation, but
it aussi has aucun Sitemap: référence pour robots d’exploration que utiliser robots.txt as a
discovery mechanism. Do ce à la place: créer robots.txt yourself in the
site root with an vide front-matter block (--- ---) so Liquid processes it
and {{ site.url }} resolves in the Sitemap: line.
Testez vos connaissances: Jekyll SEO
Five rapide questions on optimizing Jekyll sites pour search. Pick an réponse pour chaque, alors vérifier.
Ressources utiles
My writing
- JavaScript SEO: A Definitive Guide — rendering, DOM parity, and pourquoi static/prerendered output (comme Jekyll’s) is the low-risk fin of the spectrum.
- The Beginner’s Guide to SEO technique — où rendering architecture and sitemaps fit in the bigger picture.
My speaking
- How Search Fonctionne (SlideShare) — my walkthrough of exploration, rendering, indexation, and ranking. (My standing disclaimer s’applique: “This is my understanding of systems… not going to be 100% complete or accurate.”)
From autour the industry
- Jekyll docs — the Documentation officielle, notamment permalinks and collections.
- jekyll-seo-tag — the official metadata plugin and its avancé usage guide.
- jekyll-sitemap — the official sitemap plugin.
- À propos de GitHub Pages and Jekyll — GitHub’s propre docs on the construire traiter and constraints.
- pages.github.com/versions.json — the authoritative GitHub Pages plugin whitelist and locked versions.
- Recherche Google Central — JavaScript SEO basics — the rendering phases a static construire lets vous skip.
- CloudCannon — jekyll-seo-tag showcase — a practitioner walkthrough of the plugin.
Journal des modifications
Mis à jour le 27 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.
Mis à jour le 18 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.