quartobot
@doi:... directly in Quarto prose. quartobot resolves each citation from Crossref, PubMed, arXiv, and other identifier sources at render time.
Citation resolution for Quarto
Write @doi:…, @pmid:…, or @arxiv:… directly in your Quarto prose. quartobot resolves each citation from Crossref, PubMed, arXiv, and other identifier sources at render time — no separate BibTeX file to hand-maintain.
What you write, what renders
What you write
The tidyverse [@doi:10.21105/joss.01686] is a
coherent grammar for data manipulation across
a family of R packages.→
What renders
The tidyverse (Wickham et al. 2019) is a coherent grammar for data manipulation across a family of R packages.
References
Wickham, H., et al. (2019). Welcome to the Tidyverse. Journal of Open Source Software, 4(43), 1686.
Slots into any Quarto project — manuscripts, books, websites, and Quarto’s native project: type: manuscript. One line in _quarto.yml; no Lua filter, no quarto add, no _extensions/.
uv tool install quartobotThen first manuscript in 15 minutes → walks the whole flow: scaffold, write, render, push, deploy.
Four composable layers
Adopt one, stack any subset — they don’t require each other.
Layer 1 · the atom · Resolve a citation
If you just need DOI / PMID / arXiv metadata at the shell.
Hand quartobot a persistent-identifier key — doi:, pmid:, arxiv:, isbn:, url:, wikidata:, pmc: — and get back CSL JSON on stdout. Pipes cleanly through jq or any agent’s shell tool. The resolver is manubot.cite.citekey_to_csl_item underneath; eight years of source-API quirks behind one call.
quartobot resolve --output - doi:10.21105/joss.01686 \
| jq '.[0].title'
# → "Welcome to the Tidyverse"Done — you have a single-key metadata lookup tool. Stop here or stack on Layer 2.
Layer 2 · the manuscript · Resolve in the render loop
If you author Quarto manuscripts, books, or websites.
# _quarto.yml
project:
pre-render: >-
quartobot resolve --from-scan .
--id-mode citation-key
bibliography:
- references.bib
- references.resolved.bibOne line in _quarto.yml makes quartobot resolve run before pandoc on every render. Authors write @doi:… directly in prose; the hook fetches each key, writes BibLaTeX to references.resolved.bib, and pandoc-citeproc formats the rendered output. Network only on first render; cached after. Hand-curated entries in references.bib work alongside, for the keys the resolver can’t reach.
Done — your manuscript builds itself with resolved citations. Stop here or stack on Layer 3.
Layer 3 · the agent · Ground AI-assisted drafting
If you draft with Claude Desktop, Codex, Gemini, Cursor, or any agent harness with a shell.
If your manuscript renders citations from persistent identifiers, your AI drafting tools should look them up the same way. Two surfaces, same resolver: quartobot mcp exposes resolve_citation, scan_project, and validate_project as MCP tools for native MCP clients. For agents that already live in a shell, quartobot resolve --output - is the same call piped through stdout — equally good, sometimes preferred for portability and composition with jq. Either way, an agent checks every cite key it proposes against the source registrar before that cite reaches your draft.
// ~/Library/Application Support/Claude/
// claude_desktop_config.json
{
"mcpServers": {
"quartobot": {
"command": "quartobot",
"args": ["mcp"]
}
}
}Same call, same answer. An agent that routes its proposed cite keys through quartobot gets back source-registrar metadata — Crossref for DOIs, PubMed for PMIDs, arXiv for preprints — using the same resolver your manuscript renders with. Agent metadata and rendered metadata can’t drift apart.
Layer 4 · the publication · Citations resolve in CI; reviewers preview in the PR
If you publish a manuscript to GitHub Pages and want PR previews + a versions page out of the box.
quartobot use github-ci
# scaffolds:
# .github/workflows/render.yml
# .github/workflows/pr-closed.yml
# uses the lean reusable workflow.
# add --with-versioned-snapshots for the
# per-commit /v/<sha>/ permalink layer.quartobot use github-ci scaffolds a thin GitHub Actions workflow that does three things: installs Quarto and quartobot on the runner so the citation pre-render hook works in CI, renders the manuscript on every push, and posts a sticky PR comment with the preview URL on every PR. A generated /versions/ page lists tagged releases and open PR previews. No banner injection, no per-commit deploys by default — just the latest at /, PR previews at /pr/<n>/, and the versions page as the discoverability surface.
Reviewers see exactly what your branch renders to. The sticky PR comment links to a live preview of the manuscript at /pr/<n>/ — no local checkout, no “but it works on my machine,” no version drift between what reviewers read and what merges.
Where to go next
I just need a citation
Resolve a single citation — one persistent-identifier key in, CSL JSON out. CLI or MCP.
I’m writing a Quarto manuscript
First manuscript in 15 min walks the canonical path end-to-end: install, scaffold, write, render, push, deploy.
I want the design rationale
Design collects the architecture decisions and the prior art — why a pre-render hook, why CSL JSON, why the sticky PR comment.
Maintained by Sean Davis. Contributions welcome — open an issue or browse open PRs. Every page has an “Edit page” link at the top for typo-grade fixes.
quartobot is an independent community project. It builds on Quarto but is not affiliated with or endorsed by Posit, PBC, the makers of Quarto.