Independent writing tools and guides, edited by a human

Markdown to HTML

Convert Markdown to clean HTML with headings, lists, tables, code blocks, links, and emphasis. Copy or download the result.

Your workbench
0 characters
Read-only
Ready when you are.
Rendered preview
On this page (08)
  1. 01The paste that arrives in a CMS wearing asterisks
  2. 02Which constructs survive the trip
  3. 03Raw HTML is text here, and most links get demoted
  4. 04The blank line is the only paragraph break that counts
  5. 05Semantic markup, generated IDs, and the pipe table rule
  6. 06Where a browser converter stops being enough
  7. 07Frequently Asked Questions
  8. 08Convert one section, not the whole site

The paste that arrives in a CMS wearing asterisks

You paste four hundred lines of Markdown into a client's content management system, save, and the published page shows **quarterly revenue** in literal asterisks. Nothing errored. Between your file and the page, a converter either did not run or made different assumptions than you did. Markdown is a notation rather than a format, which means every converter is a set of decisions about which notation it honours and how far it trusts your input.

This converter makes those decisions conservatively. It renders as you type and shows the HTML source beside a sandboxed preview, and it will not hand you markup carrying styles, scripts, or anything else a publishing system might refuse. Knowing exactly where that line falls is the difference between using the tool twice and using it every week.

Which constructs survive the trip

Every converter advertises "Markdown support," so the useful question is which subset it means. Here is the whole of what this one understands.

You typeYou getThe catch
# Heading<h1 id="heading">Levels one to six; the hash needs a space after it
**bold**, *italic*, ~~struck~~<strong>, <em>, <del>Asterisks and tildes only, never underscores
- item, 1. item<ul>, <ol>Numbered lists always begin at one
[label](https://example.com)<a href="...">label</a>Five URL shapes only, listed further down
` code ` and fenced blocks<code>, <pre><code>A language tag after the fence is discarded
> quoted<blockquote>Can hold paragraphs and lists inside it
pipe tables<table>Header row plus a dash row, leading pipes required
--- alone on a line<hr>Hyphens only

Anything absent from that table stays exactly as you typed it, which is usually the honest outcome.

Feed this converter an <iframe> and you get the six characters <iframe> on the page. Every line is escaped before any Markdown is applied, so markup in your source can never become markup in your output. That is a deliberate trade. A converter that passes HTML through is a delivery mechanism for whatever the file contained, including a script tag, and a CMS that trusts its own editing interface will store it without complaint.

Links get similar treatment. Only these shapes survive: http:, https:, mailto:, a root-relative path beginning with a single slash, and a #fragment. Everything else collapses to its visible label, so [the intranet](report.html) renders as the words "the intranet" with nothing clickable behind them.

There is also no image syntax at all. Write one and the leading exclamation mark stays in the output as literal text, while the rest obeys the link rules above: ![alt](/media/pic.png) keeps a working anchor, and ![alt](pic.png) collapses to the bare word alt because a relative path is demoted like any other. An image with empty alt text, ![](/media/pic.png), is left in the source verbatim and becomes an inscrutable line of punctuation on the page. Images belong to your publishing system, which already knows your media paths and your alt-text conventions.

The blank line is the only paragraph break that counts

A single newline inside a paragraph is a soft break: it renders as a space, not as a line ending. This converter joins consecutive non-blank lines with a space, so a hard-wrapped paragraph of eight source lines becomes one <p>. That is correct Markdown behaviour, and it is why you cannot format a poem or a postal address by pressing Enter.

The usual workaround fails here. Closing a line with two spaces is the standard way to force a <br>, and this converter ignores it, because the spaces disappear into the paragraph. If you need a break inside a paragraph, the honest options are two paragraphs, or a <br> added in the CMS after pasting.

Semantic markup, generated IDs, and the pipe table rule

The output carries no classes and no inline styles. A heading arrives as <h2 id="editorial-standards">Editorial standards</h2>. That id is built by lowercasing the heading, stripping accents, and replacing runs of spaces and punctuation with single hyphens, so ## Café pricing becomes id="cafe-pricing" while the visible text keeps its accent. Repeated headings are numbered automatically: three ## Notes headings yield notes, notes-2, and notes-3, so anchors stay unique without you inventing names.

Tables demand one non-obvious thing. The header row must start with a pipe. A table written without outer pipes, the style some editors allow, is read as ordinary paragraph text and comes through as a run of words and dashes. Alignment markers such as :--- are accepted and then ignored, because alignment is presentation, and presentation belongs in your stylesheet. Write one CSS rule for tables and every table on the site inherits it.

That separation is why this output is worth pasting into a CMS. Markup copied out of a word processor arrives carrying font tags, deprecated attributes, and a decade of accumulated cruft, and each paste adds a layer. Semantic HTML arrives with none of that and takes on whatever your site's stylesheet already says.

Where a browser converter stops being enough

Limits, stated plainly. Nested lists are flattened, so an indented - sub-item becomes another item in the same list. Underscore emphasis is not recognized. Emphasis cannot nest, so **bold with *italic* inside** produces mangled output with stray asterisks around it. Fenced code keeps its content exactly, angle brackets escaped and spacing intact, but the language tag after the opening fence is discarded, so no syntax-highlighting hook is emitted. Footnotes, task lists, tables of contents, and autolinks such as <https://example.com> are not implemented.

A full static-site build does more with the same source: it resolves relative links, collects headings into navigation, and applies templates. This converter is for the moment you need an HTML fragment from a Markdown fragment, and for testing what a construct actually produces before you commit it to a repository. If your text came from a word processor, clean it first, since curly quotes and stray tabs survive conversion exactly as typed, and the text cleaner handles those in one pass.

The notation itself, including the places where dialects disagree, is covered in Markdown for writers.

Frequently Asked Questions

Why did my table come out as a paragraph of words and dashes?

Almost always a missing leading pipe. The header row has to begin with |, and the row beneath it needs at least three hyphens per column. Without the outer pipes the converter reads those lines as prose, which is why the dashes appear verbatim in the output. Add a pipe to both ends of every row and convert again.

Can I convert a README that has images and badges?

Not usefully. There is no image syntax, so every image becomes a link with an exclamation mark in front of it, and badges are images. Heading and list structure survives, so the text portion is fine, but expect to rebuild the images by hand in whatever renders the page.

Only root-relative paths and #fragment links survive, so report.html and ../notes.md are dropped and only their label text remains. Root-relative paths such as /guides/report.html work. Rewriting your links to the published paths before converting saves a second pass later.

Why does my numbered list begin at one when I wrote 3.?

The converter emits a plain <ol> and ignores the starting number, so the browser numbers it from one. Markdown's own convention treats those digits as decorative and the sequence as implied. If the starting number matters, set it in the HTML with a start attribute.

Does the preview run anything inside my Markdown?

It cannot, because nothing executable reaches it. A <script> tag in your source is escaped to visible text before the preview is built, exactly as it is in the source panel. That also means the preview shows you what a CMS will receive.

Convert one section, not the whole site

The habit worth building is small: paste only the section you are about to publish, then read the source panel rather than the preview. A flattened nested list, a demoted link, or an escaped tag shows up instantly in the HTML and stays invisible in a rendered preview that looks approximately right. One section converted and checked beats a whole document converted and discovered later.