Jekyll SEO
I'd always start a Jekyll site by installing jekyll-seo-tag before writing a single post, but the plugin alone won't fix duplicate titles or missing image optimisation.
Start here
- Install jekyll-seo-tag and jekyll-sitemap in your Gemfile, then place {% seo %} in your layout's <head> and run the build to generate metadata.
- Create a robots.txt that points to your sitemap and does not block /assets/ unless you understand which files you are excluding.
- Verify every page has a unique title and meta description by crawling your built site with Screaming Frog after each deploy.
- Optimise images with descriptive alt text and filenames, and use TinyPNG or similar before adding them to your project.
- Test your site on PageSpeed Insights and address any render-blocking resources; static Jekyll tends to score well but theme CSS can drag you down.
Plain-English take
Think of Jekyll SEO as giving each of your pages a name tag and a map. The name tag is the title and meta description that appear in search results. The map is the sitemap that tells Google where everything lives. Jekyll makes this easy because you set it once in a template, and every page inherits the same logic. No database, no server-side rendering — just a static file that gets built each time you push.
I prefer this approach over dynamic CMS setups because there is less to break, but it has its own traps. The biggest one is that you assume the plugin does all the work. In a project last year, I installed jekyll-seo-tag and forgot to check the output. Three months later I noticed that my pagination pages — /page/2, /page/3 — were all emitting the same title as the root page. That happened because the plugin was pulling the site title from the front matter I hadn’t overridden on those pages. A quick fix was to set title front matter on the pagination template. After that, organic impressions for those secondary pages increased by about 15% over six weeks.
The lesson is: the plugin is a time-saver, not a set-and-forget solution. You still need to audit the output. I run a crawler from [Screaming Frog](/screaming-frog/) after every major deploy to catch duplicate titles and missing descriptions. It takes ten minutes and prevents the kind of lazy SEO that static sites can slip into.
When it actually matters
You should care about Jekyll SEO in three specific scenarios. First, if you are launching a new Jekyll site and want it indexed quickly. Without a sitemap, Google has to discover pages by following links between them, which can take weeks for a large documentation site. Add jekyll-sitemap from day one and submit your sitemap to Google Search Console and [Bing Webmaster Tools](/bing-webmaster-tools/). That alone cut my initial indexing time from fourteen days to three.
Second, if you are migrating from a CMS like WordPress to Jekyll, you risk breaking existing titles, descriptions, and canonical URLs. I have seen people lose 40% of their organic traffic because the new site did not preserve the same meta tags. The rule is: run a [rank tracker](/rank-tracker/) before the migration, store the old titles, and replicate them in front matter for each post. Then check every redirected URL with a crawler.
Third, if you care about Core Web Vitals — and you should — Jekyll gives you a head start because it serves static files with no database queries. But that advantage disappears if your theme loads heavy JavaScript or large images. I run every Jekyll site through [PageSpeed Insights](/website-speed-test/) before launch and again after adding third-party scripts. In one case, removing a bloated font library moved my LCP from 3.2 seconds to 1.1 seconds, which took me from a red score to green. For image optimisation, I use a tool like TinyPNG before adding images to the assets folder, and I always write descriptive alt text in the markdown.
A decision rule: if you rely on JavaScript to render content, Jekyll might not be the best platform because your HTML pages are static. Keep the JS minimal and defer any non-critical scripts.
What I got wrong
I have made three mistakes with Jekyll SEO that I hope you avoid. The first was relying on jekyll-seo-tag to generate unique titles for every page. I assumed the plugin would pull the post title from the front matter automatically — which it does — but I had not realised that pages without explicit title front matter would fall back to the site title. That meant my about page, contact page, and tag archive pages all showed “My Site” as the title in search results. It took me six months to notice because I never bothered to check the HTML output. Now I add a title field to every page’s front matter and run a quick search for “<title>My Site” on the built site to catch strays.
Second, I blocked /assets/ in my robots.txt early on, thinking it kept my build files safe. But /assets/ contained my CSS and most of my images. Google stopped indexing images from the site, and the internal link value from those image pages was lost. I only caught it when I noticed a sudden drop in image search traffic. I changed the rule to allow everything except /_site/ and /vendor/, and image indexing returned within a month.
Third, I used a single meta description for the entire site in the layout’s default front matter. Every page inherited “A blog about web development” — which was generic and unattractive in snippets. After I wrote unique descriptions for each post and made sure they were under 160 characters, my click-through rate from search increased by roughly 20% over eight weeks. Using a rank tracker helped me correlate the description changes with CTR. All three mistakes share a root cause: I relied on the plugin to cover my laziness. Jekyll is fast and simple, but it still demands the same SEO discipline as any other platform — and that includes using a proper [SEO tool](/seo-tools/) to monitor your progress.
Next step
Quick answers
Does jekyll-seo-tag handle structured data?
No, it only outputs basic meta tags like title, description, canonical, and Open Graph. For structured data such as Article or FAQ schema, you need to add JSON-LD manually in your layout or use a separate plugin like jekyll-schema.
How do I set a custom meta description on a single page in Jekyll?
Add a description field in the page's front matter. The jekyll-seo-tag plugin will use it if present. Make sure your layout does not override it with a default value. You can verify by viewing the page source after a build.
Can I use jekyll-seo-tag with GitHub Pages?
Yes, jekyll-seo-tag is supported. GitHub Pages runs Jekyll in safe mode, but both jekyll-seo-tag and jekyll-sitemap are whitelisted. Just add them to your Gemfile and they will work on build.
What about hreflang tags for multilingual Jekyll sites?
jekyll-seo-tag does not output hreflang tags. You need to generate them manually using front matter with language variables, or use a plugin like jekyll-multiple-languages which includes configuration for SEO metadata.
Sources
Primary documentation is linked directly. Anything commercial is marked nofollow.
- Jekyll SEO Tag — Official documentation for the plugin that outputs title, description, canonical, and Open Graph tags.
- Jekyll Sitemap — Plugin source for generating sitemap.xml, which is critical for search engine discovery.
- Google Search Central — Authoritative source for technical SEO best practices that apply to Jekyll sites.
- Google SEO Starter Guide — Baseline SEO recommendations such as unique titles and mobile-friendliness.
- PageSpeed Insights — Used to measure LCP and other Core Web Vitals; helped me identify bloat from font libraries.
Notes from Callum Bennett.