# Share a Quarto HTML Report — Send the Render, Not the Project

Canonical: https://commareports.com/share-quarto-report
Published: 2026-08-30

> quarto render writes report.html plus a report_files/ folder, and the folder is why emailing the file never works. Publish the render to Comma for a URL with comments and revisions.

# 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

```bash
quarto render report.qmd --to html
```

Then drag `report.html` **and** `report_files/` (or a zip of the output
directory) into [the app](https://commareports.com/):

- `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:

```bash
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](/comment-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](/docs/sharing).

## On a schedule

A Quarto report that summarizes live data is stale the day after you render
it. A [routine](/features/routines) 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 →](https://commareports.com/)**

### Related

- [Comma with Quarto](/with/quarto) · [Share an R Markdown report](/share-rmarkdown-report)
- [Share a Jupyter notebook as HTML](/share-jupyter-notebook-html) · [Share a marimo notebook](/share-marimo-notebook)
- [Share a Plotly HTML file](/share-plotly-html) · [Scheduled reports](/features/routines/scheduled-html-reports)
