# Share a Deepchecks Report — Data & Model Validation People Can Argue With

Canonical: https://commareports.com/share-deepchecks-report
Published: 2026-08-28

> `suite_result.save_as_html()` gives you one self-contained file that only opens in your notebook environment. Publish it: a URL, anchored comments on the failing check, a revision every run.

# Share a Deepchecks report

Deepchecks is at its most useful in the argument _after_ the run — the
feature drifted, the label distribution shifted, the train/test split
leaks. That argument needs everyone looking at the same output.

```python
from deepchecks.tabular.suites import train_test_validation

result = train_test_validation().run(train_ds, test_ds, model)
result.save_as_html("deepchecks.html")
```

`save_as_html` writes one self-contained file: the conditions table, the
per-check detail, and the Plotly figures inlined. Nothing to lose in
transit — and nothing anyone else can open, because it's sitting in your
working directory.

## Why the notebook isn't the share

`result.show()` renders inline, so the audience is exactly one person.
What gets shared instead is a screenshot of the conditions summary,
which drops the part that decides the argument: the distribution plot
under the failing check.

## Publish the file

Drag `deepchecks.html` into [Comma](https://commareports.com/):

- The report body renders faithfully, and the Plotly figures stay
  interactive — scripts run inside a sandboxed iframe with no
  same-origin access. See
  [interactive HTML reports](/interactive-html-reports).
- One URL, openable on a phone, with no account for the reader.
- Access per report: private, team, anyone signed in, or link holders
  with view, comment or edit —
  [sharing & access control](/docs/sharing).

## From a training or validation pipeline

```python
import requests

result = train_test_validation().run(train_ds, test_ds, model)
result.save_as_html("deepchecks.html")

with open("deepchecks.html") as f:
    requests.patch(
        f"https://commareports.com/api/v1/reports/{report_id}",
        headers={"Authorization": f"Bearer {token}"},
        json={"title": f"Validation — {model_version}", "html": f.read()},
        timeout=60,
    ).raise_for_status()
```

One report id per model or per dataset keeps one URL and appends a
revision per run — so "when did this check start failing" is a question
the history answers. See [publishing from CI](/docs/ci) and
[scheduled HTML reports](/features/routines/scheduled-html-reports).

## What review adds

- **Anchored threads** on the failing check — "expected, promo window"
  or "no, this is a join bug" — which is the context a red condition row
  never carries by itself. See [commenting on HTML](/comment-on-html).
- **Revisions**, so a drift claim is a diff between two runs rather than
  two screenshots.
- **Access per report**, which matters when the check output includes
  feature values from production data. Keep it `private` or `team`
  unless you've looked.

## Limits

- **Entry HTML: 5 MB.** A full default suite with many figures exceeds
  this. Run the narrower suite you actually want reviewed
  (`data_integrity()`, `train_test_validation()`), or export a single
  check's result on its own.
- Assets: 25 MB per file, 250 MB and 500 files. **60 requests/minute per
  token.**

## Try it

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

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

### Related

- [Share an Evidently report](/share-evidently-report) · [Share Great Expectations data docs](/share-great-expectations-data-docs)
- [Share an LLM eval report](/agents/share-llm-eval-report) · [Share a SHAP plot](/share-shap-plot)
- [Publish from CI](/docs/ci)
