- Breaking: Drop support for Python 3.9 and 3.10. The floor is now Python 3.11.
- Breaking: Remove jQuery,
magnific-popupandmglass, and the image auto-zoom they powered. - Breaking: Only support native Pygments syntax highlighting. The legacy
.codehiliteclass is no longer styled. - Breaking: Remove inlining and minification of JavaScript assets, and the unmaintained
closuredependency they relied on. - Add 14 Pygments styles, including
dracula,github-dark,gruvbox-darkandnord. Remove thestataone. - Wrap the header, navigation bar and footer of
base.htmlin overridableheader,navandfooterblocks, and givepage.htmlapage_contentblock. - Support Pelican's own
ANALYTICSsetting, holding whatever markup an analytics provider hands you.GOOGLE_ANALYTICSstill emits itsgtag.jssnippet. - Add a collapsible generation details block in the footer, listing the Pelican and Plumage versions. The latter is exposed as a new
PLUMAGE_VERSIONtemplate variable. - Add a meta description, taken from the entry's
Description:metadata or its summary, withSITESUBTITLEstanding in site-wide. - Advertise translations to crawlers, with
hreflangon the<head>links and the visible ones alike. - Show when an article was last modified, next to the date it was published.
- Show a site's pages, or a short notice, on an index with no article to list.
- Serve every third-party asset from the site rather than from a CDN, declared in
plumage/package.jsonso Dependabot bumps them. A newsync-vendored-assetsjob refreshes the copies, which had been frozen wherever they were first written. - Require Pelican 4.11, and develop against 4.12. A 4.12 floor is uninstallable while
pelican-myst-readercapsmyst-parserbelow5.0.0, holdingdocutilsunder the0.22that 4.12 needs. - Replace every
~=requirement with>=, so no dependency carries an upper bound any more. - Switch from Poetry to
uv, and build with theuv_buildbackend. Droppingnode_modulesfrom the distribution shrinks the wheel from 17.4 MB to 0.4 MB. - Declare the test dependencies as a PEP 735 group, so neither
plumage[test]norplumage[djlint]is published to PyPI. - Declare the license as an SPDX expression, and ship the license file in the package.
- Update the webassets pipeline's Node dependencies: Bootstrap to
5.3.8, PostCSS to8.5.25, Autoprefixer to10.5.4andpostcss-clito11.0.1. The PostCSS8.5series closes an XSS through an unescaped</style>. - Move analytics code just below the
<head>element, and all other JavaScript to the bottom of the page. - Mark up dates with
<time datetime>instead of<abbr title>.titlestill carries the timestamp, so the hover tooltip is unchanged. - Announce the current navigation entry with
aria-current, in place of a visually-hidden label. - Follow the color scheme in the page surround, the footer, heading shadows and the avatar, instead of the light-mode values they hard-coded.
- Fix syntax highlighting silently not applying to code blocks. The MyST reader's docutils renderer omits the
.highlightcontainer every Pygments stylesheet selects through, so highlighting no longer depends on whether a page happens to carry an intra-site link. - Fix the build crashing on an article with no category, which Pelican 4.12.0 made reachable by binding the name to
Noneinstead of leaving it out. - Fix every page of a multilingual site being labelled with
DEFAULT_LANG. Thelangattribute now sits in anhtml_langblock the content templates override. - Fix the navigation bar never highlighting the current category.
- Fix the paginator emitting a whitespace-only
relattribute on pages carrying no link relation. - Fix the
full-widthlayout: the main content now spans all 12 columns, and the block above it lines up with it instead of being capped at half width. - Fix the search box icon, left behind by the Font Awesome to Bootstrap Icons migration.
- Fix the search reset button rendering as a blank disc under a dark color scheme.
- Fix three declarations in
code.scssnaming CSS variables Bootstrap 5 moved behind a--bs-prefix: a code block's filename label, the line-number gutter border, and highlighted line-number backgrounds. - Fix the avatar's flip rendering flat. Its
perspectivewas set to a bare600, and a number with no unit is not a length. - Take the code block's line-number gutter background from whichever stylesheet
CODE_STYLEselects, instead of a hard-coded Monokai color. - Stop badges extending
.btnand.btn-light, which drew a border in a fixed light gray around every one of them. - Style the search reset button and the search progress bar through the
--bs-btn-close-filterand--bs-progress-heightcustom properties Bootstrap5.3.4introduced. - Replace the deprecated
text-mutedand the hard-codedtext-darkin the footer with color scheme aware utilities. - Add the missing
alttext on the site thumbnail. - Ignore anything that is not a stylesheet when collecting
ALL_CODE_STYLES. - Drop the stale Python 3.10 classifier, left over from the move to a 3.11 floor.
- Remove the
pelican-image-processexternal-images workaround, the never-readplumage/postcss.config.js, and thebox-sizing: content-box !importantoverride on code blocks. - Collapse the seven rules revealing a heading's anchor link into one, using
:is(), and drop the!importantthey carried. - Add a test suite covering settings validation, the HTML transforms, the favicon assets and the rendered templates, across both of the MyST reader's renderers. Run it with
uv run --group test -- pytest. - Run the test suite on Python 3.11 to 3.14 through a new
tests.yamlworkflow. - Document code highlighting, admonitions, the
LAYOUTsetting, and every block the theme exposes. - Document theme development, recommend Jampack for asset optimization, and rewrite the installation instructions around
uv. - Manage the repository with
repomatic, and run the theme's own CI jobs onubuntu-24.04. - Pin every tool invoked from a workflow to an exact version, and declare the Node version every job running
npmuses. - Give Dependabot a cooldown, and configure stylelint and djlint to report only findings that apply to the theme.
- Generate the Pygments stylesheets through the library's own API, in a job split from CSS formatting.
- Lint and autofix all stylesheets in a single stylelint call each, instead of one per file extension.
- Stop spell-checking the vendored minified bundles.
- Declare the PyYAML stubs alongside PyYAML itself, so type-checking the test suite's workflow parsing no longer fails on the import.
Full changelog: v4.0.0...v5.0.0