Home Blog How to Set Up a Multi-Author Jekyll Blog
Tutorial

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.

How to Set Up a Multi-Author Jekyll Blog

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.

Share LinkedIn