Skip to content
1001 Tools
sr
Developer tools

Markdown to HTML Converter

Paste Markdown on the left and get HTML you can drop into a page, template or CMS field — or switch to the preview to see how it renders. Headings, emphasis, links, images, nested lists, blockquotes, fenced code and pipe tables are all supported. Raw HTML in your source is escaped rather than executed, so the preview is safe even for text you did not write.

HTML output

Raw HTML in the source is escaped rather than executed, and link schemes are restricted to http, https, mailto, tel and relative paths — so the preview is safe even for text you did not write.

How it works

The converter works in two passes. First the document is split into blocks: a line starting with one to six hashes is a heading, three or more dashes are a horizontal rule, a fenced block between backticks is code, lines beginning with “>” are a quote, lines beginning with a bullet or a number are a list, a line of pipes followed by a row of dashes is a table, and anything else is a paragraph. Then each block’s text goes through the inline pass: code spans, images, links, bold, italic, strikethrough.

Order matters inside the inline pass. Everything is HTML-escaped before any markdown is applied, then code spans are pulled out and set aside so the emphasis rules cannot reach into them — that is why `**not bold**` in backticks stays literal. Underscores are only treated as emphasis at word boundaries, so snake_case_identifiers survive intact, which plain regex converters routinely mangle.

Link and image URLs pass a scheme allowlist: http, https, mailto, tel, and relative paths or anchors. Anything else — javascript:, data:, vbscript: — loses its href and the link text is rendered as plain text. Combined with escaping every input character, that is what makes the live preview safe to render directly in the page.

A deliberate difference from CommonMark: real Markdown lets raw HTML through, and this tool does not. Escaping HTML is the right default for a converter that previews pasted text, but it means a document that mixes in <div> wrappers or an iframe will show those tags as text instead of applying them. Reference-style links, footnotes and setext headings are also outside the supported subset.

Practical examples

README into a web page

Paste a project README with headings, a bullet list and a fenced code block, and you get the matching h1/h2, ul/li and pre/code markup — ready for a docs page without pulling a Markdown library into the build.

A table from a spec

The three lines “| Field | Type |”, “|:---|---:|” and “| id | int |” become a full table with thead, tbody and per-column text alignment taken from the colons in the separator row.

Checking someone else’s Markdown

Paste text from an untrusted source that contains <script>alert(1)</script> and a [link](javascript:alert(1)). The script tag appears as visible text, the link loses its href — you see what the document says without running any of it.

A nested list for a CMS field

Two-space indentation under a bullet produces a nested ul inside the parent li, which is what a CMS rich-text field expects. Flat converters emit two sibling lists instead and the indentation silently disappears.

Frequently asked questions

Which Markdown features are supported?

Headings (# to ######), paragraphs with single-line breaks preserved, bold, italic, bold-italic, strikethrough, inline code, fenced code blocks with a language class, links, images, unordered and ordered lists including nesting, blockquotes, horizontal rules and GFM pipe tables with alignment.

What is not supported?

Reference-style links ([text][ref]), footnotes, setext headings (underlined with = or -), definition lists, task-list checkboxes rendered as inputs, and raw HTML passthrough. These are either rare in pasted text or unsafe to render, and leaving them out keeps the output predictable.

Why is my HTML shown as text instead of being applied?

Because every character is escaped before conversion. That is the trade-off that makes previewing pasted text safe: no tag from the source can execute or restructure the page. If you need HTML passthrough, run your Markdown through a build-time library instead.

Is the live preview safe?

Yes, by construction rather than by filtering afterwards. Input is escaped, code content is isolated, and URL schemes are allowlisted, so there is no path for a script to reach the DOM. Nothing is stripped after the fact, which is where sanitiser bypasses usually happen.

How do I force a line break inside a paragraph?

End the line with two spaces, or with a backslash. Both produce a <br />. A single newline without either is kept in the output as a newline inside the same paragraph, which HTML renders as a space — the standard Markdown behaviour.

Does it keep the code language for syntax highlighting?

Yes: ```js becomes <code class="language-js">, the convention Prism and highlight.js expect. The tool does not highlight anything itself — it just leaves the hook in place for whatever highlighter your page already loads.

Why did my *italic* not render?

Emphasis needs the marker to hug the text: *word* works, * word * does not, and an asterisk inside a word is left alone. If your text uses asterisks as literal characters, wrap them in backticks so they are treated as code.

Can I convert a whole file?

Paste its contents — that is the fastest route and there is no size limit beyond your browser’s. There is no file upload on purpose: the document never has to leave your machine to be converted.

How are tables with a missing cell handled?

The header row fixes the column count, and short rows get empty cells at the end. That keeps columns aligned instead of shifting the remaining values one place left, which is what happens when a converter simply splits on pipes.

Does the output need a CSS framework?

No. The HTML is plain and semantic — h2, ul, pre, table — so it inherits whatever styles your page has. The preview here adds its own local styling only so lists and tables look right on this page.

Is the HTML minified?

No, blocks are separated by newlines so the output stays readable and diffable. If you need it compact, run the result through the HTML minifier.

Does anything I paste get uploaded?

No. The conversion is a pure function running in the page: no server, no storage, no analytics on content. Reload the page and the document is gone.

Related tools