Share a Quarto HTML report
Quarto's HTML output is the nicest thing to happen to reproducible reporting in years. It is also, by default, not a file — it is a file plus a directory:
report.html
report_files/
libs/bootstrap/…
libs/quarto-html/…
figure-html/cell-3-output-1.png
Which is why the usual sharing attempt fails in a specific, recognizable way:
you attach report.html to an email, and the person who opens it sees your
prose in Times New Roman with no plots. Every asset reference resolved to a
folder that never left your machine.
Publish the render
quarto render report.qmd --to html
Then drag report.html and report_files/ (or a zip of the output
directory) into the app:
report.htmlbecomes the report body.- Everything in
report_files/uploads as assets, with the relative references rewritten to the uploaded copies. - Scripts run inside a sandboxed iframe (
allow-scripts, noallow-same-origin), so Plotly charts, Leaflet maps, tabsets and the code-folding toggles behave the way they do locally.
Or render self-contained and PATCH it
For a pipeline, one file is easier to move:
quarto render report.qmd --to html -M embed-resources:true
curl -fsS -X PATCH "https://commareports.com/api/v1/reports/$REPORT_ID" \
-H "Authorization: Bearer $COMMA_API_TOKEN" \
-H "Content-Type: application/json" \
-d "$(jq -n --rawfile html report.html \
--arg title "Weekly model report — $(date +%F)" '{title: $title, html: $html}')"
embed-resources: true inlines the CSS, JS and figures as data URIs. Watch
the size: the entry HTML limit is 5 MB, and a document with a dozen Plotly
figures gets there quickly. Above that, publish the folder instead of
inlining — assets get 25 MB per file.
The part that actually matters
A rendered document is a monologue. The reason it gets pasted into Slack is that someone needs to say "this cohort split looks wrong" — and Slack is where that sentence goes to die.
- Anchored threads sit on the paragraph, the table row or the figure they are about. See commenting on HTML.
- Revisions — PATCH the same report id on each render and last month's version stays reachable, so "did this number move?" is a diff.
- Access per report — private, team-wide, domain-gated, or a named list. See the sharing model.
On a schedule
A Quarto report that summarizes live data is stale the day after you render it. A routine runs the render on a cron, PATCHes the same id, and notifies the people subscribed to that report — so the link in last quarter's email still points at current numbers.
Limits
- Entry HTML: 5 MB. Assets: 25 MB per file, 250 MB and 500 files total.
- 60 requests/minute per token.
Try it
Comma is free — unlimited reports, unlimited commenters, unlimited revision history.