• Install
  • First manuscript
  • Reference
    • CLI
    • Workflows and actions
  • Explanation
    • Design
    • Differences from manubot
  1. Home
  • Home
  • Install
  • Coming from…
  • Tutorials
    • First manuscript (15 min)
    • MCP + Claude Desktop
    • Shell-tool agent
  • How-to guides
    • Choose a path in
    • Deploy to GitHub Pages
    • Resolve a single citation
    • Use a Quarto website
    • Use a Quarto book
    • Use Jupyter notebooks
    • MCP server
    • Migrate from manubot
    • Validate a manuscript
    • Troubleshooting
  • Reference
    • CLI
    • Workflows and actions
  • Explanation
    • Design
    • Differences from manubot

quartobot

Write @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.

First manuscript in 15 min View on GitHub

For Quarto authors who’d rather write @doi:… than hand-maintain a BibTeX file.

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 quartobot

Then 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.

How to resolve a single citation →

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.bib

One 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.

First manuscript in 15 minutes →

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.

MCP + Claude Desktop → · Shell-tool agents →

// ~/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.

First manuscript, step 7 →

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’m building agent-assisted authoring

MCP + Claude Desktop and Shell-tool agent cover both surfaces quartobot exposes.

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.

© 2026 Sean Davis · MIT license

 
  • Edit this page
  • Report an issue