Citation resolution and manuscript-as-software CI for Quarto.
Project description
quartobot
Citation resolution and manuscript-as-software CI for Quarto.
uv tool install quartobot
Or from git for the unreleased main:
uv tool install git+https://github.com/quartobot/quartobot
Documentation: quartobot.github.io/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.
Around that resolution step, the project ships:
-
The Python CLI —
scan,validate,resolve,init, andmcp.resolveis the pre-render hook itself;scanandvalidateare CI-lint surfaces (cite-key inventory, static_quarto.ymlchecks);initscaffolds the pattern into an existing project;mcpstarts a stdio MCP server so an agent in Claude Desktop, Codex, or Gemini Code Assist can call the same resolver as part of a drafting workflow. -
A GitHub template,
quartobot-manuscript— Quarto Manuscripts plus the pre-render hook plus a CI workflow that gives every commit an immutable permalink at/v/<sha>/, embeds it in the rendered HTML, posts PR previews via sticky comment, and deploys HTML + PDF + DOCX to GitHub Pages.gh repo create my-paper --template quartobot/quartobot-manuscript
The book variant (quartobot-book) covers longer works on Quarto's
book project type.
Supported cite-key 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, CI scaffolding, and
the agent-facing MCP surface.
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.
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 working reference the template is being lifted from.
See also
- Documentation site — install, CLI reference, MCP setup, templates, migration guides
- Design
- Citation pipeline — why a pre-render hook, not a pandoc filter
- Prior art
- Contributing
- Code of conduct
- Changelog
License
MIT.
quartobot is an independent community project. It builds on Quarto but is not affiliated with or endorsed by Posit, PBC, the makers of Quarto.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file quartobot-0.2.0.tar.gz.
File metadata
- Download URL: quartobot-0.2.0.tar.gz
- Upload date:
- Size: 59.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab0b3a05def1e69c94a09a597a3fa9d2b2e9b4d0796ab14495c2a74b1cb2986c
|
|
| MD5 |
b3e50f60d07ffc475ec26f1a6b4aea75
|
|
| BLAKE2b-256 |
159282c1b958c18ca8319c83c3b181cec6ff248191ceb38f85e83c3ec4e74cf2
|
Provenance
The following attestation bundles were made for quartobot-0.2.0.tar.gz:
Publisher:
publish-pypi.yml on quartobot/quartobot
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
quartobot-0.2.0.tar.gz -
Subject digest:
ab0b3a05def1e69c94a09a597a3fa9d2b2e9b4d0796ab14495c2a74b1cb2986c - Sigstore transparency entry: 1554429581
- Sigstore integration time:
-
Permalink:
quartobot/quartobot@cccc437df67514b5815d94767d8c743fe2ee961b -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/quartobot
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@cccc437df67514b5815d94767d8c743fe2ee961b -
Trigger Event:
push
-
Statement type:
File details
Details for the file quartobot-0.2.0-py3-none-any.whl.
File metadata
- Download URL: quartobot-0.2.0-py3-none-any.whl
- Upload date:
- Size: 37.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5e2cca596461eb5a55bb80d978e4c3ae69d50050c8350bdf64bc85753e4825ba
|
|
| MD5 |
d3065c9f1c70bd86a8ec323691fbaac1
|
|
| BLAKE2b-256 |
f81c7048ae3b0e5176478e273603fc006c7285c0208ae144d08d061dad352591
|
Provenance
The following attestation bundles were made for quartobot-0.2.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on quartobot/quartobot
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
quartobot-0.2.0-py3-none-any.whl -
Subject digest:
5e2cca596461eb5a55bb80d978e4c3ae69d50050c8350bdf64bc85753e4825ba - Sigstore transparency entry: 1554429592
- Sigstore integration time:
-
Permalink:
quartobot/quartobot@cccc437df67514b5815d94767d8c743fe2ee961b -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/quartobot
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@cccc437df67514b5815d94767d8c743fe2ee961b -
Trigger Event:
push
-
Statement type: