SS Toolbox
SS Toolbox
All data is processed locally

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

  1. 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].

  2. 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 ![alt](src "title") with the original remote URL; nothing is downloaded or re-hosted.

  3. 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 <!-- -->.

  4. 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.

  5. 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 ![alt](src "title"), 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.

Related Tools
SponsorMindElixir