NV ToolkitFormat · Validate · Convert

Text Tools

Markdown to HTML Converter

Paste Markdown, get the HTML a Markdown renderer would produce — GitHub Flavored tables, task lists, fenced code and strikethrough included.

In short

Convert Markdown to HTML online with GitHub Flavored Markdown support: tables, task lists, fenced code and strikethrough. Free, instant and fully private.

By NaveenKumar T · Updated

  • GitHub Flavored Markdown by default
  • Tables, task lists & strikethrough
  • Fenced code with language classes

Runs entirely in your browser — nothing you paste or open here is uploaded, logged, or stored.How we handle data →

Example

Markdown to HTML: input and output

A release-notes fragment that leans on the GitHub extensions: an aligned pipe table, task-list checkboxes, strikethrough inside a table cell, a bare URL, and a fenced code block tagged `bash`.

Markdown
## Release checklist

Ship notes for **v2.4.0** — the full log lives at https://example.com/changelog.

| Area | Status | Owner |
| --- | :---: | ---: |
| API | shipped | ada |
| Docs | ~~blocked~~ done | grace |

- [x] Bump the version
- [ ] Tag the release

```bash
npm version minor && git push --tags
```
HTML
<h2>Release checklist</h2>
<p>Ship notes for <strong>v2.4.0</strong> — the full log lives at <a href="https://example.com/changelog">https://example.com/changelog</a>.</p>
<table>
<thead>
<tr>
<th>Area</th>
<th align="center">Status</th>
<th align="right">Owner</th>
</tr>
</thead>
<tbody><tr>
<td>API</td>
<td align="center">shipped</td>
<td align="right">ada</td>
</tr>
<tr>
<td>Docs</td>
<td align="center"><del>blocked</del> done</td>
<td align="right">grace</td>
</tr>
</tbody></table>
<ul>
<li><input checked="" disabled="" type="checkbox"> Bump the version</li>
<li><input disabled="" type="checkbox"> Tag the release</li>
</ul>
<pre><code class="language-bash">npm version minor &amp;&amp; git push --tags
</code></pre>

The `:---:` and `---:` alignment markers become `align="center"` and `align="right"` attributes on the cells, the checkboxes become disabled `<input type="checkbox">` elements, `~~blocked~~` becomes `<del>`, the bare URL is auto-linked, and the fence's `bash` tag becomes `class="language-bash"` on the `<code>` element. Turn GFM off and the table renders as a single paragraph of pipe characters instead.

Learn more

What a Markdown converter actually has to get right

Markdown looks like a format you could convert with a handful of regular expressions, and that impression survives right up until the first document that matters. Real Markdown has fenced code blocks whose contents must not be interpreted as Markdown, nested lists whose indentation determines depth, link reference definitions that appear hundreds of lines away from the links that use them, raw HTML that has to pass through untouched, and a specification — CommonMark — that took years to write precisely because every naive implementation disagreed with every other one on the edge cases.

This page runs marked, a full CommonMark implementation with the GitHub Flavored Markdown extensions layered on top. That matters most for the things people actually paste: a README with a pipe table, a changelog with task-list checkboxes, a documentation page with fenced code blocks tagged by language. Each of those is an extension rather than core Markdown, and a converter that only implements the original 2004 syntax will silently render your table as a paragraph full of pipe characters.

The output is plain, semantic HTML with no wrapper elements, no class names of its own and no inline styles — `<h2>`, `<p>`, `<ul>`, `<table>`, `<pre><code class="language-bash">`. That makes it safe to drop into a template that already has a stylesheet, and it makes the language class on code blocks usable by whatever syntax highlighter your site already loads. If you want the result indented for reading rather than for shipping, run it through the HTML Formatter afterwards.

GitHub Flavored Markdown, element by element

The table below is the practical reference: what you write, what comes out, and whether the GFM toggle is required for it. Everything above the GFM line is core CommonMark and converts with the toggle in either position; everything below it depends on the extensions being enabled.

