perusal
The internet without all the 💩
pip install perusal
perusal https://en.wikipedia.org/wiki/Domino # -> clean Markdown on stdout
perusal ./saved-page.html # a local HTML file works too
perusal report https://example.com # HTML-vs-Markdown size / token savings
perusal url1 url2 url3 # -> one combined Markdown digest
echo '<h1>hi</h1>' | perusal - # read HTML from stdin
Pages pass through the domonic Readability and Turndown ports: fetch →
readable-article extraction → Markdown → cleanup, with optional relevance
ranking (--query) and a hard character budget (--max-chars).
Pages that render client-side (an empty server response, "Enable JavaScript to view this content") need their own JavaScript actually run first:
pip install 'perusal[js]'
perusal https://example.com/app --js # runs the page's <script>s via myjs first
The reader-browser
pip install 'perusal[browser]'
perusal browse # tabbed webview reader
perusal browse https://en.wikipedia.org/wiki/Domino
A small tabbed reader-browser (history, incognito tabs, bookmarks, DevTools,
adjustable type, Wikipedia math rendering, "save page as Markdown") with
keyboard shortcuts: ⌘/Ctrl+T new tab, W close tab, R reload, D
bookmark, B toggle bookmarks, U view page source, L focus the URL bar.
DevTools (the </> button): raw page Source, a static Resources
inventory (every referenced script/stylesheet/image/iframe, each viewable in
turn), and an Info tab with IP / reverse DNS / WHOIS / DNS records
(hand-rolled clients, no new dependency) plus certificate-transparency-log
subdomain discovery via crt.sh. Purely passive and manually triggered — no
port scanning, no active brute-forcing, nothing sent to the site itself
beyond the page fetch perusal already made.
MCP server (optional)
pip install 'perusal[mcp]'
perusal mcp # stdio MCP server
One read-only, idempotent tool — web_read(url, query?, max_chars?, timeout?) —
built on the official Python MCP SDK. Point an MCP client at perusal mcp.
See the full documentation.
Metadata
Release files for perusal 0.0.5
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 |
|---|---|---|---|---|
| perusal-0.0.5.tar.gz | 33.2 kB | Without provenance | Details for perusal-0.0.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| perusal-0.0.5-py3-none-any.whl | Python 3 | none | any | Details for perusal-0.0.5-py3-none-any.whl |
Total release size: 66.9 kB
Release files / perusal-0.0.5.tar.gz
| Download URL | perusal-0.0.5.tar.gz |
|---|---|
| Size | 33.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
02919238f2c727571e55eba18881826b948082d632c9c968cca64c6f0faaceb9
|
|
BLAKE2b-256 checksum How to use checksums |
eb01cea5a038dfee580e48443cdb1c695d28e5440c3a70ea4b55fe0fb38028e0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.12
|
Release files / perusal-0.0.5-py3-none-any.whl
| Download URL | perusal-0.0.5-py3-none-any.whl |
|---|---|
| Size | 33.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
04865a9b6ce0ead3e54464f286c1d059cd9d022d36c0d7f3a85f3f3c24c9583b
|
|
BLAKE2b-256 checksum How to use checksums |
ae371f46a916906afcc4ae2b09302bf1a9bc03d58c8439990426fcd3f9cf3888
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.12
|
Security for perusal 0.0.5
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.