Home/Text tools/Markdown to HTML
Text toolMarkdown 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.
| Construct | Supported |
|---|---|
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 lists | Yes — single level only, no nesting |
Links [text](url) | Yes |
Images  | Yes |
Horizontal rules --- *** ___ | Yes |
| Tables (pipe syntax with header separator) | Yes |
| Hard line breaks (trailing double-space or backslash) | Yes |
| Nested lists / nested blockquotes | No — treated as a single level |
Strikethrough ~~text~~ | No |
Task list checkboxes - [ ] | No — renders as a plain list item |
| Footnotes, definition lists | No |
Reference-style links [text][id] | No — inline (url) form only |
| Raw HTML typed in the source | No — 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.