Equall

Scanning

Run scans locally, in CI, or as a pre-commit hook. All CLI flags for the scan command.

Basic usage

equall scan [path]

path defaults to the current directory. Exit codes:

ExitMeaning
0Scan completed. This is the default for any successful scan, whatever the score.
1--min-score <n> is set and the score is below n, or an option value is invalid (--level, --standard, --min-score).
2The scan could not run: the path does not exist or is a file rather than a folder, or the scan stopped on an unexpected error. A scanner that fails does not stop the scan: it is reported on stderr and the other scanners still run.

A successful scan exits 0 by design, so an interactive run never looks like a failure. Opt into a CI gate with --min-score, or gate a pull request on what it introduces with --diff and --fail-on, which has its own exit codes.

An existing folder with no scannable files prints "No scannable files found" and exits 0; check the path if a CI step reports it. A path that does not exist exits 2 with path not found, so a typo in a CI step fails instead of passing.

Warnings about what the scan could not check (a file a scanner could not parse, a scanner that failed) are printed on stderr before the report.

Support Summary

The terminal report ends with its takeaway — printed last so it's what stays on screen when the scan finishes. The 0–100 score (a trend indicator, not a pass/fail grade) and an honest verified-subset statement sit just above a WCAG 2.2 Support Summary — three buckets, derived from criterion_conformance, that sum to the target level's criteria total:

  ◆ EQUALL — Accessibility Score

  Summary
  3 files scanned  ·  7 WCAG violations  ·  0 best-practice recommendations  ·  4 page-level (needs rendered page)
  ■ 3 critical   ▲ 4 serious   ● 0 moderate   ○ 0 minor
  critical/serious = fix before shipping · moderate/minor = fix in next iteration
  1 route detected · html 1
  1 finding not counted — static analysis can't confirm it · run with --show-review

  [...violations and details...]

    65.38    WCAG 2.2 · score is a trend indicator
  5 A/AA failures among the 20 criteria automatically verified (35 not evaluated).

  WCAG 2.2 Support Summary — AA target · automated basis only
  ✓ Supports (automated) 15   ✕ Does not support 5   ○ Not evaluated 35
  Automated verdicts only — a full statement needs manual + assistive-tech testing. Run --verbose for the per-criterion table.
  What each verdict means → https://equallscan.com/docs/verdicts

"Supports (automated)" and "Does not support" count criterion_conformance entries with verdict pass_automated and fail; "Not evaluated" is every other verdict combined. --verbose expands the full per-criterion table and splits "Not evaluated" into its three reasons — rendered check, assisted, or manual. The headline line above it is derived from the same verdicts: the criteria "automatically verified" are the fail plus pass_automated ones, so the two lines always agree. A scan with no failures states this verified subset, never "None". None of the words "Meets", "conformant", "compliant", or "conformance" appear in the output — automated verdicts state a basis, not a certification.

The Summary counts only the issues that affect the score. Suppressed issues (equall-ignore) and findings static analysis cannot confirm are announced on their own lines, never counted as violations.

Findings to review

On component source (JSX/TSX, Vue, Svelte, Astro), axe-core sees markup reconstructed from the code, not a rendered page. When a finding sits on an element whose name or content depends on props, runtime expressions or a component (<Button>, {...props}, aria-checked={state}), or comes from a rule that needs the rendered page, static analysis cannot confirm it. Such a finding is reported for review: it keeps its fingerprint and stays in the --json output (review_only: true, with a review_reason), but it never counts in the score, the violation counts or the Support Summary. Plain .html is never affected.

By default the terminal prints one line with their count. --show-review lists them in a "To review" section:

  To review — 1 finding static analysis can't confirm on component source · not counted

  ○ button-name  1 occurrence  WCAG 4.1.2
      The element depends on props, runtime expressions or a component, which static analysis cannot see.
      ↳ src/components/Toolbar.tsx

Flags

FlagDescriptionDefault
-l, --level <level>WCAG conformance target: A, AA, or AAAAA
--standard <standard>WCAG version to evaluate against: wcag22 (Equall's identity) or wcag21 (the public-sector legal bar, WAD/EN 301 549)wcag22
--include <patterns...>Glob patterns to include(auto)
--exclude <patterns...>Glob patterns to exclude(auto)
--jsonEmit machine-readable JSON to stdout (log goes to stderr)
-i, --show-ignoredInclude ignored issues in the output
-v, --verboseExpand the full per-criterion support table + all occurrences for best-practice issues
-a, --allList everything: all WCAG criteria, all occurrences and all affected files. Without it, every cut is announced with its counttop 8 criteria, 2 of each
-m, --show-manualList WCAG criteria that require manual review
--show-reviewList the findings static analysis can't confirm (not counted; always in --json). See Findings to review(count only)
--no-colorPlain text, no ANSI colors. Colors are also off when NO_COLOR is set or when the output is not a terminal (a file, a CI log); FORCE_COLOR turns them back on. Each severity keeps its own symbol (■ ▲ ● ○) without color
--no-readabilitySkip the Flesch-Kincaid reading-grade scanner
--min-score <n>CI gate: exit 1 if the score is below n (0–100). Omit to always exit 0 on a successful scan. Can't be combined with --diff(off)
--diff [base]Report only what changed since base (a Git ref). With no value, the pull request's target branch is read from GitHub Actions, GitLab CI or Azure Pipelines. See CI(off)
--fail-on <severity>With --diff: exit 1 if the change introduces a violation at this severity or above (critical, serious, moderate, minor). See CI(off)

Common recipes

Target Level A only

equall scan ./public --level A

Export a JSON report

equall scan . --json > report.json

Scope to a subfolder

equall scan . --include "src/**"

Run in CI (fail a pull request only on what it introduces)

equall scan . --diff origin/main --fail-on critical

Existing violations never block; see CI for the snippets per CI provider.

Run in CI (fail the build below a score threshold)

# .github/workflows/a11y.yml
- run: npx equall-cli scan . --level AA --min-score 90

Without --min-score, the scan reports the score but still exits 0 — handy for an informational CI step that never blocks the build.

Save a plain-text report

equall scan . --all > report.txt

The output is not a terminal, so colors are off and the file carries no escape codes. --all lifts the default caps so every occurrence is in the file.

Skip readability checks for non-English projects

equall scan . --no-readability

Evaluate against the WCAG 2.1 legal bar instead of 2.2

equall scan . --standard wcag21

--standard is a view filter on the conformance table, coverage, and verdict — the 0–100 score is identical regardless of which standard is selected. Under wcag21, the 9 success criteria new in 2.2 (e.g. 2.5.8 Target Size) leave the conformance table (findings on them remain visible as issues elsewhere in the output), and 4.1.1 Parsing reappears as a documented automated pass (obsolete per W3C erratum, so nothing new to check).

Verifying page-level rules

Landmark, document-title and language rules can't be judged from a single component — scan your built output (dist/) to verify them on the composed page. See Verifying page-level rules.

Ignore subcommand

Managing inline equall-ignore comments also ships with a dedicated subcommand — see Ignore system.

On this page