Convert any web page to clean, LLM-ready Markdown. Strip ads, scripts, and chrome. Perfect for feeding pages to ChatGPT, Claude, or training data.
LLMs were trained on Markdown and plain text far more than they were trained on HTML. Every time you paste a web page into ChatGPT or Claude as raw HTML, you're burning 70–90% of your context window on `<div>`, `<script>`, inline styles, and tracking pixels — and confusing the model with structure it has to discard. This tool fetches any public URL, strips the noise, and returns clean Markdown that's 5–10x smaller, semantically equivalent, and exactly what LLMs want.
## Why Markdown beats HTML for LLM context
Tokenisation is the issue. A typical web page is 80–200KB of HTML, which tokenises to 30,000–80,000 tokens — enough to blow past the context window of GPT-4o-mini, Claude Haiku, or any cheap model. The same page in Markdown is usually 5,000–15,000 tokens. You get the same content at 10–25% of the cost.
Beyond cost, LLMs reason more cleanly over Markdown. They don't have to decide whether a `<span class="product-title-v2">` is meaningful structure or vestigial framework chrome. Markdown is unambiguous: `#` is a heading, `-` is a list item, `[text](url)` is a link. No tag soup to parse around.
## How we strip the noise
Our converter removes `<script>`, `<style>`, `<noscript>`, `<svg>`, `<iframe>`, and HTML comments first. Then it walks the remaining DOM, converting headings, paragraphs, lists, links, code blocks, and images to their Markdown equivalents. Inline `<strong>`, `<em>`, `<code>` are preserved as `**bold**`, `*italic*`, `` `code` ``. Everything else is stripped to plain text.
This isn't a full Readability-style content extractor (we don't guess which `<div>` is the article body and which is the sidebar). That's deliberate — for LLM consumption you usually want the full page text, and the LLM is better at filtering than any heuristic. If you need article-only extraction, run the Markdown output through a follow-up prompt: "Extract just the main article from this Markdown."
## When to use this
- **Feeding pages to LLMs**: paste the Markdown into ChatGPT/Claude instead of HTML - **RAG pipelines**: cleaner embeddings (no HTML tag noise to dilute semantic vectors) - **Documentation pipelines**: turn old blog posts into Markdown for your docs site - **Training data prep**: scrape + clean a corpus for fine-tuning - **Archive**: save articles as Markdown — survives reformats, easy to grep
## What it doesn't do (yet)
We don't execute JavaScript. For SPAs that render content client-side (most React/Vue blogs), you'll see the empty shell, not the rendered text. Use a headless-browser converter for those — or, better, ask the site for an RSS feed which already serves clean content. For static-rendered sites (most editorial, news, docs) this tool works perfectly.
Also: we don't respect paywalls or login gates. If the page returns 200 with "please subscribe" content, that's what you'll get. That's a feature of the underlying page, not a bug in this tool.
LLMs perform far better on Markdown than HTML. Feeding a 200KB HTML page to ChatGPT wastes 80% of your context window on tags and JavaScript. The same page in Markdown is 10–20KB of pure semantic content — same information, 10x cheaper, no parsing confusion.
We fetch the URL with a `LemWatchURL2MD/1.0` user-agent and a 15-second timeout. The raw HTML is run through a small regex-based pipeline: strip `<script>`, `<style>`, `<noscript>`, `<svg>`, `<iframe>` and HTML comments; convert `<h1>` through `<h6>` to `#`–`######`; convert `<p>`, `<br>`, block elements to newlines; convert `<ul>`/`<ol>`/`<li>` to `- ` bullets; convert `<strong>`/`<b>` to `**`, `<em>`/`<i>` to `*`, `<code>` to backticks, `<pre>` to fenced code blocks; convert `<a href>` to `[text](url)`; convert `<img>` to ``. Remaining tags are stripped, common HTML entities decoded, and whitespace collapsed. We deliberately do not run a heuristic content-extractor — your LLM is better at separating signal from noise than any regex.
No — we fetch the static HTML only. For SPAs (React, Vue, Angular sites where content is rendered client-side), you'll see the empty shell. Use a headless-browser-based converter for those, or find the page's API/RSS endpoint.
Yes — we strip all `<script>` and HTML before conversion, so no executable content survives. Treat the output as untrusted text (don't blindly render or eval), same as any web-sourced content.
Up to ~5MB of HTML in a single request. Larger pages may time out at the 15-second fetch limit.
Yes, automatic up to the default fetch redirect limit (~20 hops). The final URL is returned in the result.
Either the site rendered it with JavaScript (see Q1), or our regex stripped it as noise. Common false positives: text inside `<svg>` (we strip SVG entirely) or text rendered via CSS pseudo-elements.