Integrate Jekyll with Strapi to build fast, scalable static websites with seamless content management, combining Jekyll’s performance with Strapi’s dynamic content capabilities

Jekyll works as your website's production line; it takes raw ingredients (your Markdown content), processes them through templates, and delivers a fully baked static website. This differs from traditional content management systems that generate pages dynamically with each visit.
The Jekyll documentation explains that Jekyll sites are just HTML, CSS, and JavaScript files—no database, comment moderation, or security updates are needed. This simple approach offers major advantages:
Developers appreciate Jekyll for its straightforward approach and flexibility. It powers GitHub Pages and countless developer blogs, documentation sites, and portfolios where speed, security, and simplicity matter most.
While Jekyll excels at generating fast static sites, it lacks user-friendly content management for non-technical users. This is where Strapi, an open-source headless CMS, comes in. Strapi provides a friendly admin interface for content creation, perfectly complementing Jekyll's static site generation.
Integrating Jekyll with Strapi offers:
Strapi brings key features to Jekyll:
Strapi’s continuous updates and new features make this pairing even more powerful. Together, they create a fast, secure, and scalable Jamstack solution with straightforward content management.
Integrating Strapi with Jekyll delivers outstanding performance:
Combining Strapi with Jekyll gives you powerful content management paired with efficient static site generation. Let's walk through how to get them working together.
npx create-strapi-app my-project --quickstartgem install jekyll bundler
jekyll new my-blog
cd my-blogjekyll-strapi plugin to your Gemfile:group :jekyll_plugins do
gem "jekyll-feed", "~> 0.12"
gem "jekyll-strapi"
endbundle install to install the new dependencies._config.yml:plugins:
- jekyll-feed
- jekyll-strapi
strapi:
endpoint: http://localhost:1337/api
collections:
articles:
type: articlesWith the integration complete, Jekyll can now fetch content from Strapi at build time. Here's how to use this content in your templates:
_layouts/post.html:liquidlayout: defaulttitle: "{{ page.title }}"-{{ page.content }}_layouts/post.html:
```liquid
layout: default
title: "{{ page.title }}"
-
{{ page.content }}```liquid
layout: default
title: "Articles"
{% for article in strapi.articles %}
[{{ article.title }}]({{ article.url }})
{% endfor %}bundle exec jekyll buildRemember that content changes in Strapi won't automatically update your Jekyll site. To automate this process and publish content with Strapi efficiently, consider setting up a webhook in Strapi to trigger a rebuild of your Jekyll site (e.g., on Netlify or GitHub Pages) whenever content changes.
Let's look at a real example showing how integrating Jekyll with Strapi works in action: a simple blog that brings these tools together.
The Simple Jekyll blog powered by Strapi repository shows a complete blog implementation using both technologies. It's organized into two clear parts:
This setup keeps content management and presentation separate; writers focus on writing while developers handle the technical implementation.
jekyll-strapi plugin connects these two systems seamlessly.The repo guides you through the implementation step by step:
jekyll-strapi plugin to your Gemfile and Jekyll configuration:plugins:
- jekyll-feed
- jekyll-strapi_config.yml:strapi:
endpoint: http://localhost:1337/api
collections:
articles:
type: articlesnpx create-strapi-app backend --template https://github.com/strapi/strapi-template-blogcd frontend
bundle install
bundle exec jekyll serveThis example shows how you can use this combination to build:
Exploring this project will help you learn how to build modern websites that provide both flexible content management and the performance benefits of static sites.
If you have any questions about Strapi 5 or just would like to stop by and say hi, you can join us at Strapi's Discord Open Office Hours, Monday through Friday, from 12:30 pm to 1:30 pm CST: Strapi Discord Open Office Hours.
For more details, visit the Strapi documentation and the Jekyll documentation.
Use the jekyll-strapi plugin to fetch content from Strapi's API during Jekyll's build process. Configure your _config.yml with Strapi's endpoint URL and specify which content types to retrieve for static page generation.
Yes, Jekyll generates static HTML files at build time. Set up webhooks in Strapi that trigger Jekyll rebuilds when content is created, updated, or deleted to keep your static site current.
In Strapi's admin panel, navigate to Settings > Roles > Public and enable find and findOne permissions for the content types Jekyll needs to access. This allows unauthenticated API requests during builds.
Yes, Strapi serves media files through URLs that Jekyll can reference directly. Configure your Jekyll templates to use the full Strapi URL for images and other media assets stored in Strapi's library.
Deploy Jekyll to static hosts like Netlify, GitHub Pages, or Cloudflare Pages while hosting Strapi separately (Strapi Cloud, Heroku, or DigitalOcean). Use webhooks to trigger static site rebuilds when CMS content changes.