Markdown Previewer - Live Preview and Copy as HTML, Free

Type or paste Markdown on one side and see it rendered on the other as you type.

About this tool

The preview covers headings, bold and italic, lists including nested and task lists, links, code blocks, block quotes, tables and horizontal rules. The page uses its own small parser, builds the preview as React elements and never inserts raw HTML, so text such as <script> stays text. A Copy as HTML button gives you escaped, safe HTML for the same document.

How it works

What is supported. The parser follows the CommonMark specification for ATX and underlined headings, paragraphs, emphasis and strong emphasis, inline code, fenced and indented code blocks, block quotes, bullet and numbered lists (nested, tight or loose), links with titles, images, autolinks, hard line breaks, backslash escapes and character references. It adds the GitHub Flavored Markdown tables, task lists, strikethrough and bare http(s):// and www. links. Where it differs from the specification, the differences are listed in the next paragraph.

What is not supported. Raw HTML (it is shown as text), reference-style links and link reference definitions, footnotes, bare e-mail addresses (write <[email protected]> instead), math, front matter and HTML comments. Link schemes other than http, https and mailto are refused on purpose, so an autolink such as <ftp://example.com> stays text. It is a small parser, not a full CommonMark implementation, and a few corner cases of nested lists and tabs behave differently. For example, a tab after a block quote marker or a list marker is not expanded to columns. Limits: block quotes and lists stop nesting after 12 levels and the markers beyond that are shown as text, only the first 1,000,000 characters are used, and the live preview draws at most about 30,000 elements (a note appears when a document is cut short there; the copied HTML always holds the whole document). As a check, the parser was run on the specification examples: all 19 thematic break, 18 ATX heading, 27 setext heading, 12 indented code, 8 paragraph, 25 block quote and 48 list item examples of CommonMark 0.31.2 give the same HTML as the reference, apart from white space, and so do 129 of its 132 emphasis examples (the other three use raw HTML) and all 8 GFM table examples.

Safety. Nothing you type is ever inserted as HTML. The tool turns the Markdown into a tree of plain objects and renders that tree with React, so every piece of text is escaped. Link addresses are checked: only http, https, mailto and relative addresses are kept, so javascript:, data: and vbscript: links are dropped, including disguised ones such as java<tab>script: and addresses written with HTML entities. Links open in a new tab with rel="noopener noreferrer nofollow".

Images and privacy. A remote image makes your browser contact the image's server as soon as you type its address, which tells that server you opened this page. So the preview never loads images. It shows a box with the description and a link to open the image yourself. The copied HTML contains a normal img tag with the same checked address.

Copy as HTML. The button copies HTML built from the same tree. Text is escaped (& < > and the double quote become entities), only a fixed set of tags is written, and addresses are the checked ones. By default every link gets rel="noopener noreferrer nofollow". Untick the box to leave the rel attribute out. The words, characters and lines shown are counts of the Markdown source.

Worked examples

A heading, emphasis and a link

The Markdown # Hello, then a blank line, then Some *emphasis*, **strong** text and [a link](https://example.com). gives <h1>Hello</h1> and a paragraph with <em>emphasis</em>, <strong>strong</strong> and a link to https://example.com that carries rel="noopener noreferrer nofollow".

Hostile input stays text

<script>alert(1)</script> is shown as the characters you typed and copied as &lt;script&gt;alert(1)&lt;/script&gt;. The link [x](javascript:alert(1)) keeps its text x but loses its address, and [x](&#106;avascript:alert(1)) is dropped too, because the entity is decoded before the address is checked.

A table with alignment

The three lines | Tea | Minutes |, | --- | ---: | and | Black | 4 | make a table with a header row and a body row, and the colon in the second line right-aligns the Minutes column. The header must have the same number of cells as the delimiter line, or it is read as ordinary text.

Task lists and strikethrough

- [x] Boil the water and - [ ] Add the tea make a list with a ticked and an empty box. ~~Old tip~~ is struck through. Both are GitHub extensions to CommonMark.

Markdown cheat sheet: what you type and what you get

You typeYou getNotes
# HeadingHeading level 1Up to ###### for level 6. A space after the hashes is required
Heading, then ===== on the next lineHeading level 1A line of ----- instead gives level 2
*italic* or _italic_Italic textUse matching marks on both sides
**bold** or __bold__Bold text***both*** gives bold italic
~~strike~~StrikethroughGitHub extension
`code`Inline codeUse two backticks around code that contains a backtick
Three backticks, code, three backticksCode blockPut a language after the opening fence. Three tildes also work
> quoteBlock quoteQuotes can contain lists, code and other quotes
- item, * item or + itemBullet listIndent two spaces to nest a list
1. itemNumbered listThe first number sets where the count starts
- [ ] task or - [x] doneTask list with a boxGitHub extension. The boxes are not clickable
[text](https://example.com "title")LinkThe title is optional. Only http, https, mailto and relative addresses are kept
<https://example.com>Link with the address as its textBare https:// and www. addresses also become links
![alt](picture.png)ImageShown as a placeholder here, never loaded. The copied HTML has an img tag
--- or ***Horizontal ruleOn its own line, with a blank line before
| a | b |, then | --- | :---: |TableColons in the second line set the alignment
Two spaces at the end of a line, or a backslashLine break inside a paragraphA single new line is only a space
\*A literal asteriskA backslash escapes any ASCII punctuation mark

Frequently asked questions

Is it safe to paste untrusted Markdown?

Yes, for the preview and for the copied HTML. Text is escaped, raw HTML is never inserted, and link and image addresses are limited to http, https, mailto and relative ones. The preview is built from React elements, not from an HTML string. A site that accepts HTML from visitors should still clean it on the server.

Why does my image not show?

On purpose. Loading a remote image would tell its server that someone opened this page, and the address would be requested on every keystroke. The preview shows a placeholder with the description and a link. In the copied HTML the image is a normal img tag.

Which flavour of Markdown is this?

CommonMark, plus the GitHub Flavored Markdown tables, task lists, strikethrough and bare web addresses. It is not a complete implementation. Raw HTML, reference links, footnotes and math are not supported.

Why is my link not clickable?

Its address is probably not allowed. Only http, https, mailto and relative addresses are kept, and an address with a space in it must be wrapped in angle brackets. The text of such a link is still shown, just without the link.

How do I make a line break?

End the line with two or more spaces, or with a backslash. A single new line inside a paragraph is only a space, and a blank line starts a new paragraph.

Why does the copied HTML have rel=nofollow on links?

Google lets a site mark a link with nofollow when it does not want Google to associate the site with the linked page, and asks for ugc or sponsored where those fit better. Pasted Markdown is often user-written, so the cautious value is the default. Untick the box to copy HTML without it.

Is my Markdown uploaded or saved?

No. It is parsed in your browser tab and nothing is sent to a server or stored.

Updated Oct 13, 2026