HTML to Markdown Converter — Turn Web Page or Email HTML into README-Ready Markdown
Paste HTML from a web page, email or exported document and get Markdown: GFM tables, checkbox task lists, code fences with a language tag, nested lists and blockquotes. Inline styles and classes are dropped, image URLs are kept as-is, script and style elements disappear, dirty HTML is auto-corrected, and nothing is fetched or uploaded.
What this HTML-to-Markdown conversion keeps — and what it discards
GFM tables, task lists and code languages survive
A <table> becomes a pipe table, checkboxes inside <li> become - [x] / - [ ], and <code class="language-js"> keeps its language as a ```js fence. A checkbox outside a list item only yields the escaped text \[x].
Styles and classes are dropped, image URLs are kept
style, class, id and other presentational attributes are not carried over, only structure and semantics. <img> becomes  with the original remote URL; nothing is downloaded or re-hosted.
Script, style and embeds are removed
<script> and <style> disappear together with their contents, <iframe> collapses to an empty []() link while <video> is dropped. HTML comments survive in the Markdown as <!-- -->.
Nested lists and blockquotes are preserved
Nested <ul>/<ol> keep their hierarchy with two-space indentation, nested <blockquote> becomes > >, and a custom step unwraps <p> inside <li> so no extra blank lines appear.
Dirty HTML works and everything stays local
parse5 auto-corrects unclosed tags, so you can paste a fragment or a whole <html> document without tidying it first; head elements such as <title> are ignored. There is no URL fetching, no upload and no server — the result appears in a read-only textarea to copy.
HTML to Markdown FAQ
Which conversion library does it use?
A unified 11 pipeline: rehype-parse 9 (parse5) parses the HTML, a small custom visitor unwraps <p> inside <li>, rehype-remark 10 (hast-util-to-mdast) turns the tree into Markdown, and remark-stringify 11 with remark-gfm 4 writes it out.
Are tables, task lists and code-block languages restored?
Yes for tables (pipe tables with a header separator), task lists (checkboxes inside <li> become - [x] / - [ ]) and code language (class="language-js" becomes a ```js fence). A checkbox that is not inside a list item comes out as the escaped text \[x].
What happens to inline styles, classes and images?
style, class and other presentation attributes are dropped; only structure and semantics remain. Images keep their original URL as , with no download or re-hosting, so a link that needs authentication will not resolve later.
Are script, style and iframe contents removed?
<script> and <style> are removed with their contents. <iframe> becomes an empty []() link and <video> vanishes. HTML comments are not stripped — they survive as <!-- --> in the Markdown, which may be unwanted in a README.
Are nested lists and blockquotes handled?
Yes. Nested lists keep their level with two-space indentation, nested blockquotes become > >, and <p> tags inside list items are unwrapped by a custom plugin to avoid extra blank lines.
Do I need to clean up the HTML first?
No. parse5 auto-corrects unclosed tags and stray fragments, and both a snippet and a full <html> document are accepted; head elements such as <title> are ignored. Output may still be normalized, so read it once before committing.
Can it fetch a URL, and is anything uploaded?
No URL fetching and no upload. The page runs entirely in your browser; paste HTML (or use the paste shortcut, which reads text/html from the clipboard) and read the Markdown from a read-only textarea. Pasting plain text falls back to the text/plain clipboard data.

