Skip to main content

Remove boilerplate from scraped markdown before it reaches an LLM. Subtractive-only, auditable, zero dependencies.

Project description

Winnow

Remove boilerplate from scraped markdown before it reaches an LLM.

Scraping and extract APIs like Tavily hand you "LLM-ready" markdown that still carries navigation, footers, cookie banners, promos, and link farms — 10–90% of the tokens depending on the page. The same goes for your own scraper or loader pipeline: if it produces markdown (or HTML converted to markdown), Winnow slots in right after it — any markdown in, leaner markdown out, with a receipt for every removed block.

  • Subtractive-only. Winnow deletes blocks; it never rewrites a word. Zero hallucination risk by construction.
  • Recall-first. Dropping real content is data loss; keeping boilerplate just costs tokens. When uncertain, Winnow keeps.
  • Auditable. Every removed block comes back with a reason code and score.
  • Template memory. Feed Winnow multiple pages from one site and it learns the site's template — blocks repeated across pages are boilerplate, near-certainly.
  • Zero runtime dependencies. pip install winnow-md adds nothing else.

Quickstart

import winnow

# One page, heuristics only
res = winnow.clean(markdown_text)
print(res.markdown)          # cleaned markdown
print(res.stats)             # tokens before/after, reduction %
for r in res.removed:        # the receipt
    print(r.reasons, r.text[:60])

# A crawl — template memory kicks in across pages of the same domain
w = winnow.Winnow(aggressiveness=0.5)
results = w.clean_many(pages)          # list of markdown strings (or (md, url) tuples)

# Streaming with a persistent per-domain template store
w = winnow.Winnow(store="winnow.db")
res = w.clean(md, url="https://example.com/post/1")
winnow clean page.md                     # cleaned markdown to stdout
winnow clean ./crawl/ --report out.html  # batch + side-by-side audit report

Jina Reader output (Title: / URL Source: preamble) is auto-detected and the source URL is used for template memory.

Benchmark

Five generations of independently-labeled, adversarially-arbitrated exam batches (each fetched fresh, dual-labeled blind, disputes refereed) — ~12,000 hand-adjudicated blocks across 21 domains:

Exam batch Content recall Junk recall Token cut
batch 5 (newest, still converging) 0.956 0.61 −42%
batch 4 0.979 0.59 −49%
batch 3 0.992 0.56 −35%
batch 2 0.997 0.55 −30%
batch 1 1.000 0.66 −41%

Add --url-mode strip for roughly 15 additional points of token cut with zero text loss. use_model=True (extra: pip install winnow-md[model]) adds a learned block-sequence scorer that raises junk recall further and is structurally incapable of deleting a block on its own.

The benchmark harness, labeling pipeline, and mutation self-test live in bench/ — see ARCHITECTURE.md.

Project details


Download files

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

Source Distribution

winnow_md-0.1.0.tar.gz (360.4 kB view details)

Uploaded Source

Built Distribution

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

winnow_md-0.1.0-py3-none-any.whl (354.1 kB view details)

Uploaded Python 3

File details

Details for the file winnow_md-0.1.0.tar.gz.

File metadata

  • Download URL: winnow_md-0.1.0.tar.gz
  • Upload date:
  • Size: 360.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","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":null}

File hashes

Hashes for winnow_md-0.1.0.tar.gz
Algorithm Hash digest
SHA256 fcc66bc29c907fbb1b4c6dadc3dcac36a436e1907bf5152a83b9a4c97c6518b4
MD5 056f308960a0fb4965ad2c9afa249ded
BLAKE2b-256 dc00def013a4196d3315c4ffe4499623248f6c34439df34f9ac5c8ecb74023a0

See more details on using hashes here.

File details

Details for the file winnow_md-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: winnow_md-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 354.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","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":null}

File hashes

Hashes for winnow_md-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4bf08b922f4d750a4ae5fb0705dd5233eda0ae8e86b8d9ece2a75070ad313bcf
MD5 adc2602ad687f6094cff891973c9cdec
BLAKE2b-256 e7947f7c1dcac1e90cedcd177f1d88db90eeb98092924c6081ee64959d58a642

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page