# Share a RuboCop HTML Report — Offenses With a Link, Not a Log Dump

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

> rubocop --format html --out rubocop.html turns 4,000 lines of terminal output into a browsable report. Publish it to Comma so the team can argue about the cops in one place.

# Share a RuboCop report

A big Ruby codebase adopting RuboCop produces a number nobody can act on:
**812 offenses detected**. The terminal output that explains it is four
thousand lines long and lives in a CI log that expires.

RuboCop ships an HTML formatter for exactly this:

```bash
rubocop --format progress --format html --out rubocop.html
```

Two formatters, one command: dots in the terminal, a browsable report on
disk. It groups by file, expands to the offending source line, and links each
offense to the cop that raised it.

## Publish it

Drag `rubocop.html` into [the app](https://commareports.com/), or from CI:

```bash
bundle exec rubocop --format html --out rubocop.html || 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 rubocop.html \
        --arg title "RuboCop — $GITHUB_SHA" '{title: $title, html: $html}')"
```

Run the publish step with `if: always()` (GitHub Actions), `when: always`
(GitLab, CircleCI) or `post { always { … } }` (Jenkins). A clean lint report
is not the one anyone needs.

## The conversation lint actually needs

Style enforcement is a social negotiation with a config file attached. The
decisions are worth keeping:

- **Anchored threads** on the cop or the file — "we're disabling
  `Metrics/ClassLength` for `app/services`, here's why". See
  [commenting on HTML](/comment-on-html).
- **Revisions** — one report id per repo, one revision per run, so a
  `.rubocop_todo.yml` regeneration shows up as movement instead of a vibe.
- **Access per report** — private, team, domain-gated, or named reviewers.
  See the [sharing model](/docs/sharing).

## Let the agent read the offenses

If a coding agent is doing the cleanup, point it at the report through
[MCP](/docs/mcp): it can read the published offenses and the human comments
on them in the same call, which is a cheaper context than re-running the
linter and re-deriving what the team already decided. See
[give an agent feedback](/agents/give-an-agent-feedback).

## Limits

- **Entry HTML: 5 MB.** An 800-offense report is comfortably under; a
  50,000-offense first run may not be — scope with `--only` or by directory.
- **60 requests/minute per token.**

## Try it

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

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

### Related

- [Share an ESLint report](/share-eslint-report) · [Share a Checkstyle report](/share-checkstyle-report)
- [Share a SimpleCov report](/share-simplecov-report) · [Share a Brakeman report](/share-brakeman-report)
- [Share an RSpec report](/share-rspec-report) · [Publish from CI](/docs/ci)
