PagePatrol
Open-source, local-first QA agent for web pages.
PagePatrol opens your page in a real browser at phone and desktop sizes and looks for the problems people actually run into: text that overlaps or gets cut off, text that is too small or too faint to read, layouts that scroll sideways on a phone, broken images and links, JavaScript errors and failed requests. Every finding comes with a screenshot that shows where it is.
Everything runs on your machine. No account, no API key needed for the checks below. LLM-driven scenario testing with your own key is on the way.
Status: early development. Expect rough edges and breaking changes.
Quick start
uv tool install pagepatrol # or: pipx install pagepatrol
pagepatrol install # one-time: download Chromium
pagepatrol check https://example.com
pagepatrol check ./site/index.html --open
pagepatrol check localhost:3000 -v mobile -v tablet -v 1440x900
check prints a summary and writes a report to .pagepatrol/runs/<time>/:
report.htmlwith marked-up screenshots per viewportreport.jsonwith every finding, for scripts and CIscreenshots/with clean and annotated full-page captures
It exits with code 1 when it finds errors, so it can gate a CI job. Use
--fail-on warning to be stricter or --fail-on never to only report.
What it checks
| Check | Level | |
|---|---|---|
overlap |
error / warning | Text on top of text, or text and controls covering each other |
horizontal-overflow |
error | Elements that make the page scroll sideways |
viewport-meta |
error | No <meta name=viewport>, so phones show the desktop layout zoomed out |
broken-image, broken-link |
error | Images that don't load, links that return 404/410/5xx |
js-exception, console-error |
error | Uncaught exceptions and console errors |
http-error, failed-request |
error | Resources that fail or return 4xx/5xx |
clipped-text |
warning / info | Text cut off by its container |
small-text |
warning | Text below 12px |
axe/* |
warning / info | WCAG 2.2 A/AA rules from axe-core, including color contrast |
Errors mean something is broken. Warnings are real quality problems on a page that still works. Notes are worth a look but may be intentional.
Development
Requires uv.
uv sync
uv run playwright install chromium
uv run pytest
uv run ruff check . && uv run ruff format --check .
tests/fixtures/ holds small pages that are broken on purpose, one per check.
If you add a check, add a fixture that proves it fires and, where it makes
sense, one that proves it stays quiet.
License
MIT. Bundles axe-core
(MPL-2.0), see src/pagepatrol/checks/vendor/axe-core.LICENSE.
Metadata
Release files for pagepatrol 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pagepatrol-0.1.0.tar.gz | 208.6 kB | Without provenance | Details for pagepatrol-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pagepatrol-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for pagepatrol-0.1.0-py3-none-any.whl |
Total release size: 420.8 kB
Release files / pagepatrol-0.1.0.tar.gz
| Download URL | pagepatrol-0.1.0.tar.gz |
|---|---|
| Size | 208.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a1a34c4eca0d22cccd35365b40f17fec4bfb15da22c1b08a748599a4455d67ee
|
|
BLAKE2b-256 checksum How to use checksums |
58da7c422e4438623009987d94a5a3608ac85024929b5ed1c518d622a24672fb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / pagepatrol-0.1.0-py3-none-any.whl
| Download URL | pagepatrol-0.1.0-py3-none-any.whl |
|---|---|
| Size | 212.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a5cfc3311b7d70eae9ffedb318409d50b263935b17d4d102dc258432ea21c045
|
|
BLAKE2b-256 checksum How to use checksums |
ea0c594f29b40f54f01d71984f9bcdefe13f84b95c033fb050699d6597ce0209
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for pagepatrol 0.1.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.