HTML to Markdown

Turn pasted HTML into Markdown that keeps its links, lists, and tables.

Your inputs stay on your deviceFREE · NO SIGN-UP
Page address
Links
Tables

Result

Start typing and the result appears here. No button needed.

THE LITTLE DETAILS

HTML to Markdown, without the extra steps.

Paste HTML - a copied article, a CMS field, an email template - and get Markdown with its headings, links, nested lists, code blocks and tables intact, beside a preview of how that Markdown renders. The three things converters usually break are the three this one is built around: a table becomes a pipe table with its alignment, a nested list keeps its levels, and bold or code inside a link stays inside the link. Anything Markdown genuinely cannot express is counted and named on the page rather than disappearing.

How to use this tool

  1. 1Paste the HTML. The Markdown appears as you paste, with a preview beside it.
  2. 2Choose how links are written, and whether tables become pipe tables.
  3. 3Copy the Markdown, and read what the page says was left behind.

When HTML to Markdown is the right tool

  • An article you copied out of a CMS has to go into a repository as a .md file.
  • A documentation page needs moving to a static site generator that only reads Markdown.
  • You want a pricing table off a web page as a pipe table you can edit in a text editor.
  • An LLM prompt needs the contents of a page as text, but headings and links have to survive.
  • A newsletter template written in HTML is being rewritten as Markdown for a different sender.
  • You are checking what an editor's "source view" actually produced before committing it.

Tables, nested lists, and links with formatting inside them

These are the three places converters break, so the input is parsed into a document before anything is written. A table becomes a pipe table with its column alignment carried across, and a cell spanning two columns is padded out so the grid stays rectangular rather than collapsing. A list inside a list keeps its level, indented by the width of its parent's marker. Bold, code, and images inside a link stay inside the link, because the link is written from the tree rather than by pattern matching.

What Markdown cannot hold is counted, not dropped

A merged table cell, a table inside a table cell, and a definition list have no Markdown syntax at all. Each is converted as closely as it can be - the merged cell keeps its text and the grid is padded, the definition term becomes bold - and then the page tells you how many there were, so you know where to look. Superscript and subscript are the exception that is kept as HTML, because turning x squared into x2 silently changes what the text says.

Relative links need the address of the page they came from

A copied page is full of links like /pricing and images like /img/logo.png, which mean nothing once the text is somewhere else. Paste the page's address and every one of them is rewritten as an absolute URL. The resolution is arithmetic on two addresses and nothing is ever requested - no page is fetched, no image is loaded. If the pasted HTML names its own address in a base tag, a canonical link, or an og:url, the field fills itself in from that.

The text comes out as text, not as accidental syntax

A price of 5 * 3, a note in [square brackets], a line starting with a hyphen, a paragraph opening with 1. - all of those are ordinary words in HTML and all of them are syntax in Markdown. Each is escaped so the output means what the input meant. Underscores are the exception: one inside a word is left alone, so MAX_RETRIES and snake_case_name stay readable rather than being littered with backslashes.

GOOD TO KNOW

A few quick answers.

Paste the HTML. The Markdown appears as you paste, with a preview beside it. Choose how links are written, and whether tables become pipe tables. Copy the Markdown, and read what the page says was left behind.

Tool inputs are processed in your browser. Crate has no upload endpoint and no accounts. Downloaded site assets and a cookie-free page-view count still require a connection; your files and text are not included in those requests.

Markdown has no syntax for a merged table cell, a table inside a table, or a definition list, so each of those is converted as closely as it can be and the count is reported. Superscript and subscript are kept as the HTML they came in as. Relative links stay relative unless you give the page address to resolve them against. A javascript: or data:text/html destination is dropped and the words of the link are kept. Nothing in the input is ever executed, fetched, or rendered.

A pipe table has no way to express one. The cell's text is kept in its first position and the rest of the span is filled with empty cells, so the columns still line up and nothing is lost from the page - and the number of merged cells is reported underneath. If the table matters more than the syntax, switch tables to Leave as HTML: most Markdown renderers pass an HTML table straight through, merged cells and all.

Because that is what the HTML said, and guessing which site it came from would be inventing information. Paste the address of the page you copied from into Page address and every relative link and image is resolved against it. Nothing is fetched to do this. If the HTML you pasted includes the page's own canonical link or a base tag, the field is filled in for you.

Inline is the default and is what most people want. A reference list moves every destination to the bottom as [1], [2] and leaves the prose readable at its natural width, which is what long-form writing and diff-friendly documentation tend to prefer. Link text only keeps the words and drops every destination, which is the right answer when the text is going somewhere links cannot be followed anyway.

Nothing in the input is executed, fetched, or rendered as a live page. Script, style, noscript, template, and svg blocks are removed with their contents and counted. A javascript: or data:text/html destination never reaches the output. When a table is kept as HTML, event-handler attributes are stripped from it first, so it cannot carry one into the page you paste it in. The preview is a sandboxed frame with no scripts and no network access.

Back to all tools