Quick answers organised by topic. For installation issues, see docs/INSTALLATION.md. For runtime errors, see docs/TROUBLESHOOTING.md.
- API key + cost
- Scenarios + personas
- Reports + output formats
- Privacy + data handling
- Native binaries + cross-platform
console.anthropic.com → Settings → API
Keys → Create. The key starts with sk-ant-.... Set it as an env var:
export ANTHROPIC_API_KEY=sk-ant-api03-...
# Verify with:
ai-audit doctorProvisional v1.0 estimate: $0.10–$0.30 per 5-unit audit (1 scenario × 5 personas, full AI pipeline) on Claude Sonnet 4.6. Computer Use steps can push this to $0.50+. Hard SLA pending v1.0-rc1 calibration — see the Performance baseline section in README.
To cap spending:
ai-audit run --budget 5.0 # stops audits at $5 USD spentDaily/per-run caps are also enforceable via AUDIT_COST_MAX_RUN_USD /
AUDIT_COST_MAX_DAILY_USD env vars. See ADR-008.
The cost guard intentionally stops further LLM calls when your run / daily budget is exhausted. You'll see partial results — already-completed units are saved. To continue:
- Increase
--budgetflag or env caps - Or wait until next day (daily cap rolls over UTC midnight)
- Or run
ai-audit run --scenario <id> --persona <id>to resume specific units only
Not in v1.0 — v1.0 is locked to Anthropic Claude. The Computer Use feature in particular is Claude-exclusive (no equivalent OpenAI API as of Q2 2026). Multi-provider is on the v1.x / v2.0 roadmap; see ADR-028 for context.
For deterministic audits (no AI evaluation):
# scenarios/deterministic-only.yaml
steps:
- type: visit
url: https://example.com
- type: assert_a11y # axe-core, no LLM
standard: wcag22aa
- type: assert_visual_diff # odiff, no LLM
baseline: baselines/home.pngSkip vision / autonomous steps (see / judge / compare / act /
audit_url) which all call Claude. The result cache also helps —
identical inputs hit cache for 24h (ADR-015).
- Scenario = "what user journey to test" (visit page → click checkout
→ fill form → see error). Lives in
scenarios/*.yaml. Same scenario runs across multiple personas. - Persona = "who is testing" (US English mobile user with screen
reader / Spanish desktop tier-1 customer / etc). Lives in
personas/*.yaml, or use the 6 built-in personas. Same persona runs multiple scenarios.
A "unit" = scenario × persona pair. A 3-scenario × 5-persona audit = 15 units.
Run ai-audit init (interactive) — it creates a starter
scenarios/homepage-smoke.yaml with visit + assert_a11y + see steps.
Edit it for your URL + persona of interest, then ai-audit run.
For scenario syntax: see docs/writing-scenarios.md.
Create personas/my-persona.yaml next to personas/ directory. Built-in
personas come from node_modules/pixelcheck/dist/personas/ and
auto-merge with custom — custom takes precedence on id collision.
For persona syntax: see docs/writing-personas.md.
Yes — repeatable filters:
ai-audit run --scenario login-flow --scenario signup-flow \
--persona us-mobile --persona jp-desktopDefault: reports/<runId>/ next to your cwd. Each run gets a directory:
reports/
20260502_120000_my-tag/
audit.json ← machine-readable, schema_version 1.2.0
audit.html ← static HTML report
audit.pdf ← stakeholder PDF (default ON; --no-pdf to skip)
audit-explorer.html ← interactive SPA
audit.sarif ← (CI mode) SARIF 2.1.0 for GitHub Code Scanning
audit.junit.xml ← (CI mode) JUnit XML for Jenkins / GitLab
audit.jsonl ← (CI mode) line-delimited JSON for `jq`
<persona>__<scenario>/ ← per-unit artifacts (screenshots, console.log, etc)
Override with --out <dir>. Reports are mode 0700 (owner-only) per PRIVACY.md.
See docs/ci-integration.md. Quick patterns:
- GitHub Code Scanning:
--ci-format sarif+ upload viagithub/codeql-action/upload-sarif - Jenkins / GitLab CI:
--ci-format junit+ standard test publisher - PR diff comment:
ai-audit diff <baseline> <pr-run> --format markdown+marocchino/sticky-pull-request-comment
--ci-format auto (default in CI) emits all four formats. Locally it's none.
Yes — see reporter-pdf for the layout. PDF generation is on by default (--pdf is implied); turn off with --no-pdf for headless / CI scenarios that don't need PDFs.
ai-audit trends # auto-discovers history.db in reports/
ai-audit trends --out ./reports # explicitGenerates reports/trends.html with 5 inline-SVG charts (overall score,
pass/warn/fail, issues, cost, per-dimension). See ADR-021.
Only what's sent to the Anthropic Claude API for the audit calls you trigger:
- Page screenshots (with password / secret fields redacted by default)
- DOM summaries (tag tree + visible text)
- Your scenario step text + persona profile fields
- Model name + max_tokens
Nothing else. Zero telemetry. No "phone home". The full data-flow disclosure is in PRIVACY.md.
pixelcheck is honest about sending page content to a third-party
LLM (Anthropic Claude). The first-run prompt is informed consent — see
PRIVACY.md § User consent. Subsequent runs
don't re-prompt unless the consent version bumps.
For CI / non-interactive: AUDIT_AUTO_CONSENT=1 env var or --auto-consent
flag (read PRIVACY.md first, then add it to your runbook).
# A specific run
rm -rf reports/<runId>
# All runs older than 30 days
find reports/ -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
# Wipe ALL local cache state (forces rebuild)
rm -rf ~/.pixelcheck/
# (also wipe legacy backward-compat path if you upgraded from v0.x)
rm -rf ~/.ai-browser-auditor/Anthropic's data-deletion process: https://www.anthropic.com/privacy#user-rights
Passwords / secrets / tokens / API-key inputs are redacted to
******** by default before screenshots. The redaction is a DOM
mutation (input.value = '********'), so the bytes sent to Claude
literally don't contain your secret. Disable only for fixture audits
where redaction interferes:
ai-audit run --no-redact-inputsYou (the operator running ai-audit) are the data controller.
Anthropic is your subprocessor for the Claude API calls. We
(the maintainers) are not in your data path — the tool runs on your
infrastructure.
Detailed position + DPA / sub-processor disclosure / Article 17 deletion flow: PRIVACY.md § GDPR / CCPA position.
Alpine uses musl libc; most prebuilt binaries are glibc-only. Two paths:
- Easier (recommended): switch to
node:20-bookworm-slimDocker image - If you must stay on Alpine:
apk add --no-cache python3 make g++ chromium nss freetype harfbuzz ca-certificates ttf-freefont+PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1+PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/chromium-browser
Full Alpine recipe: docs/INSTALLATION.md § Alpine.
Linux: missing system libraries. Run:
npx playwright install-deps chromiumThis installs libnss3 / libgbm1 / libxshmfence1 / etc. See docs/INSTALLATION.md § Linux.
Recommended: WSL2 for the smoothest experience (treats it as
Linux — npx playwright install-deps works directly). Otherwise:
- Git Bash: works without modification
- PowerShell: env var syntax differs (
$env:ANTHROPIC_API_KEY = "sk-ant-...")
For native Windows: install Visual Studio Build Tools → "Desktop development with C++" workload. This gives node-gyp the MSVC compiler for better-sqlite3 fallback compile.
The bulk is Playwright's Chromium binary download (~150 MB). On slow links / CI:
- Use a regional npm mirror (
npm config set registry https://your-region.mirror) - Pre-cache Chromium and
PLAYWRIGHT_BROWSERS_PATH=/cache/pathskip per-CI download - Air-gapped / restricted: bundle Chromium ahead of time per docs/INSTALLATION.md § Air-gapped install
- Apple Silicon: yes — tier-1 platform, CI matrix runs
macos-14(M-series). Works out of the box. - Linux ARM64: tier-2; prebuilt binaries exist for major deps but coverage varies by glibc version. Try
node:20-bookworm-slimarm64 image. - Windows ARM64: skipped by
package.json os: ["darwin","linux","win32"]cpu filter — npm refuses to install. Use Windows x64 + emulation if absolutely required.
- README — Quick Start
- docs/INSTALLATION.md — install + cross-platform
- docs/TROUBLESHOOTING.md — runtime errors
- PRIVACY.md — data handling
- SECURITY.md — security disclosures
- CONTRIBUTING.md — dev guide
- docs/decisions/ — Architecture Decision Records (26 ADRs)
Last updated: 2026-05-02 (T24 — Wave 3 close)