Skip to main content

pelican-random-article

pelican-random-article is a Pelican plugin that automatically generates a /random page.
Visiting /random instantly redirects the reader to a randomly chosen article — just like wiwi.blog/random.

Features

  • Generates a static random/index.html page at build time.
  • Picks a random article client-side using JavaScript — no server required.
  • Works with any Pelican theme; no template changes needed.
  • Configurable output path via pelicanconf.py.

Installation

pip install pelican-random-article

Or with uv:

uv add pelican-random-article

Usage

1. Enable the plugin in pelicanconf.py

PLUGINS = [
    # ... your other plugins ...
    "pelican.plugins.random_article",
]

Point any link to /random (or wherever RANDOM_ARTICLE_SAVE_AS points):

<a href="{{ SITEURL }}/random/">Random</a>

3. Build your site

pelican content

The plugin will write output/random/index.html automatically.

Configuration

Add these to pelicanconf.py to customise the output path:

# Default values shown below
RANDOM_ARTICLE_SAVE_AS = "random/index.html"

Note: RANDOM_ARTICLE_URL is not consumed by the plugin itself —
it is only needed if you want Pelican's link helpers to resolve /random.
Set it to match RANDOM_ARTICLE_SAVE_AS:

RANDOM_ARTICLE_URL = "random/"
RANDOM_ARTICLE_SAVE_AS = "random/index.html"

Custom template

By default the plugin renders a small built-in HTML/JS template. To use your own Jinja2 template instead, point RANDOM_ARTICLE_TEMPLATE at a file path:

RANDOM_ARTICLE_TEMPLATE = "themes/mytheme/templates/random.html"

The template is rendered with these variables:

  • SITENAME – your site's SITENAME setting (HTML-escaped).
  • SITEURL – your site's SITEURL setting (HTML-escaped).
  • article_urls_json – a JSON array of the selected article URLs, pre-marked safe for embedding directly inside a <script> block (not HTML-escaped).

If RANDOM_ARTICLE_TEMPLATE is unset, the built-in template is used.

Excluding articles

Articles can be excluded from the random pool via any combination of:

# Exclude articles whose category is in this list
RANDOM_ARTICLE_EXCLUDE_CATEGORIES = ["Meta", "Drafts"]

# Exclude articles that carry any of these tags
RANDOM_ARTICLE_EXCLUDE_TAGS = ["no-random", "wip"]

Individual articles can also opt out via metadata, e.g.:

:random: false
Random: false

which becomes article.random and, if falsy, excludes that article. All three settings are optional and default to no exclusion; they combine with the plugin's existing "published only" filter.

How it works

At build time the plugin:

  1. Connects to Pelican's article_generator_finalized signal.
  2. Collects all published article URLs.
  3. Renders a tiny HTML page that contains the full URL list as a JSON array.
  4. On page load, JavaScript picks a random entry and calls window.location.href.

Because the redirect happens client-side, the page is completely static and
requires no server-side logic.

Requirements

  • Python >= 3.10
  • Pelican >= 4.5
  • Jinja2 (bundled with Pelican)

License

MIT License © Wei Lee

Metadata

Release files for pelican-random-article 0.3.0

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-random-article 0.3.0
File Size Uploaded
pelican_random_article-0.3.0.tar.gz 5.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pelican-random-article 0.3.0
File Interpreter ABI Platform
pelican_random_article-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 11.0 kB

Release files / pelican_random_article-0.3.0.tar.gz

Download URL pelican_random_article-0.3.0.tar.gz
Size 5.2 kB
Tags Source
SHA-256 checksum
How to use checksums
c333a628451cb72afd9c8a64b985781eb02623955206f890653ba12b70eac05a
BLAKE2b-256 checksum
How to use checksums
69675aa5606ba4f671b95ba4a7daa336baab4f2bc360325bd09508e7c66af8ba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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 Jul 13, 2026.

Transparency log

Release files / pelican_random_article-0.3.0-py3-none-any.whl

Download URL pelican_random_article-0.3.0-py3-none-any.whl
Size 5.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0264f49ce3d57b4c945fd3fa461fe60f0890109d8a301ea67e715d2d7d3420e5
BLAKE2b-256 checksum
How to use checksums
db8dad8e091706fd14631b9308a6864db3036c9a7e95c72a5c3eecc7c5aefd8b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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 Jul 13, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.1

2 release files

0.2.0

2 release files

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