# Share a Vitest HTML Report — A Link Instead of a Terminal Paste

Canonical: https://commareports.com/share-vitest-report
Published: 2026-08-24

> vitest --reporter=html writes a folder that only opens through a local server. Publish it to Comma for a URL teammates can open, comment on, and compare run to run.

# Share a Vitest HTML report

Vitest's HTML reporter is a genuinely nice artifact — the failure tree, the
diff for the assertion that blew up, the module graph — and it has an unusual
property: **you cannot open it by double-clicking it.** The page loads its
results as a JSON module, and `file://` origins block module fetches, so the
official instructions are to spin up `vite preview` first.

Which means the report exists in exactly one place: on the machine that ran
the tests. Everything downstream is a terminal screenshot.

## Publish the folder

```bash
npm i -D @vitest/ui
npx vitest run --reporter=html    # → html/
```

Drag `html/` (or a zip of it) into [the app](https://commareports.com/):

- `index.html` becomes the **report body**.
- The results JSON, the bundle and the assets upload alongside it, and their
  relative references are rewritten to the uploaded copies — which is exactly
  the step `file://` cannot do.
- Scripts run inside a sandboxed iframe (`allow-scripts`, no
  `allow-same-origin`), so the filters and detail panes work.

One URL. No preview server, no "run this command first" in the message you
send a teammate.

## From CI

```bash
npx vitest run --reporter=html

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 html/index.html \
        --arg title "Unit tests — $GITHUB_SHA" '{title: $title, html: $html}')"
```

Run the step with `if: always()` (GitHub Actions), `when: always` (GitLab,
CircleCI) or `post { always { … } }` (Jenkins). A green run's report is nice
to have; a red run's report is the entire point.

PATCHing one report id keeps a single URL per suite and appends a revision per
run — so "was this failing yesterday?" is a
[diff](/docs/ci), not an archaeology expedition through expired artifacts.

## What review adds

The value of a shared test report is not the pass count, it is the record of
what the team decided about a failure:

- **Anchored threads** on the failing test — see
  [commenting on HTML](/comment-on-html).
- **Revisions**, so a flake's history is visible rather than remembered.
- **Access per report** — private, team, domain-gated, or named reviewers.
  See the [sharing model](/docs/sharing).

## Limits

- **Entry HTML: 5 MB.** Assets: 25 MB per file, 250 MB and 500 files total.
  A huge suite's results JSON is the file to watch; shard the suite if it gets
  close.
- **60 requests/minute per token.**

## Try it

Comma is free — unlimited reports, unlimited commenters, unlimited revision
history.

**[Publish a test report →](https://commareports.com/)**

### Related

- [Share a Jest report](/share-jest-report) · [Share a Playwright report](/share-playwright-report)
- [Share a Cypress report](/share-cypress-report) · [Share a Mochawesome report](/share-mochawesome-report)
- [Publish from CI](/docs/ci) · [Share a coverage report](/share-coverage-report)
