Skip to main content

Series: A Plugin for Pelican

Build Status PyPI Version Downloads License

Series is a Pelican plugin that joins multiple posts into a series. Globally, it provides a list of all the series, and for each article it provides a list of all articles in the same series and links to the next and previous articles in the series.

Installation

This plugin can be installed via:

python -m pip install pelican-series

As long as you have not explicitly added a PLUGINS setting to your Pelican settings file, then the newly-installed plugin should be automatically detected and enabled. Otherwise, you must add series to your existing PLUGINS list. For more information, please see the How to Use Plugins documentation.

Usage

In order to mark reStructuredText-formatted posts as part of a series, use the :series: metadata:

:series:  NAME_OF_THIS_SERIES

Or, for Markdown-formatted content:

Series: NAME_OF_THIS_SERIES

The plugin collects all articles or pages belonging to the same series and provides series-related variables that you can use in your template.

Articles and pages

This plugin works both with articles and pages. As Pelican uses the specific variable article for article templates and page for page templates it is complicated to give examples that work for both cases. In the following documentation all example will mention article. (e.g. article.series, article.title) but the code works in the same way with page (e.g. page.series, page.title).

Article series and page series are created separately, so even if an article and a page have the same series they won't appear together.

Indexing

By default, articles in a series are ordered by date and then automatically numbered. Pages in a series are ordered by title and automatically numbered.

If you want to force a given order, specify :series_index: (reST) or series_index: (Markdown) in the article metadata, starting from 1. All articles with this enforced index are put at the beginning of the series and ordered according to the index itself. All the remaining articles come after them, ordered with the default ordering (date for articles and title for pages).

The plugin provides the following variables to your templates:

  • article.series.name is the name of the series as specified in the article metadata
  • article.series.index is the index of the current article inside the series
  • article.series.all is an ordered list of all articles in the series (including the current one)
  • article.series.all_previous is an ordered list of the articles published before the current one
  • article.series.all_next is an ordered list of the articles published after the current one
  • article.series.previous is the previous article in the series (a shortcut to article.series.all_previous[-1]) or None for the first article
  • article.series.next is the next article in the series (a shortcut to article.series.all_next[0]) or None for the last one

For example:

{% if article.series %}
    <p>This post is part {{ article.series.index }} of the "{{ article.series.name }}" series:</p>
    <ol class="parts">
        {% for part_article in article.series.all %}
            <li {% if part_article == article %}class="active"{% endif %}>
                <a href='{{ SITEURL }}/{{ part_article.url }}'>{{ part_article.title }}</a>
            </li>
        {% endfor %}
    </ol>
{% endif %}

Global Context

Warning: in version 3 the global key series has been renamed to article_series to differentiate it from the new global key page_series.

The plugin also adds the keys article_series and page_series to the global context. They are dictionaries of all series names (as keys) and items (as values). You can use that to list all the series in your site, for example

{% for series_name, series_articles in article_series.items() %}
{% set article = series_articles[0] %}
<article class="card">
	<a href="{{ article.url }}" class="image">
		<img src="/images/{{ article.image }}.jpg" alt="{{ article.image }}" />
	</a>
	<div class="card-body">
    	<a href="{{ article.url }}"><h3 class="card-title">{{ series_name }}</h3></a>
     	<ul class="actions">
     		<li><a href="{{ article.url }}" class="button">Start</a></li>
     	</ul>
	</div>
</article>
{% endfor %}

As it is not possible to create pages from plugins you can leverage it to create a page for a specific series, even though you have to hard code the name of the series in the template.

Contributing

Contributions are welcome and much appreciated. Every little bit helps. You can contribute by improving the documentation, adding missing features, and fixing bugs. You can also help out by reviewing and commenting on existing issues.

To start contributing to this plugin, review the Contributing to Pelican documentation, beginning with the Contributing Code section.

License

This project is licensed under the AGPL 3.0 license.

Release files for pelican-series 3.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pelican-series 3.1.1
File Size Uploaded
pelican_series-3.1.1.tar.gz 6.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pelican-series 3.1.1
File Interpreter ABI Platform
pelican_series-3.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 14.6 kB

Release files / pelican_series-3.1.1.tar.gz

Download URL pelican_series-3.1.1.tar.gz
Size 6.5 kB
Tags Source
SHA-256 checksum
How to use checksums
0609d90729f6f5508e7357316106c4893217ba3f17539c1dfd9d6005307f9892
BLAKE2b-256 checksum
How to use checksums
518d7f04ad7bb0115879e47bfbcf307144102d41dd05047330e7ee63d75c7b49
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 4, 2026.

Transparency log

Release files / pelican_series-3.1.1-py3-none-any.whl

Download URL pelican_series-3.1.1-py3-none-any.whl
Size 8.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4f9134a6466ca50c3f4742a3b902fddd2a3c5421fabc32ac8cafcaf3f5246cc7
BLAKE2b-256 checksum
How to use checksums
5e25b5f116569f010d83ab15ee7b95d56ad425184ec3bf872d366b3acad93dc3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 4, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

3.1.1 This release

2 release files

3.1.0

2 release files

3.0.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.0.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page