How HealthAuditor works
Every number in a HealthAuditor report can be recalculated by hand. This page documents the data we collect, the scoring maths, the prioritisation formula and — just as importantly — the things this tool cannot see. Ruleset version 0.2.0 contains 60 rules.
1. What happens when you run an audit
- Your URL is validated and normalised (private and internal addresses are rejected).
- We request the page from our server, following redirects and recording every hop.
- The HTML is parsed; images, scripts, stylesheets, fonts, iframes and links are extracted.
- Each resource is measured with a real HEAD or ranged GET request — sizes are never estimated.
- robots.txt and the sitemap are fetched, and discovered links are probed for their status code.
- If a PageSpeed Insights API key is configured, a Lighthouse mobile run adds Core Web Vitals (LCP, CLS, TBT, Speed Index) and field INP when Chrome UX data exists.
- Every rule runs against that collected context and returns pass, fail or not-applicable.
2. How the scores are calculated
Category score
Each rule carries a weight derived from its severity: critical = 10, high = 6, medium = 3, low = 1. A category score is the share of that weight which passed:
categoryScore = 100 × (weight of passing rules ÷ weight of applicable rules)
Rules that do not apply to your page (for example form-label checks on a page with no forms) are excluded from both sides of the division, so they can neither help nor hurt your score.
Performance blending
When Lighthouse data is available the performance score is 60% measured Lighthouse score + 40% HealthAuditor resource rules. Without an API key it is the rule score alone, and the Core Web Vitals rules are marked not applicable rather than guessed.
Overall health score
Performance × 0.3 SEO × 0.2 Accessibility × 0.2 Best Practices × 0.1 Security × 0.2
The overall score is the weighted mean of the category scores, renormalised over the categories that produced a score. 90+ is good, 50–89 needs improvement, below 50 is poor. It is a HealthAuditor score, not a Google ranking.
3. How findings are prioritised
priority = impact(severity) × reach(occurrences) × effort × categoryWeight impact: critical=10 high=7 medium=4 low=2 reach: 1 + log10(affected elements) ÷ 2, capped at 2 effort: easy=1.3 medium=1 hard=0.75
Quick wins are findings with an easy fix, a severity above “low”, and a priority score of at least 5. When one underlying problem is detected by more than one rule it is counted once (deduplicated by a stable key), so the same issue never damages your score twice.
4. What we check
- PerformancePERF-IMG-001, PERF-IMG-002, PERF-IMG-003, PERF-IMG-004, PERF-001, PERF-002, PERF-003, PERF-004, PERF-005, PERF-006, PERF-007, PERF-CWV-001, PERF-CWV-002, PERF-CWV-003
- SEOSEO-001, SEO-002, SEO-003, SEO-004, SEO-005, SEO-006, SEO-007, SEO-008, SEO-009, SEO-010, SEO-011, SEO-012, SEO-013, SEO-014, SEO-015
- AccessibilityA11Y-001, A11Y-002, A11Y-003, A11Y-004, A11Y-005, A11Y-006, A11Y-007, A11Y-008, A11Y-009, A11Y-010, A11Y-011
- Best PracticesBP-001, BP-002, BP-003, BP-004, BP-005, BP-006, BP-007, BP-008
- SecuritySEC-001, SEC-002, SEC-003, SEC-004, SEC-005, SEC-006, SEC-007, SEC-008, SEC-009, SEC-010, SEC-011, SEC-012
Every rule is documented — ID, severity, why it matters, how it is detected and how to fix it — in docs/RULES.md in the repository.
5. Limitations — what HealthAuditor cannot detect
- We audit a single URL. Site-wide problems such as duplicate titles across pages are out of scope for now.
- The page is not rendered in a browser by HealthAuditor itself, so content added by JavaScript is invisible to the static rules (that is exactly why we report thin server HTML as a finding).
- Colour contrast can only be computed for inline styles; contrast defined in CSS files needs a renderer.
- Keyboard traps, screen-reader semantics in practice, and visual design problems need human testing.
- Security checks look only at observable configuration. Passing them means “no issues detected in the checks performed” — never that a site is secure.
- External links that block bots are reported as unverified, not broken.
- Resource measurement is capped per audit to keep runs fast; skipped resources are listed in the report notes.
6. Privacy
- Sign in by email to use 10 free audits. Supabase stores your account, audit usage and Razorpay subscription reference.
- Audits run on demand; the URL and the report are returned to your browser and cached in server memory for up to two minutes to avoid duplicate work. Reports are not persisted to a database.
- Page content is held in memory for the duration of the audit only.
- If a PageSpeed Insights key is configured, the audited URL is sent to Google's PageSpeed Insights API. Supabase handles authentication and account storage; Razorpay handles recurring payments. Card details are entered in Razorpay checkout, not stored by HealthAuditor.
- Your sign-in session is stored in your browser. Deployment analytics may also be enabled.
- False-positive reports you submit contain the rule ID, the URL and your explanation, and are logged server-side.