---
layout: step
title: Collections
position: 9
---
Let's look at fleshing out authors so each author has their own page with a
blurb and the posts they've published.
To do this you'll use collections. Collections are similar to posts except the
content doesn't have to be grouped by date.
## Configuration
To set up a collection you need to tell Jekyll about it. Jekyll configuration
happens in a file called `_config.yml` (by default).
Create `_config.yml` in the root with the following:
```yaml
collections:
authors:
```
To (re)load the configuration, restart the jekyll server. Press `Ctrl`+`C` in your terminal to stop the server, and then `jekyll serve` to restart it.
## Add authors
Documents (the items in a collection) live in a folder in the root of the site
named `_*collection_name*`. In this case, `_authors`.
Create a document for each author:
`_authors/jill.md`:
```markdown
---
short_name: jill
name: Jill Smith
position: Chief Editor
---
Jill is an avid fruit grower based in the south of France.
```
`_authors/ted.md`:
```markdown
---
short_name: ted
name: Ted Doe
position: Writer
---
Ted has been eating fruit since he was baby.
```
## Staff page
Let's add a page which lists all the authors on the site. Jekyll makes the
collection available at `site.authors`.
Create `staff.html` in the root directory and iterate over `site.authors` to output all the staff:
{% raw %}
```liquid
---
layout: default
title: Staff
---
Staff
```
{% endraw %}
Since the content is markdown, you need to run it through the
`markdownify` filter. This happens automatically when outputting using
{% raw %}`{{ content }}`{% endraw %} in a layout.
You also need a way to navigate to this page through the main navigation. Open
`_data/navigation.yml` and add an entry for the staff page:
```yaml
- name: Home
link: /
- name: About
link: /about.html
- name: Blog
link: /blog.html
- name: Staff
link: /staff.html
```
## Output a page
By default, collections do not output a page for documents. In this case we
want each author to have their own page so let's tweak the collection
configuration.
Open `_config.yml` and add `output: true` to the author collection
configuration:
```yaml
collections:
authors:
output: true
```
Restart the jekyll server once more for the configuration changes to take effect.
You can link to the output page using `author.url`.
Add the link to the `staff.html` page:
{% raw %}
```liquid
---
layout: default
title: Staff
---
Staff
```
{% endraw %}
Just like posts you'll need to create a layout for authors.
Create `_layouts/author.html` with the following content:
{% raw %}
```liquid
---
layout: default
---
{{ page.name }}
{{ page.position }}
{{ content }}
```
{% endraw %}
## Front matter defaults
Now you need to configure the author documents to use the `author` layout. You
could do this in the front matter like we have previously but that's getting
repetitive.
What you really want is all posts to automatically have the post
layout, authors to have author and everything else to use the default.
You can achieve this by using [front matter defaults](/docs/configuration/front-matter-defaults/)
in `_config.yml`. You set a scope of what the default applies to, then the
default front matter you'd like.
Add defaults for layouts to your `_config.yml`,
```yaml
collections:
authors:
output: true
defaults:
- scope:
path: ""
type: "authors"
values:
layout: "author"
- scope:
path: ""
type: "posts"
values:
layout: "post"
- scope:
path: ""
values:
layout: "default"
```
Now you can remove layout from the front matter of all pages and posts. Note
that any time you update `_config.yml` you'll need to restart Jekyll for the
changes to take effect.
## List author's posts
Let's list the posts an author has published on their page. To do
this you need to match the author `short_name` to the post `author`. You
use this to filter the posts by author.
Iterate over this filtered list in `_layouts/author.html` to output the
author's posts:
{% raw %}
```liquid
---
layout: default
---
{{ page.name }}
{{ page.position }}
{{ content }}
Posts
{% assign filtered_posts = site.posts | where: 'author', page.short_name %}
{% for post in filtered_posts %}
- {{ post.title }}
{% endfor %}
```
{% endraw %}
## Link to authors page
The posts have a reference to the author so let's link it to the author's page.
You can do this using a similar filtering technique in `_layouts/post.html`:
{% raw %}
```liquid
---
layout: default
---
{{ page.title }}
{{ page.date | date_to_string }}
{% assign author = site.authors | where: 'short_name', page.author | first %}
{% if author %}
- {{ author.name }}
{% endif %}
{{ content }}
```
{% endraw %}
Open up http://localhost:4000 and
have a look at the staff page and the author links on posts to check everything
is linked together correctly.
In the next and final step of this tutorial, we'll add polish to the site and
get it ready for a production deployment.