Skip to main content

🩺 Site Health Checker

Tests PyPI Python License: MIT

Audit any website for accessibility and broken links in one command, with a report anyone can understand.

Site Health Checker crawls your whole site and finds the problems that shut out users with disabilities, frustrate visitors and hurt SEO:

  • ♿ Accessibility (WCAG) problems, explained in plain English with how to fix each one, plus an overall score out of 100
  • ❌ Broken links: 404s, 500s and links that don't respond, plus the page each one appears on
  • 🐢 Slow pages
  • 🔀 Redirect chains: links that bounce through 2+ redirects
  • 🏷️ Missing page titles

You get a clean HTML report you can hand to a developer, a manager or a client, plus JSON for CI pipelines.

Sample report


🚀 Quick Start

pip install site-health-checker

site-health-checker https://example.com

Then open site-health-report.html in your browser.

Site Health Report for https://example.com/
Crawled 6 pages and checked 7 links in 2.3s

  ✗ Accessibility score: 69/100 (17 issues on 3 pages)
         5  Image has no alt text [critical]
         3  Form field has no label [critical]
         1  Button has no text [critical]
         3  Zooming is disabled [serious]
         2  Link has no text [serious]
  ✗ Broken links: 2
           404  https://example.com/careers
  ✓ Slow pages: 0
  ✓ Redirect chains: 0
  ✓ Pages missing a title: 0

♿ Accessibility Checks

Why it matters: accessibility is a legal requirement in more and more places (such as the European Accessibility Act and the ADA in the US), and around 1 in 6 people worldwide lives with a disability.

Check Severity WCAG
Image has no alt text Critical 1.1.1
Form field has no label Critical 1.3.1 / 4.1.2
Button has no text Critical 4.1.2
Link has no text Serious 2.4.4
Page language is not set Serious 3.1.1
Zooming is disabled on mobile Serious 1.4.4
Page title is missing (reported separately) 2.4.2
Page has no main heading (h1) Moderate best practice
Heading levels are skipped Moderate best practice

Every issue in the report comes with why it matters and how to fix it, written for people who aren't accessibility experts.

The score: each page starts at 100 and loses 10 points per critical issue, 5 per serious and 2 per moderate. The site score is the average across all pages.

Honest note: automated checks catch many of the most common problems, but no tool can prove a site is fully accessible. Color contrast, keyboard navigation and how the page sounds in a screen reader still need a manual review. Use this tool to find and fix the obvious issues fast, then test by hand.

The checker avoids false alarms: alt="" on decorative images, hidden inputs, submit buttons, fields wrapped in a <label> and aria-label/aria-labelledby are all treated as valid.


⚙️ Options

Option Default What it does
--max-pages N 100 Maximum number of pages to crawl
--workers N 10 Number of parallel requests
--timeout SEC 10 Seconds to wait for each request
--slow SEC 2 Load time above which a page counts as slow
-o, --output PATH site-health-report.html Where to save the HTML report
--json PATH off Also save all results as JSON
--min-score N off Exit with code 1 if the accessibility score is below N
--no-fail off Always exit with code 0
--version Show the version
site-health-checker mysite.com --max-pages 500              # bigger crawl ("https://" is added for you)
site-health-checker https://mysite.com --slow 1 -o audit.html  # stricter speed check, custom report name
site-health-checker https://mysite.com --json results.json  # machine-readable output

🔄 Use It in CI/CD

Option 1: GitHub Action (easiest)

Add this step to any workflow, with nothing to install:

- name: Check website health
  uses: Reenakotadiya/site-health-checker@v2.0.0
  with:
    url: https://staging.mysite.com
    min-score: 90        # optional: fail if the accessibility score drops below 90
Input Default What it does
url (required) Website to check
max-pages 100 Maximum pages to crawl
min-score none Fail the step if the accessibility score is below this
fail-on-problems true Set to false to report without failing the build
report-path site-health-report.html Where to save the HTML report

The results also appear as a summary table on the workflow run page, and the step exposes accessibility-score and broken-links as outputs. To keep the HTML report, add an upload step:

- uses: actions/upload-artifact@v4
  if: always()
  with:
    name: site-health-report
    path: site-health-report.html

Option 2: Any CI tool (Jenkins, GitLab, Azure DevOps…)

The tool exits with code 1 when broken links are found, or when the accessibility score drops below --min-score, and with code 2 if the website can't be loaded at all (site down, typo in the address), so any pipeline can block a release with it:

pip install site-health-checker
site-health-checker https://staging.mysite.com --min-score 90 --json results.json

🧠 How It Works

  1. Starts at your URL and follows its redirects, so http:// → https:// and www are handled
  2. Crawls every page on the same domain (breadth-first, in parallel), up to --max-pages
  3. Respects robots.txt, so pages the site asks bots not to visit are skipped
  4. Runs the accessibility checks on every HTML page
  5. Checks every link found, internal and external, once each (HEAD first, falling back to GET for servers that reject HEAD)
  6. Writes the HTML report, the JSON output and a console summary

Pages rendered only by JavaScript (single-page apps) are checked as the server sends them.


🧪 Development

git clone https://github.com/Reenakotadiya/site-health-checker.git
cd site-health-checker
pip install -e ".[dev]"
pytest

Almost 50 tests cover every accessibility rule (including the cases that must not be flagged), and a small local website with known problems tests the crawler end to end, with no internet needed.


🤝 Contributing

Issues and pull requests are welcome! On the roadmap:

  • Color contrast checks using a headless browser
  • Duplicate IDs, and missing skip-to-content links
  • Sitemap.xml support
  • A PDF version of the report

📄 License

MIT © Reena Kotadiya


👩‍💻 Author

Reena Kotadiya, QA Automation Engineer

LinkedIn

💼 Need a website accessibility audit or test automation for your project? Let's connect on LinkedIn.

Metadata

Release files for site-health-checker 2.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for site-health-checker 2.0.1
File Size Uploaded
site_health_checker-2.0.1.tar.gz 22.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for site-health-checker 2.0.1
File Interpreter ABI Platform
site_health_checker-2.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 40.3 kB

Release files / site_health_checker-2.0.1.tar.gz

Download URL site_health_checker-2.0.1.tar.gz
Size 22.3 kB
Tags Source
SHA-256 checksum
How to use checksums
1b56fb7a95d94780254076a398d92bf7992dd0d66ceb128ea9f2b2ec56a68744
BLAKE2b-256 checksum
How to use checksums
d72afd68457de8281573702b4b44452f779dd7245e4ee7d22b66a95edd409f3d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / site_health_checker-2.0.1-py3-none-any.whl

Download URL site_health_checker-2.0.1-py3-none-any.whl
Size 18.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a3904ea92743376b16db89e812bf4abc9913cbdf73fad4c9d2feb345fe690af1
BLAKE2b-256 checksum
How to use checksums
87dd0edb54ec2208d5e9fc78e0e32af1e0c8600ce0c03db20d7732ccb11cac28
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release history Release notifications | RSS feed

2.1.1

2 release files

2.1.0

2 release files

This release

2.0.1 This release

2 release files

2.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page