How to Set Up a Multi-Author Jekyll Blog
A step-by-step guide to building a multi-author Jekyll blog — author profiles, per-post attribution, author archive pages, and avatars.
Jekyll does not have user accounts or a login system, but it handles multiple authors elegantly using collections. You define each author as a data file or collection document, reference them by name in post front matter, and Jekyll takes care of the rest. Here is how to do it properly.
The two approaches
There are two common ways to handle authors in Jekyll:
Approach 1: _data/authors.yml — A single YAML file with all authors. Simple, no extra pages generated.
Approach 2: _authors/ collection — A separate Markdown file per author. Generates individual author archive pages.
If you want dedicated author pages (e.g. /authors/marcus-webb/) showing all their posts, use the collection approach. If you just need a name and avatar on posts with no archive pages, use the data file.
This guide covers the full collection approach.
Step 1: Create the _authors collection
Add the collection to _config.yml:
collections:
authors:
output: true
permalink: /authors/:slug/
Step 2: Create author files
Create a file for each author in _authors/:
# _authors/marcus-webb.md
---
name: "Marcus Webb"
slug: marcus-webb
avatar: https://i.pravatar.cc/150?u=marcus-webb
bio: "Developer and technical writer passionate about open source tools and the modern web."
github: marcuswebb
twitter: marcuswebb
website: https://marcuswebb.io
---
The filename (without .md) becomes the slug — marcus-webb.md creates the author at /authors/marcus-webb/.
Step 3: Reference authors in post front matter
In each post, set the author field to the author’s display name:
---
layout: post
title: "How to Set Up a Multi-Author Jekyll Blog"
date: 2026-07-10
author: Marcus Webb
---
Step 4: Create the author layout
Create _layouts/author.html to display the author profile and their posts:
---
layout: default
---
<div class="author-profile">
<img src="{{ page.avatar }}" alt="{{ page.name }}" class="author-avatar">
<h1>{{ page.name }}</h1>
<p>{{ page.bio }}</p>
{% if page.twitter %}
<a href="https://twitter.com/{{ page.twitter }}">@{{ page.twitter }}</a>
{% endif %}
{% if page.github %}
<a href="https://github.com/{{ page.github }}">GitHub</a>
{% endif %}
</div>
<h2>Posts by {{ page.name }}</h2>
{% assign author_posts = site.posts | where: "author", page.name %}
{% for post in author_posts %}
<article>
<h3><a href="{{ post.url | relative_url }}">{{ post.title }}</a></h3>
<time>{{ post.date | date: "%B %-d, %Y" }}</time>
<p>{{ post.description }}</p>
</article>
{% endfor %}
Step 5: Display the author on each post
In _layouts/post.html, look up the author from the collection:
{% assign author = site.authors | where: "name", page.author | first %}
{% if author %}
<div class="post-author">
<img src="{{ author.avatar }}" alt="{{ author.name }}" class="post-author__avatar">
<div class="post-author__info">
<a href="{{ author.url | relative_url }}" class="post-author__name">{{ author.name }}</a>
<p class="post-author__bio">{{ author.bio }}</p>
</div>
</div>
{% elsif page.author %}
<div class="post-author">
<span class="post-author__name">{{ page.author }}</span>
</div>
{% endif %}
The {% elsif page.author %} fallback handles posts where the author string does not match any author file — useful during migration.
Step 6: Create an authors listing page
Create _pages/authors.html:
---
layout: default
title: "Authors"
permalink: /authors/
---
<div class="authors-grid">
{% for author in site.authors %}
<div class="author-card">
<img src="{{ author.avatar }}" alt="{{ author.name }}">
<h3><a href="{{ author.url | relative_url }}">{{ author.name }}</a></h3>
<p>{{ author.bio }}</p>
{% assign post_count = site.posts | where: "author", author.name | size %}
<p>{{ post_count }} posts</p>
</div>
{% endfor %}
</div>
Showing post counts per author
To show how many posts each author has written, use the where filter and size:
{% assign author_posts = site.posts | where: "author", author.name %}
<span>{{ author_posts | size }} articles</span>
Using author slugs instead of names
If you prefer to match on a slug (more robust to name formatting):
In post front matter:
---
layout: post
author: marcus-webb
---
In your layout, look up by the slug field:
{% assign author = site.authors | where: "slug", page.author | first %}
Displaying author in post metadata
A typical post meta line with author:
<div class="post-meta">
<time>{{ page.date | date: "%B %-d, %Y" }}</time>
{% if author %}
· <a href="{{ author.url | relative_url }}">{{ page.author }}</a>
{% else %}
· {{ page.author }}
{% endif %}
· {{ content | number_of_words }} words
</div>
Tips for managing multiple authors
Consistent naming: The where filter does an exact string match. "Marcus Webb" and "marcus webb" are different values. Decide on a format and stick to it — or use slugs to avoid case sensitivity issues.
Guest authors: For one-off guest posts, you do not need a full author file. Just set author: "Jane Smith" in the post front matter. The fallback in your layout will display the name without a profile link.
Author-specific RSS feeds: Advanced but useful — generate a separate feed per author by looping through site.authors and filtering posts.
That is all you need for a fully functional multi-author Jekyll blog with individual author pages, post attribution, and post counts.