# Share an HTML Report in Slack — A Link That Unfurls, Not a Screenshot

Canonical: https://commareports.com/share-html-report-in-slack
Published: 2026-08-30

> Slack won't render an .html upload — it becomes a download nobody opens. Post a link instead: a preview card in the channel, the real report one click away, and comments that outlive the scroll.

# Share an HTML report in Slack

Slack previews images, PDFs, text files and code snippets. It does not
preview HTML. Upload `report.html` to a channel and it becomes a
**download** — and whoever clicks it now has a copy on their laptop, with
all the usual failures: missing sibling assets, `fetch` blocked on a
`file://` origin, and nothing usable at all on a phone.

So people screenshot instead. It renders inline, everyone can see it, and
the conversation can actually happen. That is a real advantage and the
reason the habit is universal.

It just costs you everything else: the numbers are an image, the image
isn't searchable, and it's wrong as soon as the report regenerates.

## Post a link

Publish the report once — drag the file or folder into
[Comma](https://commareports.com/) — and paste the URL into the channel.

Slack unfurls it into a preview card with the report's title and
description, so the message carries context rather than being a bare blue
link. One click opens the actual report: styling intact, scripts running
in a sandboxed iframe, sortable tables still sortable. See
[interactive HTML reports](/interactive-html-reports).

Nobody downloads anything.

## From CI, in the same job

```bash
# 1. publish the report (stable id → stable URL)
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 "Nightly — $(git rev-parse --short HEAD)" \
        '{title: $title, html: $html}')"

# 2. tell the channel
curl -fsS -X POST "$SLACK_WEBHOOK_URL" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --arg url "https://commareports.com/p/$REPORT_ID" \
        '{text: "Nightly report: \($url)"}')"
```

Because step 1 `PATCH`es a **saved report id**, the URL never changes. The
link posted in `#eng` last month still opens the current report — which is
the opposite of how a CI artifact link behaves. See
[publishing from CI](/ci).

## The part that survives the scroll

A screenshot gets a thread under it. That thread is gone in a week — not
deleted, just unfindable, three thousand messages up.

Comments on the report are attached to **the report**: select the number,
leave a thread, and it stays anchored to that number across every
revision. Six months later the question "why is this metric defined this
way?" is answered next to the metric, by the person who asked it, instead
of being asked again. See [commenting on HTML](/comment-on-html).

Slack is a good place to _notify_ people. It is a bad place to _store_ the
discussion of a document.

## Check access before you paste

The link's reach is a property of the report, not of the channel. Set it
before posting, especially in a channel with guests or external
connections:

- **private** or **team** — the viewer needs access; the unfurl still
  works for people who have it.
- **registered** — any signed-in Comma user with the link.
- **public** — anyone with the URL, no account.

Link permission is separate: `view`, `comment`, or `edit`. See
[sharing & access control](/docs/sharing).

## Why the unfurl works at all

Link-preview bots are allowed to fetch share pages specifically so the
card renders, while search and AI crawlers are blocked from them and every
share page carries `X-Robots-Tag: noindex`. Pasting a report link into a
channel does not put it in a search index.

## Try it

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

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

### Related

- [Share an HTML report in Teams](/share-html-report-in-teams)
- [Stop screenshotting reports](/stop-screenshotting-reports)
- [Email an HTML report](/email-html-report) · [Embed a report](/embed-html-report)
- [Publish from CI](/ci) · [Scheduled HTML reports](/features/routines/scheduled-html-reports)
