chronobib: Group Your Quarto Bibliography by Year

A companion to highlight-author for academic publication pages

quarto
academic
bibliography
open-source
Author

Michael Aye

Published

2026-03-02

After publishing highlight-author earlier today, I extracted the other half of my bibliography tooling into its own extension: chronobib.

What it does

chronobib takes a flat bibliography and groups entries by publication year, adding section headings. The result on my bibliography page looks like this:

2024

Brown, Sierra, et al. 2024. “PDR: The Planetary Data Reader.” JOSS 9 (102).

Walter, S. H. G., et al. 2024. “Mars Reconnaissance Orbiter Context Camera Updated In-Flight Calibration.” Earth and Space Science 11 (2).

2023

Mc Keown, L. E., et al. 2023. “Martian Araneiforms: A Review.” JGR Planets 128 (4).

2022

Portyankina, Ganna, et al. 2022. “Planet Four: Derived South Polar Martian Winds …” PSJ 3 (2).

Because the year headings are proper document headings (not trapped inside the bibliography div), Quarto automatically generates a table of contents from them:

On this page

  • 2024
  • 2023
  • 2022
  • 2021
  • 2020
  • 2019
  • 2001

Instead of scrolling through a wall of references, readers can jump to a specific year in one click.

Installation and usage

quarto add michaelaye/chronobib
bibliography: references.bib
citeproc: false
filters:
  - michaelaye/chronobib

nocite: |
  @*

That’s it. Entries are sorted newest-first by default.

Options

chronobib:
  heading-level: 3      # H3 instead of default H2
  sort: ascending        # oldest first

Pairing with highlight-author

The two extensions are designed to work together. Put highlight-author first (it runs citeproc), and chronobib detects the existing bibliography and skips the redundant citeproc call:

citeproc: false
filters:
  - michaelaye/highlight-author
  - michaelaye/chronobib

highlight-author: "Aye"

This is exactly what powers my bibliography page — names highlighted in bold, entries grouped by year.

How it works

Like highlight-author, chronobib needs citeproc: false because Pandoc runs citeproc after all Lua filters. The filter calls pandoc.utils.citeproc() internally (or skips it if another filter already did), then walks the #refs div, reads each entry’s year from the bibliography metadata, groups them, and inserts heading elements between the year groups.