Home/Text tools/Markdown to HTML

Text tool

Markdown to HTML

Type Markdown, get a live-rendered preview and a copyable HTML source underneath. Any raw HTML you type into the input is escaped rather than executed — see below for exactly why.

What this converter handles — and what it does not

This is a CommonMark subset, not a full implementation. It covers the constructs almost everyone actually reaches for and deliberately leaves out the rarer parts of the spec rather than getting them subtly wrong.

Support table — check here before assuming something works
ConstructSupported
Headings # – ######Yes
Bold **text** / __text__Yes
Italic *text* / _text_Yes
Inline code `code`Yes
Fenced code blocks ```Yes (no syntax highlighting)
Blockquotes >Yes — single level only
Unordered / ordered listsYes — single level only, no nesting
Links [text](url)Yes
Images ![alt](url)Yes
Horizontal rules --- *** ___Yes
Tables (pipe syntax with header separator)Yes
Hard line breaks (trailing double-space or backslash)Yes
Nested lists / nested blockquotesNo — treated as a single level
Strikethrough ~~text~~No
Task list checkboxes - [ ]No — renders as a plain list item
Footnotes, definition listsNo
Reference-style links [text][id]No — inline (url) form only
Raw HTML typed in the sourceNo — escaped and shown as literal text, see below

Why raw HTML in the input is escaped, not passed through

Some Markdown implementations let you drop raw HTML straight into the source and have it pass through untouched into the output. That is convenient and also exactly how a Markdown-to-HTML tool becomes a script-injection vector: paste in <img src=x onerror=alert(1)> and a pass-through converter would render it as a live, executing tag.

This converter escapes angle brackets and ampersands in the source before any Markdown pattern is applied, and only ever builds HTML tags itself, from its own fixed templates, around that already-escaped text. Typing <script> into the input produces the visible text <script> in the output — never a real, running <script> tag. The preview is rendered by inserting that same generated markup, so what you see in the preview is exactly what ends up in the copyable HTML box, with nothing hidden or executed in between.

Link and image URLs go through one more check: a URL beginning with javascript:, data: or vbscript: is replaced with a harmless # rather than kept as a clickable link, since those schemes are the standard way a malicious link executes code instead of navigating anywhere.

Questions people ask

Why doesn't a nested list indent correctly?

Nested lists are not supported in this subset — every list item renders at the same level regardless of leading indentation. If you need genuine nesting, most Markdown-aware editors and static-site generators support it natively; this tool is aimed at flat lists, tables and formatted paragraphs.

Can I paste HTML directly into the Markdown box and have it render?

No, and that is deliberate. Any angle brackets you type are escaped and shown as literal text in both the preview and the copied output, for the safety reasons explained above.

Does the table syntax require exact spacing?

No. Cells are trimmed of surrounding whitespace, and the header separator row just needs a run of dashes per column (colons for alignment are accepted but alignment itself is not currently rendered).

Is the generated HTML valid to paste directly into a CMS?

Yes — it is plain semantic HTML (headings, paragraphs, lists, tables) with no styling classes attached, so it will pick up whatever CSS the destination page already uses rather than fighting it.

Writing content for somewhere else?

HTML-to-text, lorem ipsum and find-and-replace sit right next door.

See all text tools →