Share a golangci-lint HTML report

golangci-lint is unusual among linters in that it ships an HTML writer — you do not need a converter, a SARIF hop, or a third-party template. What it does not ship is anywhere to put the file.

Write the page

v2:

golangci-lint run --output.html.path lint.html || true

v1:

golangci-lint run --out-format html > lint.html || true

The || true is not optional in a report step — golangci-lint exits non-zero whenever it finds anything, and those are the runs whose report matters.

Keep the gate separate:

- name: Lint gate
  run: golangci-lint run

- name: Lint report
  if: always()
  run: golangci-lint run --output.html.path lint.html || true

Publish it

Drag lint.html into the app, or from CI:

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 lint.html \
        --arg title "golangci-lint — $GITHUB_REF_NAME" \
        '{title: $title, html: $html}')"

The page is self-contained, so this is the whole publish — no asset step.

What the URL buys you

  • A stable link per repo. PATCH one report id and every run appends a revision, so enabling a new linter shows up as a step change you can point at rather than describe.
  • Anchored threads on the finding — ownership and exclusions recorded next to the evidence. See commenting on HTML.
  • Access per report — private, team, domain-gated, or named reviewers. See the sharing model.

Scheduling it

A routine re-running weekly against main keeps the report honest between PRs, which is when lint debt actually accumulates.

Limits

  • Entry HTML: 5 MB. Assets: 25 MB per file, 250 MB and 500 files total.
  • 60 requests/minute per token.

Try it

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

Publish a lint report →

Related