Jekyll SEO Guide: How to Rank Higher on Google
A practical SEO guide for Jekyll sites — from jekyll-seo-tag setup to structured data, sitemaps, canonical URLs, Core Web Vitals, and content strategy.
Jekyll gives you a significant SEO head start over WordPress — no bloated plugins, no slow database queries, and near-perfect Core Web Vitals out of the box. But there are still specific things you need to configure to rank well. This guide covers everything.
Why Jekyll Is Already Good for SEO
Before diving into configuration, it helps to understand what you already have:
- Fast load times — Static HTML is served directly from a CDN with no server-side processing
- Clean HTML — No WordPress bloat, no unnecessary
<div>nesting - HTTPS by default — GitHub Pages, Netlify, and Cloudflare Pages all provide free SSL
- Mobile-friendly — Most Jekyll themes are responsive out of the box
These factors directly influence Google’s Core Web Vitals scores, which became a ranking factor in 2021.
Step 1: Install jekyll-seo-tag
jekyll-seo-tag is the foundation of Jekyll SEO. It automatically generates:
<title>tags- Meta descriptions
- Open Graph tags (for social sharing)
- Twitter Card tags
- JSON-LD structured data
Install:
# Gemfile
gem "jekyll-seo-tag"
# _config.yml
plugins:
- jekyll-seo-tag
Add to your layout (before </head>):
{% seo %}
Run bundle install, then bundle exec jekyll build. View source on any page — you should see a block of SEO meta tags generated automatically.
Step 2: Configure _config.yml for SEO
These settings feed jekyll-seo-tag:
# _config.yml
title: "Your Site Name"
description: "A clear, 150-character description of what your site is about."
url: "https://yourdomain.com"
baseurl: ""
author: "Your Name"
twitter:
username: yourhandle
card: summary_large_image
logo: /assets/images/logo.png
social:
name: Your Site Name
links:
- https://twitter.com/yourhandle
- https://github.com/yourusername
The url field is critical — it is used to build absolute URLs for canonical tags and Open Graph URLs.
Step 3: Optimise Every Post’s Front Matter
Each post should have these fields:
---
title: "How to Do X: A Complete Guide for 2026"
description: "A 150–160 character description that includes your target keyword and gives users a reason to click."
date: 2026-06-13
last_modified_at: 2026-06-13
image: /assets/images/blog/your-post-image.jpg
author: Your Name
tags:
- primary keyword
- secondary keyword
---
Title tips:
- Include your target keyword near the start
- Keep under 60 characters
- Add the year for freshness signals
- Use power words: “Complete”, “Guide”, “Fast”, “Free”
Description tips:
- 150–160 characters max
- Include your primary keyword naturally
- Write for humans, not bots — the description shows in search results
Step 4: Add a Sitemap
A sitemap tells Google about all the pages on your site.
# Gemfile
gem "jekyll-sitemap"
# _config.yml
plugins:
- jekyll-sitemap
Your sitemap is automatically generated at /sitemap.xml. Submit it to Google Search Console.
To exclude pages from the sitemap, add to their front matter:
sitemap: false
Step 5: Set Up Canonical URLs
Duplicate content confuses Google. Canonical URLs tell Google which version of a page is the authoritative one.
jekyll-seo-tag handles canonicals automatically using your url setting. Verify by checking the source of a built page for:
<link rel="canonical" href="https://yourdomain.com/your-post/" />
Step 6: Optimise for Core Web Vitals
Google uses Core Web Vitals as a ranking signal. The three metrics are:
- LCP (Largest Contentful Paint) — How fast the main content loads. Target: under 2.5 seconds.
- FID/INP (Interaction to Next Paint) — How responsive the page is to clicks. Target: under 200ms.
- CLS (Cumulative Layout Shift) — How much the layout shifts during load. Target: under 0.1.
Jekyll-specific improvements:
Preload fonts:
<link rel="preload" href="/assets/fonts/your-font.woff2" as="font" type="font/woff2" crossorigin>
Lazy load images:
<img src="image.jpg" loading="lazy" alt="Description" width="800" height="400">
Always include width and height attributes to prevent CLS.
Minify CSS: Add to _config.yml:
sass:
style: compressed
Defer JavaScript:
<script src="/assets/js/main.js" defer></script>
Step 7: Add Structured Data (Schema Markup)
Structured data helps Google understand your content and can earn rich snippets in search results.
jekyll-seo-tag adds basic Article schema. For more control, add JSON-LD directly to your post layout:
{% if page.layout == "post" %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "{{ page.title | escape }}",
"description": "{{ page.description | escape }}",
"datePublished": "{{ page.date | date_to_xmlschema }}",
"dateModified": "{{ page.last_modified_at | default: page.date | date_to_xmlschema }}",
"author": {
"@type": "Person",
"name": "{{ page.author | default: site.author }}"
},
"publisher": {
"@type": "Organization",
"name": "{{ site.title }}",
"logo": {
"@type": "ImageObject",
"url": "{{ site.url }}{{ site.logo }}"
}
}
}
</script>
{% endif %}
Step 8: Optimise Your Permalink Structure
Shorter, keyword-rich URLs rank better than long, dated ones.
Recommended:
# _config.yml
permalink: /blog/:title/
This gives you URLs like /blog/how-to-install-jekyll-theme/ instead of /2026/06/01/how-to-install-jekyll-theme/.
Avoid changing permalink structure on an existing site without setting up 301 redirects — changing URLs resets the SEO value those pages have accumulated.
Step 9: Internal Linking Strategy
Internal links distribute “link equity” across your site and help Google discover content.
Best practices:
- Link to related posts within your content using descriptive anchor text
- Add a “Related posts” section at the bottom of each post
- Link from high-traffic pages (homepage, popular posts) to newer content
In Jekyll, you can link to other posts using post_url:
[How to Install a Jekyll Theme]({% post_url 2026-06-01-how-to-install-jekyll-theme %})
This will throw a build error if the post doesn’t exist, which is helpful for catching broken links.
Step 10: Set Up Google Search Console
- Go to Google Search Console
- Add your property (use the URL prefix method)
- Verify ownership by adding a meta tag to your
<head>or uploading an HTML file - Submit your sitemap at
yourdomain.com/sitemap.xml - Wait 1–3 days for Google to crawl and index your site
Once indexed, use the Coverage report to find crawl errors and the Performance report to see which queries drive traffic.
Jekyll SEO Plugins Worth Using
| Plugin | Purpose |
|---|---|
jekyll-seo-tag |
Meta tags, Open Graph, Twitter Cards, JSON-LD |
jekyll-sitemap |
Auto-generated sitemap.xml |
jekyll-feed |
RSS feed for subscribers and search engines |
jekyll-redirect-from |
301 redirects when you change URLs |
jekyll-last-modified-at |
Accurate last_modified_at dates for structured data |
Content Strategy for Jekyll Sites
Technical SEO only gets you so far. Content quality is what drives rankings in 2026.
Target long-tail keywords — Instead of “Jekyll theme”, target “best Jekyll theme for portfolio 2026”. Lower competition, higher intent.
Answer questions completely — Google rewards comprehensive answers. If a topic has 5 sub-questions, answer all 5 in one post.
Update existing posts — Refreshing content with last_modified_at dates signals freshness to Google.
Build backlinks — Share posts in relevant communities (Reddit’s r/webdev, HackerNews, dev.to) to earn inbound links.
Jekyll’s clean HTML and fast load times give you a technical SEO advantage from day one. With the right configuration, you can outrank WordPress sites with far fewer resources.
Ready to start with a well-optimised Jekyll theme? Browse themes on JekyllHub →