Markdown Preview & HTML Converter
Write Markdown on one side, see the rendered result on the other, and copy the generated HTML.
Markdown is a family, not a standard
John Gruber wrote the original Markdown in 2004 as a rough set of rules and a Perl script. It was never specified tightly enough to be unambiguous, so every implementation filled the gaps differently. That is why a document can render correctly on one site and break on another while both claim to support "Markdown".
CommonMark (2014 onwards) is the attempt to fix this with a real specification and a conformance test suite. Most modern parsers target it. GitHub Flavored Markdown is CommonMark plus extensions — tables, task lists, strikethrough, autolinks — and because GitHub is where most people encounter Markdown, GFM extensions are widely treated as standard even though they are not part of CommonMark.
| Feature | Original Markdown | CommonMark | GFM |
|---|---|---|---|
| Emphasis and strong | Yes | Yes | Yes |
| Fenced code blocks | No | Yes | Yes |
| Tables | No | No | Yes |
Task lists - [ ] | No | No | Yes |
Strikethrough ~~x~~ | No | No | Yes |
| Raw HTML passthrough | Yes | Yes | Yes (sanitised) |
The practical consequence: if you are writing a README, GFM is the dialect that matters. If you are writing for a static site generator, check which parser it uses before assuming a table will render.
Why raw HTML is escaped here, on purpose
Standard Markdown lets you drop raw HTML into a document and expects it to pass through untouched. That is convenient and it is also an injection hole: if the Markdown came from anyone else — a comment, an issue, a pull request, a pasted snippet — then rendering it means running their markup in your page.
This preview escapes HTML instead of passing it through. Angle brackets show up as text.
That means a snippet like <script> renders visibly rather than
executing, and link targets are checked against a scheme allow-list so
javascript: URLs cannot be smuggled in through the link syntax.
Markdown is not a security boundary. If you render user-supplied Markdown on a real site, escape or sanitise the HTML output on the server, and use a parser with a documented security policy. Client-side escaping like this is a preview aid, not a defence.
The parts that trip people up
- A blank line ends a paragraph. Two lines separated by a single newline are one paragraph with a soft break. Add a blank line to get two.
- List nesting is indentation-sensitive. Two spaces for an unordered child, and typically three or four for an ordered one, because the marker width counts.
- Indenting four spaces makes a code block in most parsers, which is why indented text inside a list behaves surprisingly.
- A table needs the separator row. Without the
| --- | --- |line, the pipes are just text. - Emphasis does not cross punctuation boundaries the way you expect: underscores inside a word are not emphasis, since identifiers like
some_long_namemust survive.
Frequently asked questions
Why does my table not render?
It needs the delimiter row directly beneath the header, with at least three dashes per column: | --- | --- |. Also check that the parser you are targeting supports tables at all — plain CommonMark does not.
Can I use HTML tags in my document?
Not here — they are escaped and displayed as text. Most other Markdown renderers do pass HTML through, though many sanitise it. If you need precise layout, write HTML directly rather than fighting Markdown.
How do I escape a literal asterisk?
Precede it with a backslash: \*. The backslash escape works for every Markdown punctuation character. Inside a code span you need no escaping at all.
Does this support footnotes or math?
No. Footnote syntax and LaTeX math are further extensions, each with several incompatible variants. This preview covers CommonMark plus the common GFM additions, which is what the majority of documents use.
Privacy. Parsing and rendering happen in your browser. Your document is never uploaded, so it is safe to paste internal text here.