100% local — your data never leaves your browser

HTML to Markdown — Turn a Page Into Notes

Paste HTML and get Markdown: headings, lists, links, fenced code and tables that stay tables, ready for a README, a wiki or your notes.

Instant Private Zero cookies
Headings
Bullets

HTML input

Markdown output

What this tool does

HTML goes in, Markdown comes out.

<h1>Title</h1>
<p>Some <strong>bold</strong> and a <a href="https://x.dev">link</a>.</p>
<ul><li>one</li><li>two</li></ul>
# Title

Some **bold** and a [link](https://x.dev).

*   one
*   two

Headings are ATX unless you ask for setext, bullets are * unless you ask for -, and a <pre><code class="language-js"> keeps its language on the fence.

A table stays a table

<table><tr><th>Name</th><th>Role</th></tr><tr><td>Ada</td><td>Author</td></tr></table>
| Name | Role |
| --- | --- |
| Ada | Author |

Turndown has no rule for <table>: until this page was written, a table came out as its cells, one line under the other, and nothing in the result said a grid had been there. That is the worst kind of defect — output that reads as if it were fine. The rule now writes a GFM table, and a table with no <th> takes its header from the first row, because GFM has no headerless table.

A script is not a paragraph

<p>Hello</p><script>alert(1)</script>
Hello

The body of a <script> is code the browser runs, not text it displays, and it was being copied into your document as prose. <style> did the same with CSS. Both are removed. Everything the page actually shows you is kept.

What a pipe table cannot hold

A GFM table is a grid of single-line cells, so four things are flattened rather than dropped:

  • colspan and rowspan. The cell keeps its own column and the rest of the span stays empty; the rows under a rowspan shift one column to the left.
  • A table inside a cell. GFM has no nested tables, so the inner one is written inline in its cell, pipes escaped.
  • Paragraphs and lists inside a cell. They are joined onto a single line.
  • <caption>. It has no place in a pipe table, so it becomes a paragraph just above it rather than disappearing.

Everything else — the order of the blocks, the text, the links — comes through as it was.

Private by design

Everything runs locally in your browser with JavaScript. Your data is never uploaded, which makes the tool safe for sensitive content, and it keeps working offline.

Frequently asked questions

Are HTML tables supported?
Yes, as GFM pipe tables. They were not until this page was written: turndown, the library behind the converter, has no rule for `<table>`, so a table came out as its cells one line under the other with nothing to signal the loss. A table with no `<th>` takes its header from the first row, since GFM has no headerless table.
Why is the content of my `<script>` gone?
Because it was never text. The body of a `<script>` is code the browser runs, and it was landing in the middle of your document as if it had been a paragraph — `alert(1)` and all. `<script>` and `<style>` are dropped now. Everything the page actually displays is kept.
Which Markdown does it produce?
GitHub Flavored Markdown. ATX headings (`# Title`) by default, setext (underlined) on request; `*` bullets or `-`; fenced code blocks that keep the language from `class="language-js"`. Links and images keep their URL exactly as written, relative ones included.

Related converters