# Share a Scalene Report — CPU, GPU and Memory in One Link

Canonical: https://commareports.com/share-scalene-report
Published: 2026-09-08

> Scalene writes an HTML profile that splits Python time from native time line by line. Publish it to Comma for a URL your team can read and annotate instead of a screenshot.

# Share a Scalene report

Scalene is unusual among Python profilers because it separates *Python* time
from *native* time line by line, and tracks memory alongside both. That
distinction is the finding — "this line is slow" and "this line is slow inside
numpy" lead to completely different fixes — and it is the first thing lost when
the profile becomes a terminal screenshot.

The HTML output preserves it:

```bash
scalene --html --outfile profile.html --no-browser my_script.py
```

`--no-browser` matters if you are producing the file from a script or a CI job;
without it Scalene tries to open a viewer.

## Publish it

Drag `profile.html` into [the app](https://commareports.com/), or POST it:

```bash
curl -fsS -X POST "https://commareports.com/api/v1/reports" \
  -H "Authorization: Bearer $COMMA_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --rawfile html profile.html \
        --arg t "Scalene — feature build pipeline" '{title: $t, html: $html}')"
```

Report HTML renders with scripts enabled inside a sandboxed iframe
(`allow-scripts`, no `allow-same-origin`), so the reader gets the working
report: sortable columns, the per-line memory sparklines, and the
Python-versus-native split rendered in colour rather than described in a
caption.

## Profile the region, not the program

A whole-program Scalene run on a long job produces a table nobody reads. Narrow
it and the report becomes an argument:

```python
from scalene import scalene_profiler

scalene_profiler.start()
build_feature_matrix(df)
scalene_profiler.stop()
```

Two practical flags for shareable output:

- `--cpu-only` — skip memory instrumentation when the question is purely time.
  Much lower overhead, much smaller file.
- `--reduced-profile` — drop lines with negligible cost, so the published table
  is the lines a reader should actually look at.

## From CI

Performance regressions land quietly. Profile the known-hot job and PATCH one
report id per pipeline:

```bash
scalene --html --outfile profile.html --no-browser --reduced-profile \
  -m pytest tests/test_pipeline.py

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 profile.html \
        --arg t "Scalene — pipeline @ $GITHUB_SHA" '{title: $t, html: $html}')"
```

One URL per job, one revision per run. The revision list is the regression
history you would otherwise be reconstructing from expired artifacts.

## What review adds

- **Anchored threads** on the expensive line — see
  [commenting on HTML](/comment-on-html).
- **Revisions**, so "this got worse in 4412" is checkable.
- **Access per report** — private, team, domain-gated or named reviewers. See
  the [sharing model](/docs/sharing).

## Limits

- **Entry HTML: 5 MB.** `--reduced-profile` and `--cpu-only` are the two levers
  that keep a long run comfortably inside it.
- **60 requests/minute per token.**

## Try it

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

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

### Related

- [Share a pyinstrument report](/share-pyinstrument-report) · [Share a memray report](/share-memray-report)
- [Share a py-spy profile](/share-py-spy-profile) · [Share a flame graph](/share-flamegraph)
- [Share a profiling report](/share-profiling-report) · [Publish from CI](/docs/ci)
