Skip to main content

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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

perusal-0.0.5.tar.gz (33.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

perusal-0.0.5-py3-none-any.whl (33.6 kB view details)

Uploaded Python 3

File details

Details for the file perusal-0.0.5.tar.gz.

File metadata

  • Download URL: perusal-0.0.5.tar.gz
  • Upload date:
  • Size: 33.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.12

File hashes

Hashes for perusal-0.0.5.tar.gz
Algorithm Hash digest
SHA256 02919238f2c727571e55eba18881826b948082d632c9c968cca64c6f0faaceb9
MD5 5d5cede1e2f3be8d01b8398607445d1c
BLAKE2b-256 eb01cea5a038dfee580e48443cdb1c695d28e5440c3a70ea4b55fe0fb38028e0

See more details on using hashes here.

File details

Details for the file perusal-0.0.5-py3-none-any.whl.

File metadata

  • Download URL: perusal-0.0.5-py3-none-any.whl
  • Upload date:
  • Size: 33.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.12

File hashes

Hashes for perusal-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 04865a9b6ce0ead3e54464f286c1d059cd9d022d36c0d7f3a85f3f3c24c9583b
MD5 1cc18feac4e5995e6dfd18221a55b909
BLAKE2b-256 ae371f46a916906afcc4ae2b09302bf1a9bc03d58c8439990426fcd3f9cf3888

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.0.5 This release

2 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