15 Must-Have Jekyll Plugins for 2026
The essential Jekyll plugins every site needs — from SEO and sitemaps to image optimisation, search, and performance. All compatible with the latest Jekyll versions.
Jekyll’s plugin ecosystem is smaller than WordPress’s, but it has everything you need. These 15 plugins cover SEO, performance, content management, and quality of life — and all are compatible with the latest Jekyll 4.x releases.
How to Install Jekyll Plugins
Add plugins to your Gemfile:
group :jekyll_plugins do
gem "jekyll-seo-tag"
gem "jekyll-sitemap"
end
And to _config.yml:
plugins:
- jekyll-seo-tag
- jekyll-sitemap
Then run bundle install.
GitHub Pages note: GitHub Pages only supports a specific list of plugins. If you use GitHub Actions for deployment, you can use any plugin.
SEO Plugins
1. jekyll-seo-tag
What it does: Generates all the SEO meta tags you need — <title>, meta description, Open Graph, Twitter Cards, and JSON-LD structured data — automatically from your page’s front matter.
gem "jekyll-seo-tag"
Add {% seo %} to your <head>. That’s it. Essential for every Jekyll site.
2. jekyll-sitemap
What it does: Automatically generates a sitemap.xml at your site root. Submit it to Google Search Console to ensure all pages are indexed.
gem "jekyll-sitemap"
No configuration needed. Exclude pages with sitemap: false in front matter.
3. jekyll-feed
What it does: Generates an Atom feed at /feed.xml. Useful for RSS readers, and some search engines use feeds to discover new content faster.
gem "jekyll-feed"
4. jekyll-redirect-from
What it does: Creates 301 redirect pages for URLs that have changed. Essential when you rename posts or change your permalink structure.
gem "jekyll-redirect-from"
Usage in front matter:
redirect_from:
- /old/url/
- /another/old/url/
Content and Organisation Plugins
5. jekyll-archives
What it does: Automatically generates archive pages for categories, tags, and dates. Without this plugin, your tag links go nowhere.
gem "jekyll-archives"
# _config.yml
jekyll-archives:
enabled:
- categories
- tags
layouts:
category: archive-taxonomy
tag: archive-taxonomy
permalinks:
category: /category/:name/
tag: /tag/:name/
6. jekyll-paginate-v2
What it does: Pagination for posts, collections, or any data source. The v2 version is significantly more powerful than the deprecated jekyll-paginate.
gem "jekyll-paginate-v2"
# _config.yml
pagination:
enabled: true
per_page: 10
permalink: '/page/:num/'
title: ':title - page :num'
7. jekyll-toc
What it does: Generates a table of contents from your post’s headings automatically.
gem "jekyll-toc"
Usage in layout:
{{ content | toc_only }}
{{ content | inject_anchors }}
8. jekyll-last-modified-at
What it does: Reads a file’s Git commit history to set an accurate last_modified_at date. Useful for structured data and SEO freshness signals.
gem "jekyll-last-modified-at"
In templates:
Last updated: {{ page.last_modified_at | date: "%B %d, %Y" }}
Performance Plugins
9. jekyll-minifier
What it does: Minifies HTML, CSS, and JavaScript in your built site — reducing page size and improving load times.
gem "jekyll-minifier"
# _config.yml
jekyll-minifier:
compress_javascript: true
compress_css: true
remove_comments: true
10. jekyll-assets (or sassc)
What it does: For advanced CSS processing — Sass compiling, autoprefixing, and asset fingerprinting for cache-busting.
Built-in Sass support is usually sufficient for most sites:
# _config.yml
sass:
style: compressed
sourcemap: never
Images and Media
11. jekyll-picture-tag
What it does: Generates responsive <picture> elements with multiple image sizes and WebP conversion automatically.
gem "jekyll-picture-tag"
Usage in templates:
{% picture assets/images/hero.jpg alt="Hero image" %}
This generates a <picture> element with WebP sources, multiple sizes, and a fallback — everything Google PageSpeed loves.
12. jekyll-cloudinary
What it does: Integrates with Cloudinary for on-the-fly image resizing, format conversion, and CDN delivery.
Good choice if you have many images and want to optimise without managing them locally.
Development Quality of Life
13. jekyll-compose
What it does: Adds draft, post, and page commands to the Jekyll CLI for creating new content without manually typing front matter.
gem "jekyll-compose"
# Create a new post with pre-filled front matter
bundle exec jekyll post "My New Post"
# Create a draft
bundle exec jekyll draft "My Draft"
# Publish a draft
bundle exec jekyll publish _drafts/my-draft.md
14. jekyll-include-cache
What it does: Caches Liquid includes that don’t change between pages (navigation, sidebar, footer). Can dramatically speed up builds on large sites.
gem "jekyll-include-cache"
Replace {% include navigation.html %} with {% include_cached navigation.html %} for includes that don’t use page-specific variables.
15. html-proofer
What it does: Validates your built HTML — checks for broken links, missing alt text, invalid HTML, and missing images. Run it as part of your CI pipeline.
gem "html-proofer", group: :test
bundle exec htmlproofer ./_site --disable-external
Add to your GitHub Actions workflow to catch broken links before they go live.
Recommended Starter Set
For a new Jekyll site, install these five to get the most value immediately:
group :jekyll_plugins do
gem "jekyll-seo-tag"
gem "jekyll-sitemap"
gem "jekyll-feed"
gem "jekyll-paginate-v2"
gem "jekyll-redirect-from"
end
That covers SEO, content discovery, pagination, and URL management — the foundations of any real site.
Browse Jekyll themes on JekyllHub — all themes in our collection are tested with these plugins for compatibility.
References
Evaluating plugins before adding them
Every plugin you add to a Jekyll site is a build dependency — something that must be maintained, updated, and potentially replaced when it falls out of maintenance. Adding plugins thoughtlessly accumulates technical debt; choosing them carefully keeps your build reliable.
Before installing any plugin, check three things. First, look at the repository’s last commit date. A plugin with no commits in more than two years is a maintenance risk — not necessarily broken today, but likely to break when Ruby or Jekyll releases a major version. Second, check whether it is on the GitHub Pages allowlist if you are using the built-in Pages builder rather than GitHub Actions. Third, read the open issues for any reports of fundamental failures on the Jekyll version you are running.
Many plugins that were popular in the Jekyll 3.x era have not been updated for Jekyll 4.x. The key behavioural change in Jekyll 4 that broke some plugins was the switch to a more restrictive handling of front matter and plugin hooks. If a plugin’s README still shows Jekyll 3 in its installation instructions without a note about 4.x compatibility, test it carefully before adding it to a production site.
Writing custom plugins for site-specific needs
Jekyll’s plugin system is accessible to anyone who can write basic Ruby. Simple generator, converter, and filter plugins can be written in a few dozen lines and do not require any Ruby expertise beyond the ability to read the Jekyll source documentation.
The three most useful plugin types for site-specific needs are generators, filters, and hooks.
Generators create new pages or files at build time. A common use case: generating a JSON file containing all post metadata for use in client-side JavaScript, without embedding it in a Liquid template.
# _plugins/search_index_generator.rb
class SearchIndexGenerator < Jekyll::Generator
def generate(site)
posts = site.posts.docs.map do |post|
{
title: post.data['title'],
url: post.url,
excerpt: post.data['excerpt'].to_s.strip,
tags: post.data['tags'] || []
}
end
page = PageWithoutAFile.new(site, __dir__, '', 'search.json')
page.content = JSON.generate(posts)
page.data['layout'] = nil
site.pages << page
end
end
Liquid filters add custom transformation functions you can use with the pipe syntax. A reading time filter is a classic example:
# _plugins/filters.rb
module ReadingTimeFilter
def reading_time(input)
words = input.split.size
minutes = [(words / 200.0).ceil, 1].max
"#{minutes} min read"
end
end
Liquid::Template.register_filter(ReadingTimeFilter)
Use it in any template: {{ content | reading_time }}.
Hooks run code at specific points in the Jekyll build lifecycle. The most useful hook for most sites is :site, :post_write — it runs after all files have been written to _site/, and is the right place to run post-processing like image compression or sitemap validation.
Custom plugins live in the _plugins/ directory. Jekyll loads them automatically at build time. They are not available on GitHub Pages’ built-in builder (only allow-listed plugins are), but they work fully with GitHub Actions deployments.
Managing plugin compatibility in Gemfile.lock
The Gemfile.lock file pins every gem (including plugins) to a specific version, ensuring your build is reproducible across different machines and CI environments. This is a feature — you want consistent builds — but it means that plugin updates do not apply automatically.
Check for plugin updates periodically:
bundle outdated
This lists every gem with a newer version available. Review the changelog for each plugin before updating, especially for major version bumps. Then update selectively:
bundle update jekyll-seo-tag
Or update all gems at once (higher risk of unexpected changes):
bundle update
After any update, rebuild the site and check for build errors or visual regressions. Run bundle exec htmlproofer ./_site --disable-external to check for broken internal links introduced by the update.
Commit Gemfile.lock to your repository so all contributors use the same plugin versions. This prevents the “works on my machine” class of bugs where one contributor has a different plugin version than the CI environment.
Plugins vs built-in Jekyll features
Before reaching for a plugin, check whether Jekyll’s built-in capabilities already handle what you need. Jekyll 4.x includes more functionality than many developers realise.
Jekyll natively handles: Sass compilation (no plugin needed), feed generation via jekyll-feed which is already in most Gemfiles, relative and absolute URL filters via relative_url and absolute_url, post excerpts via page.excerpt, and basic collections. Pagination (via jekyll-paginate-v2), tag/category archives (via jekyll-archives), and image processing (via jekyll-picture-tag) legitimately require plugins.
For SEO specifically, jekyll-seo-tag is genuinely the right tool — writing all the meta tags manually is verbose and error-prone. But for analytics, dark mode, comments, and search, the implementation is typically pure HTML, CSS, and JavaScript — no plugin needed.
The principle: use plugins for things that genuinely require Ruby code running at build time (generating pages, transforming data structures, accessing the file system). Use HTML, CSS, and JavaScript for everything that can be handled in the browser or in Liquid templates.
This discipline keeps your build fast, your dependencies minimal, and your site easier to migrate to future Jekyll versions. Every unnecessary plugin is a future compatibility problem; every avoidable dependency is technical debt you do not need to carry.
Browse Jekyll themes on JekyllHub to see how production-quality themes implement these features — the best themes demonstrate clean plugin usage and serve as good references for your own plugin selection decisions.
Auditing your plugin list regularly
Every time you update your Gemfile, take a minute to audit which plugins are still necessary. Projects evolve — a plugin that solved a real problem six months ago may have been superseded by a simpler Liquid approach, or its functionality may now be built into a newer version of Jekyll itself. A lean plugin list means faster builds, fewer compatibility warnings when Ruby or Jekyll updates, and a cleaner Gemfile that new contributors can understand at a glance. The most robust Jekyll sites are usually the ones with the fewest dependencies, so treat each plugin as a deliberate choice rather than a permanent fixture.