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.html becomes 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, no allow-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.

Publish a Quarto render →

Related