Markdown syntax and the HTML it produces
MarkdownHTML outputNeeds GFM?
`## Heading``<h2>Heading</h2>`No
`**bold**` / `*italic*``<strong>` / `<em>`No
`text``<a href="https://x.com">text</a>`No
`!alt``<img src="/img.png" alt="alt">`No
`` `code` ```<code>code</code>`No
Indented or fenced block`<pre><code>…</code></pre>`No
```` ```bash ```` fence`<pre><code class="language-bash">`No
`> quote``<blockquote><p>quote</p></blockquote>`No
`- item` / `1. item``<ul><li>` / `<ol><li>`No
`---``<hr>`No
Raw `<kbd>Esc</kbd>`Passed through unchangedNo
`| a | b |` pipe table`<table><thead>…` with `align` on cellsYes
`- [x] done``<li><input checked disabled type="checkbox">`Yes
`~~gone~~``<del>gone</del>`Yes
Bare `https://x.com`Auto-linked `<a href=…>`Yes

Where this conversion comes up

The commonest reason is a content management system that never learned Markdown. You write documentation, release notes or a knowledge-base article in Markdown because that is what your repository speaks, and the CMS field wants HTML. Paste, convert, copy — and because the output has no styling of its own, it inherits the site's typography instead of fighting it.

The second reason is email. Marketing platforms and transactional-email templates take HTML, and writing a changelog email as HTML by hand is miserable. Draft it as Markdown, convert, and paste the fragment into the template's body slot. The third is previewing: you want to know what a README will look like before you push it, or to check that a table you hand-wrote is actually parsed as a table rather than as a paragraph. The GFM toggle turns that into a diagnostic — if the table only renders with GFM on, it will not render on a platform that runs strict CommonMark.

A caution worth repeating: converting is not sanitizing. Markdown deliberately allows raw HTML, so a document from an untrusted author can carry a `<script>` tag or an `onerror` attribute straight through this converter into the output. That is correct behaviour for a converter and dangerous behaviour for a web page, so run the result through a sanitizer before rendering user-submitted content. When you need the opposite direction — HTML you already have, turned back into Markdown — HTML to Markdown is the return trip, and the two round-trip cleanly for ordinary documents.

Help

Frequently asked questions

Everything you need to know about the Markdown to HTML.

01How do I convert Markdown to HTML here?

Paste your Markdown (or load a file, drop one on the editor, or fetch a URL) and press Convert. The HTML appears in the output pane, ready to copy or download as an .html file. The conversion runs in your browser with marked, the renderer behind a large share of the JavaScript ecosystem's static site generators, so the output matches what those tools would emit for the same source.

02What exactly does the GFM toggle change?

GitHub Flavored Markdown is a superset of CommonMark, and the toggle switches the extensions on and off. With it on (the default) you get pipe tables with column alignment, task-list checkboxes rendered as disabled inputs, ~~strikethrough~~ as <del>, and bare URLs turned into links automatically. With it off, a pipe table is just a paragraph of text with pipes in it, `- [x] done` is a list item whose text starts with a bracket, tildes stay literal, and a bare URL stays plain text. Turn it off when your target renderer is strict CommonMark and you want to see what it will actually do with your source.

03Is raw HTML inside my Markdown passed through or escaped?

Passed through, unchanged — that is what the Markdown specification requires, and it is why a `<details>` block or an inline `<kbd>` works in a README. It also means this converter is not a sanitizer: if the Markdown came from an untrusted author, the HTML it produces can contain scripts and event handlers, and you must sanitize the result before inserting it into a page. Sanitizing is a separate job with a separate tool; conversion faithfully preserves what you gave it.

04Why doesn't a single line break become a <br>?

Because `breaks` is off, which is standard Markdown behaviour and what GitHub itself does in files (as opposed to comment boxes). A single newline is treated as a space, so a paragraph wrapped across several source lines renders as one flowing paragraph. To force a line break, end the line with two spaces or write an explicit `<br>` — both survive conversion.

05What happens to the heading IDs GitHub adds?

They are not added. GitHub generates anchor slugs on its headings as a site feature, not as part of Markdown, so `## Release checklist` becomes a plain `<h2>Release checklist</h2>` here. If you need anchors, add them in the source as raw HTML (`<h2 id="release-checklist">`), which passes through untouched.

Keep working

Related tools