Convert Markdown to HTML
Paste Markdown, get HTML you can read. Tables, task lists, fenced code and footnoted links all survive the trip, and the preview renders in a sandbox that cannot run scripts.
Type or paste on the left. The HTML and the preview both update as you go.
What this converts
The parser covers CommonMark's block structure — ATX and setext headings, paragraphs, fenced and indented code, blockquotes with nesting, ordered and unordered lists including nested ones, horizontal rules — plus the GitHub Flavored Markdown additions that people actually rely on: pipe tables with alignment, task-list checkboxes, strikethrough with tildes, and autolinks in angle brackets. Inline emphasis handles the full set, including the intra-word rule that stops snake_case_names from turning into italics halfway through.
What it deliberately does not do is reference-style links defined at the bottom of a document, footnotes, or definition lists. Those are less common in the documents people paste into a converter, and pretending to support them badly is worse than saying so plainly.
The HTML it produces
The output is plain semantic HTML with no classes, no wrapper divs and no inline styles beyond the alignment attributes a table needs. That is the useful shape: it drops into an existing stylesheet, a CMS field, or an email template without bringing along a framework's opinions. Code fences keep their language as a class="language-js" on the <code> element, which is the convention every syntax highlighter reads.
The Full HTML document option wraps the result in a doctype, a charset declaration and a viewport meta tag, for when the file needs to open as a standalone page rather than be pasted into one.
Escaping, and the option that turns it off
By default every angle bracket in your Markdown is escaped, so <script> in your source becomes visible text rather than an executing tag. Markdown's specification permits raw HTML to pass through, so the option is there — but it is off by default, and it should stay off for anything you did not write yourself. Converting an untrusted document with pass-through enabled produces HTML carrying whatever was in it.
Two things happen regardless of that setting. Link and image URLs are checked against a scheme allow-list — http, https, mailto, tel, ftp and relative paths pass; javascript: and data: are replaced with #. And the preview panel renders inside an iframe with an empty sandbox attribute, which means no scripts, no forms and no navigation, no matter what the document contains.
Line breaks, the perennial argument
In standard Markdown a single newline inside a paragraph is just whitespace; you need two trailing spaces, or a backslash, to force a <br>. GitHub comment boxes break that rule and treat every newline as a line break, which is why text that looked right in an issue thread collapses into one paragraph everywhere else. The Newline becomes <br> option switches between the two behaviours. If your source came out of a chat box or an issue tracker, turn it on.
It runs here
Documentation, meeting notes, drafts and internal specs are the usual contents of a Markdown file, and none of them belong on a stranger's server for the sake of a formatting conversion. The parser is a few hundred lines of JavaScript running in this page; there is no request, no queue and no size limit beyond your own memory. If you need the opposite direction, the HTML to Markdown converter is the mirror of this one.
Common questions
Does it support GitHub Flavored Markdown?
The parts people use: pipe tables with alignment, task lists, strikethrough, fenced code with language tags, and autolinks. Reference-style links and footnotes are not supported, and the page says so rather than failing quietly.
Why did my line breaks disappear?
Standard Markdown treats a single newline as whitespace. Tick 'Newline becomes
' to get GitHub's comment-box behaviour, or end lines with two spaces in the source.
Is raw HTML in my Markdown preserved?
Only if you tick 'Pass HTML through'. It is off by default so that untrusted documents cannot smuggle tags into the output. URLs are always checked against a scheme allow-list either way.
Can the preview run scripts from my document?
No. It renders in an iframe with an empty sandbox attribute, which blocks scripts, forms, popups and navigation entirely.
What does the code fence language tag do?
It becomes class="language-js" on the element, which is the convention Prism, highlight.js and GitHub all read. Without a highlighter loaded it is inert but harmless.
Is there a size limit?
None imposed here. It runs in your browser, so the practical ceiling is your available memory. A book-length document is fine.
Is my document uploaded?
No. The parser runs in this page and makes no network requests. That is the main reason to use it for anything internal.