@answerfox/audit
v0.4.0
Published
Audit engine for the Answerfox SEO toolkit. Crawls a target URL, runs the 50-check framework, and reports findings with evidence + fix recommendations.
Readme
@answerfox/audit
The audit engine for the Answerfox SEO toolkit. Fetches a target URL, parses the HTML, runs every registered check in parallel, and returns a structured report with score, severity-grouped findings, evidence, and fix recommendations.
v0.1.0. Foundations + 33 of 50 audit checks ship today (~63 of 100 score points). The remaining 17 checks land incrementally — see AUDIT-FRAMEWORK.md.
Install
pnpm add @answerfox/auditUsage
import { audit, consoleReport } from '@answerfox/audit';
const report = await audit('https://example.com');
console.log(consoleReport(report));Or pass a pre-parsed DOM in if you already have one (handy in tests and CI):
import { runChecks } from '@answerfox/audit';
import { loadHtml } from '@answerfox/audit/parser';
import { parseAbsoluteUrl } from '@answerfox/core';
const html = '<!doctype html><html lang="en"><head><title>...</title></head>...';
const report = await runChecks({
url: parseAbsoluteUrl('https://example.com'),
html,
dom: loadHtml(html),
});What ships today
| ID | Check | Severity | Pts |
|---|---|---|---|
| A1 | <title> present, 30-60 chars | critical | 3 |
| A3 | Meta description present, 120-160 chars | critical | 3 |
| A4 | Canonical URL declared (absolute) | critical | 3 |
| A5 | <html lang> attribute set | high | 2 |
| C1 | At least one JSON-LD block present and valid | critical | 3 |
Total: 14 points out of the eventual 100. The remaining 45 checks land in follow-up PRs.
Architecture notes
- Static-first parser. Uses cheerio for parsing — fast, no headless browser. SPA support via Playwright lands when needed; the static engine catches everything that matters for server-rendered Next.js sites.
- Polite UA. Every fetch sends
User-Agent: Answerfox/<version> (+https://github.com/Anuj7411/answerfox). - Errors don't crash. A check that throws is captured and emitted as a
skipwith the error message — the audit always completes. - Pure runner + fetching wrapper.
runChecks()takes pre-parsed input (no network),audit()is the convenience wrapper that fetches first. Tests use the pure runner so CI never hits the network.
License
MIT © 2026 Anuj Ojha
