Which Markdown this actually is
John Gruber's original 2004 Markdown was defined mostly by a Perl script and a page of prose, and the prose left genuine ambiguities — how many spaces indent a nested list, what happens when emphasis markers overlap, whether a list interrupts a paragraph. Different implementations resolved those differently, so the same document could render three ways.
CommonMark exists to close that gap: it is a precise specification with an extensive test suite, and it is what this preview follows. On top of it sit the GitHub Flavored Markdown extensions, which are the features most people assume are simply "Markdown" but are not in the original at all — tables, strikethrough with ~~text~~, task lists, fenced code blocks with language tags, and autolinking of bare URLs.
This matters when you move a document between systems. A table that renders on GitHub may come out as literal pipe characters in a strict CommonMark renderer, and footnotes, definition lists and inline math are extensions that many parsers do not implement at all.
The syntax details that surprise people
Line breaks are the single most common frustration. A single newline inside a paragraph is not a break — it collapses to a space, matching HTML's own whitespace handling. To force a break you either end the line with two trailing spaces, which is invisible in most editors and frequently stripped by formatters, or use a backslash at the end of the line, which is explicit and survives editing. A blank line starts a new paragraph.
List indentation is the second. In CommonMark, a nested list item must be indented to align with the content of its parent, not by a fixed number of spaces. Under - item the content column is two, so two spaces nest correctly; under 1. item it is three. Mixing tabs and spaces here is what produces lists that flatten unexpectedly.
Underscores behave differently from asterisks inside words: snake_case_name is left alone, because intra-word emphasis with underscores is disabled specifically to avoid mangling identifiers, while * would emphasise there. And any line beginning with a number followed by a period becomes an ordered list, which is why a paragraph starting "1999. It was a good year" renders as a list item numbered 1999.
Markdown is not a sanitiser
By specification, Markdown permits raw HTML to pass straight through to the output. That is a deliberate feature — it is how you embed anything the syntax does not cover — but it means a Markdown parser is not a security boundary. If you render user-submitted Markdown and insert the result into a page, a <script> tag or an onerror attribute in the source becomes executable script in your application.
Link syntax is an easy blind spot too, since [text](javascript:...) is structurally a normal link. Any pipeline that accepts untrusted Markdown needs an HTML sanitiser with an allowlist running after the Markdown conversion, not a regex filter before it. Your preview here is rendered in a sandboxed context and never leaves the browser, so you can safely paste a document you have not vetted.