Skip to main content

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.resolved.bib (BibLaTeX) 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 BibLaTeX (references.resolved.bib) plus a CSL JSON cache.
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.bib ↔ resolved-bibliography 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 scan → quartobot 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.

Metadata

Release files for quartobot 0.6.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 quartobot 0.6.0
File Size Uploaded Provenance Actions
quartobot-0.6.0.tar.gz 88.1 kB With provenance Details for quartobot-0.6.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for quartobot 0.6.0
File Interpreter ABI Platform Actions
quartobot-0.6.0-py3-none-any.whl Python 3 none any Details for quartobot-0.6.0-py3-none-any.whl

Total release size: 147.1 kB

Release files / quartobot-0.6.0.tar.gz

Download URL quartobot-0.6.0.tar.gz
Size 88.1 kB
Tags Source
SHA-256 checksum
How to use checksums
c577783c8a12a225d0ccd2367cb1299264dc238bd7c56ba6d81dddb52b06a8b9
BLAKE2b-256 checksum
How to use checksums
18325d6069b1c46413a5cd7c7b0e1e61ca85533162caab1a38cefc5021bf408c
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 May 28, 2026.

Transparency log

Release files / quartobot-0.6.0-py3-none-any.whl

Download URL quartobot-0.6.0-py3-none-any.whl
Size 59.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e99174d257e0bfa9eb08231a105a6dd44c8c7975ec54ebeeb64a524cb884e7e1
BLAKE2b-256 checksum
How to use checksums
28a4005abe24cf3a4bcd02943e9693a15684d658a84faa85c9d8b965b2a5aac2
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 May 28, 2026.

Transparency log

Security for quartobot 0.6.0

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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for quartobot-0.6.0.tar.gz

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 May 28, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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