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.