Documentation
Configuration
YAML settings, CLI overrides, engines, WCAG levels, URL filters, and output naming.
Configuration
On this page
Configuration lives in a11y-catscan.yaml. Copy the example and edit it
for the site being audited:
cp a11y-catscan.yaml.example a11y-catscan.yaml
The local config is gitignored. Command-line flags override YAML values for the current run.
Minimal config
url: https://example.com/
level: wcag21aa
max_pages: 50
output_dir: ./reports
exclude_paths:
- /login
- /api
- /administrator
Then run:
./a11y-catscan.py
The positional URL wins over url in the file:
./a11y-catscan.py https://staging.example.com/
Engines
| Engine | CLI value | Notes |
|---|---|---|
| axe-core | axe |
Default engine. Strong broad coverage, especially contrast, names, labels, ARIA, structure |
| Siteimprove Alfa | alfa |
ACT-rule engine, run through a Node.js subprocess |
| IBM Equal Access | ibm |
IBM Accessibility Checker rule set |
| HTML_CodeSniffer | htmlcs |
Older but useful WCAG-oriented sniff rules |
| All engines | all |
Expensive, but best for baseline audits |
Set one engine in YAML:
engine: axe
Or select several on the command line:
./a11y-catscan.py --engine axe,alfa,ibm https://example.com/
WCAG levels
Common values:
| Level | Meaning |
|---|---|
wcag2a |
WCAG 2.0 Level A |
wcag2aa |
WCAG 2.0 Level AA |
wcag21aa |
WCAG 2.1 Level AA, the default |
wcag22aa |
WCAG 2.2 Level AA |
best |
WCAG 2.1 AA plus best-practice rules |
Example:
./a11y-catscan.py --level wcag22aa https://example.com/
Best-practice rules are not counted as WCAG compliance failures unless
you explicitly use --level best.
URL scope
Use include paths to restrict a crawl:
include_paths:
- /docs
- /support
Use exclude paths for known non-content or destructive routes:
exclude_paths:
- /login
- /logout
- /api
- /administrator
Use regex sparingly for families of internal pages:
exclude_regex:
- ^/internal/[^/]+/(admin|settings|logs)(/|$)
Query normalization
strip_query_params reduces duplicate URLs that render the same page
template:
strip_query_params:
- sort
- sortdir
- limit
- start
Path-conditional stripping is useful when a parameter is meaningful on one route but just a filter on another:
strip_query_params:
- path: ^/(tags|resources)
querystring: [parent, area]
Output names and directories
./a11y-catscan.py --name baseline --output-dir reports https://example.com/
This writes:
reports/baseline.json
reports/baseline.jsonl
reports/baseline.html
--name is a filename, not a path. Use --output-dir for directories.
Performance settings
| Setting | Default | Purpose |
|---|---|---|
workers |
1 |
Parallel page scans |
wait_until |
networkidle |
Playwright navigation strategy |
page_wait |
1 |
Extra wait after load when not using networkidle |
save_every |
25 |
Flush derived reports every N pages |
restart_every |
500 |
Restart Chromium to control memory growth |
niceness |
10 |
Lower process CPU priority |
oom_score_adj |
1000 |
Prefer scanner for Linux OOM killing |
For large sites, raise workers slowly and watch memory:
./a11y-catscan.py --workers 4 --max-pages 1000 https://example.com/
Alfa scans serialize internally, so --engine all will not scale
linearly with worker count.