Convert HTML to Markdown

Fast, accurate, and customizable. Paste your HTML, tweak the settings, and get clean Markdown instantly.

HTML Input

Quick examples:

By clicking convert, you agree to the Terms of Use and Privacy Policy.

Markdown Output

Welcome to html2md

This is a powerful HTML to Markdown converter.

Try editing this HTML or use the quick examples above!

  • Fast conversion
  • Customizable settings
  • API access available

Why Choose Our Converter?

Production Ready

Trusted by 1,000+ projects with 3.5k+ GitHub stars.

Handles Complex HTML

Converts entire websites, nested elements, and tricky edge cases that break other converters.

Smart & Extensible

Built-in plugins for tables, strikethrough, and more. Easy to extend with custom rules.

Advanced HTML-to-Markdown Conversion

Our converter handles complex edge cases that other tools miss. See how it produces accurate, clean Markdown from any HTML input.

Heading

The converter can handle Headings from level <h1> to <h6> even with other elements inside.

<h2>Heading</h2>
## Heading
<h4>
	<strong>Important</strong>
	Heading
</h4>
#### **Important** Heading

Bold & Italic

Emphasis and strong formatting is supported – even intraword.

<p>
	<strong>Bold</strong>
	and
	<em>Italic</em>
</p>
**Bold** and *Italic*

Bold & Italic with Nesting

Unnecessary nesting could generate too many * or _ delimiters. The converter reduces unnecessary nesting.

<b><b>Incredibly</b> <b>Bold</b></b>
**Incredibly Bold**

Bold & Italic with PunctuationPro

Notice the small difference? The dash has to be outside of the italic text.

<p>nitty-<em>gritty</em>-details</p>
nitty-*gritty*-details
<p>nitty<em>-gritty-</em>details</p>
nitty-*gritty*-details

Unordered List

Nested Lists (with the correct indentation) are also supported.

<ul>
	<li>Simple List</li>
	<li>
		<p>Someone once said:</p>
		<blockquote>
			My famous quote
		</blockquote>
		<span>by someone</span>
	</li>
</ul>
- Simple List
- Someone once said:
  
  > My famous quote
  
  by someone

Ordered List

The start attribute is also respected for ordered lists.

<ol start="9">
	<li>Nine</li>
	<li>Ten</li>
	<li>
		Eleven
		<ul>
			<li>Nested</li>
		</ul>
	</li>
</ol>
09. Nine
10. Ten
11. Eleven
    
    - Nested

Blockquote

A blockquote can also contain other elements. And blockquotes can event be nested inside each other.

<blockquote>
	<h2>Heading</h2>

	<ol>
		<li>List</li>
		<li>List</li>
	</ol>

	<blockquote>
		<p>Another Quote</p>
		<p>by someone</p>
	</blockquote>
</blockquote>
> ## Heading
> 
> 1. List
> 2. List
> 
> > Another Quote
> > 
> > by someone

Inline Code

The converter correctly treats the backtick character.

<p>
	Output a message: <br/>
	<code>console.log("hello")</code>
</p>
Output a message:  
`console.log("hello")`
<code>with `` backticks</code>
```with `` backticks```
<code>`variable`</code>
`` `variable` ``

Code Block

<pre class="language-js"><code>
console.log("hello")

</code></pre>
```js

console.log("hello")

```
<pre class="language-go"><code>
<span class="token function">func</span>

</code></pre>
```go

func

```
<pre><code>
This ``
totally ``` works!

</code></pre>
````

This ``
totally ``` works!

````

Link

The converter supports relative and absolute links. Other elements inside are also supported.

<a href="/index.html">
	<strong>Home</strong>
</a>
[**Home**](/index.html)
<a
	href="/about"
	title="title text"
	>
	About 
</a>
[About](/about "title text")

Multiline Link

A markdown link can stretch onto multiple lines. For this a blank line has to be escaped.

<a href="/post">
	<p>Line 1</p>
	<p>Line 2</p>
	<p>Line 3</p>
</a>
[Line 1  
\
Line 2  
\
Line 3](/post)
<a href="/post">
	Line 1 <br/><br/>
	Line 2 <br/>
	Line 3 <br/>
</a>
[Line 1  
\
Line 2  
Line 3](/post)

Plugin: Strikethrough

Uses tildes to cross-out text similar to bold & italic.

<p>Does <s>not</s> work!</p>
Does ~~not~~ work!

Plugin: Table

Converts tables with support for alignment, rowspan and colspan.

<table>
  <tr>
    <td>A1</td>
    <td>A2</td>
  </tr>
  <tr>
    <td>B1</td>
    <td>B2</td>
  </tr>
</table>
|    |    |
|----|----|
| A1 | A2 |
| B1 | B2 |
<table>
  <caption>The description</caption>
  <thead>
    <tr>
      <th align="left">Left</th>
      <th align="center">Center</th>
      <th align="right">Right</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Bold</strong></td>
      <td><i>Italic</i></td>
      <td><code>Code</code></td>
    </tr>
  </tbody>
</table>
| Left     | Center   | Right  |
|:---------|:--------:|-------:|
| **Bold** | *Italic* | `Code` |

The description
<table>
  <tr>
    <td rowspan="2" colspan="2">
      BIG CELL
    </td>
    <td>A1</td>
  </tr>
  <tr>
    <td>B1</td>
  </tr>
  <tr>
    <td>C1</td>
    <td>C2</td>
    <td>C3</td>
  </tr>
</table>
|          |    |    |
|----------|----|----|
| BIG CELL |    | A1 |
|          |    | B1 |
| C1       | C2 | C3 |

Hard line breaks

There are different ways to convert <br/> tags. The converter also supports hard line breaks. Notice the two spaces at the end of the line.

<p>
	Line 1<br/>
	Line 2<br />
	Line 3
</p>
Line 1  
Line 2  
Line 3

Escaping where necessary

Some characters would (accidentally) be recognized as markdown. The converter escapes these with a backlash — but only if necessary.

<h2># Heading #</h2>
## # Heading \#
<p># Heading</p>
<p>#hashtag</p>
\# Heading

#hashtag
<p>- List Item</p>
<p>Just a — dash</p>
\- List Item

Just a — dash

Swapping Nodes

It is invalid to have block-elements inside inline-elements. The converter then swaps the nodes.

<h2>
	<a href="/">Headline</a>
</h2>
## [Headline](/)
<a href="/">
	<h2>Headline</h2>
</a>
## [Headline](/)

Remove/Keep HTML

Choose to strip or retain specific HTML tags for ultimate control over the output.

<nav>Removed text</nav>
<article>
	<h1>Heading</h1>
	<strong>bold text</strong>
</article>
<article>

# Heading

**bold text**

</article>