Skip to main content

Citation resolution and manuscript-as-software CI for Quarto.

Project description

quartobot

Citation resolution and manuscript-as-software CI for Quarto.
Paste a DOI in your prose. Render the manuscript. The bibliography is already correct.

PyPI Python versions PyPI downloads License: MIT Docs

Tests Pre-render hook end-to-end Docs link check Ruff

quartobot demo: scan, resolve, references.json, quarto render, formatted citation in the rendered manuscript


uv tool install quartobot

Documentation: seandavi.github.io/quartobot · Source: seandavi/quartobot · PyPI: quartobot

What it does

Authors write persistent-identifier cite keys directly in prose:

We follow @doi:10.1371/journal.pcbi.1007128, with the dataset described
in @pmid:31479462 and methods inspired by @arxiv:2104.10729.

A Quarto project.pre-render: hook resolves each key to canonical metadata before pandoc-citeproc runs, writes the result to a references.json you can commit, and the manuscript renders the same way on every machine. No quartobot install needed at render time, no live Crossref / PubMed / arXiv hit per render. CI gets the same behavior the author saw locally, and a network blip mid-render is no longer a build failure.

Supported prefixes: @doi:, @pmid:, @arxiv:, @isbn:, @url:, @wikidata:, @pmc:, plus hand-curated keys from a project .bib. Resolution goes through manubot's citekey_to_csl_item — eight years of accumulated source-API quirks behind a single function call. quartobot itself doesn't reimplement resolution; it provides the Quarto integration, the CI scaffolding, and an agent-facing MCP surface.

Quick start

uv tool install quartobot
quarto create project manuscript my-paper
cd my-paper && quartobot init
# Optional: scaffold render + PR-preview CI.
quartobot use github-ci

That's the canonical path. Three other on-ramps live in Choose a path in for "I have an existing Quarto project" and the resolver-only minimum.

The CLI

Command What it does
resolve The pre-render hook. Invoked by Quarto from _quarto.yml's project.pre-render: line. Reads cite keys, writes CSL JSON.
scan / validate CI-lint surfaces. Cite-key inventory and static _quarto.yml checks.
init Scaffolds the citation pipeline into an existing Quarto project. Three files only.
use github-ci Layers the render + PR-preview CI on top. Lean default; --with-versioned-snapshots for the manubot per-commit-permalink pattern.
reconcile Resolves references.bibreferences.json citation-key collisions with explicit modes. Backup-then-mutate.
versions Generates the /versions/ page on gh-pages — tagged releases + open PR previews.
mcp Stdio MCP server. Agents in Claude Desktop, Codex, Gemini Code Assist call the same resolver as part of drafting.

Full reference: CLI and Workflows and actions.

Why this exists

manubot/manubot#332 ("Quarto integration") was opened by Anthony Gitter in April 2022 after a conversation with Sean Davis. Four years on, no PR, no assignee — but Quarto Manuscripts shipped as a first-party project type, and the integration turned out to be small once the resolver question was settled. This repo is the work to close that issue.

The longer story: Differences from manubot, Design, Citation pipeline.

Working example

seandavi/2026-venice-spatial-hackathon-manuscript runs the CI / permalink / banner half of the pattern on a live 25-author preprint from the Bioconductor Spatial Hackathon. That's the production reference the template lifted from.

See also

Demo recording

The GIF above walks quartobot scanquartobot resolve (live registrar lookups) → quarto render --to html → the formatted citation in the rendered manuscript. Recorded with asciinema (cast) + agg (cast → GIF). To re-record after changing the demo flow:

brew install asciinema agg
bash scripts/demo-setup.sh
asciinema rec docs/demo.cast --command 'bash scripts/demo.sh' --overwrite
agg docs/demo.cast docs/demo.gif --font-size 18 --theme dracula --speed 1.2 --cols 80 --rows 28
cp docs/demo.gif site/public/demo.gif  # also serves the landing-page embed

The scripts/demo.tape file is a vhs alternative for a higher-fidelity render once a Chrome/Chromium environment is available.

License

MIT.


Maintained by Sean Davis.
quartobot is an independent community project. It builds on Quarto but is not affiliated with or endorsed by Posit, PBC.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

quartobot-0.4.0.tar.gz (495.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

quartobot-0.4.0-py3-none-any.whl (56.8 kB view details)

Uploaded Python 3

File details

Details for the file quartobot-0.4.0.tar.gz.

File metadata

  • Download URL: quartobot-0.4.0.tar.gz
  • Upload date:
  • Size: 495.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.11

File hashes

Hashes for quartobot-0.4.0.tar.gz
Algorithm Hash digest
SHA256 f7a1fd5f58bbb159cf42b096c4f2a76411461ea928a5a9ff9044ad9c9979ce67
MD5 a659d4f684a09b9a5fb3719529d88d5d
BLAKE2b-256 3cd288bb2287778abeb054416eb27d0f8a1a042d5a973635a94774c69c0a59c8

See more details on using hashes here.

File details

Details for the file quartobot-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: quartobot-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 56.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.11

File hashes

Hashes for quartobot-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f7037744e081c1c095d661a90ca5307c4315d09e0211e50f31579635aa5deeae
MD5 f591acecc888274471a9f07fac8ce964
BLAKE2b-256 661b084d43c52fd12ed1f4186d0eb1ca8d109a8919fe45afb4ecb8149cd01efd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page