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:
| Exit | Meaning |
|---|---|
0 | Scan 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). |
2 | The 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.tsxFlags
| Flag | Description | Default |
|---|---|---|
-l, --level <level> | WCAG conformance target: A, AA, or AAA | AA |
--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) |
--json | Emit machine-readable JSON to stdout (log goes to stderr) | |
-i, --show-ignored | Include ignored issues in the output | |
-v, --verbose | Expand the full per-criterion support table + all occurrences for best-practice issues | |
-a, --all | List everything: all WCAG criteria, all occurrences and all affected files. Without it, every cut is announced with its count | top 8 criteria, 2 of each |
-m, --show-manual | List WCAG criteria that require manual review | |
--show-review | List the findings static analysis can't confirm (not counted; always in --json). See Findings to review | (count only) |
--no-color | Plain 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-readability | Skip 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 AExport a JSON report
equall scan . --json > report.jsonScope 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 criticalExisting 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 90Without --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.txtThe 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-readabilityEvaluate 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.