# Share a Pa11y CI Accessibility Report — Issues With a URL

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

> pa11y-ci with the HTML reporter writes a report per page into a folder. Publish it to Comma so designers, engineers and the a11y reviewer argue about the same issues at one link.

# Share a Pa11y CI accessibility report

Accessibility work fails on distribution more than on will. The scanner runs
in CI, prints _"12 errors across 5 URLs"_, and the three people who could fix
them — a designer, a front-end engineer, and whoever owns the component
library — never see the actual issues.

Pa11y CI has an HTML reporter for exactly this gap:

```bash
npm i -D pa11y-ci pa11y-ci-reporter-html
```

```json
{
  "defaults": { "standard": "WCAG2AA" },
  "reporters": ["cli", ["pa11y-ci-reporter-html", { "destination": "./pa11y-ci-report" }]],
  "urls": ["https://example.com/", "https://example.com/pricing"]
}
```

```bash
npx pa11y-ci      # → pa11y-ci-report/index.html + a page per URL
```

Which is, again, a folder — and a folder is why it stays on the runner.

## Publish the folder

Drag `pa11y-ci-report/` (or a zip of it) into
[the app](https://commareports.com/):

- `index.html` becomes the report body.
- The per-URL pages and styles upload alongside it with their relative links
  rewritten to the uploaded copies, so the drill-down works.
- Scripts run inside a sandboxed iframe, so any interactive filtering behaves.

From CI, PATCH the same report id on every run so the URL is stable and each
run appends a revision — see [publishing from CI](/docs/ci).

## Why the comment layer matters for a11y specifically

Accessibility issues are triaged, not just fixed. Some are false positives.
Some are real but owned by a vendor component. Some are one line of CSS. That
triage is the expensive part, and it gets redone from scratch every quarter
because nobody wrote it down next to the issue.

- **Anchored threads** on the issue — "false positive, the icon button has an
  `aria-label` the scanner does not read". See
  [commenting on HTML](/comment-on-html).
- **Revisions** — one report id per site, one revision per run, so a
  regression has a visible before.
- **Access per report** — private, team, domain-gated, or named reviewers.
  See the [sharing model](/docs/sharing).

## On a schedule

Point a [routine](/features/routines) at the scan so the report refreshes on
a cron and the people subscribed get told when it changes — an accessibility
report that is only true on the day it was generated is not much of a report.

## Limits

- **Entry HTML: 5 MB.** Assets: 25 MB per file, 250 MB and 500 files total —
  a scan across hundreds of URLs writes a page each, so watch the file count
  and split by section.
- **60 requests/minute per token.**

## Try it

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

**[Publish an accessibility report →](https://commareports.com/)**

### Related

- [Share an accessibility report](/share-accessibility-report) · [Share a Lighthouse report](/share-lighthouse-report)
- [Share a sitespeed.io report](/share-sitespeed-report) · [Share an ESLint report](/share-eslint-report)
- [Share a Playwright report](/share-playwright-report) · [Publish from CI](/docs/ci)
