Live markdown editor with instant preview. Supports GitHub Flavored Markdown, tables, code blocks, and task lists. Export to HTML. Free, no signup.
You have a README, a changelog, a pull request description or a documentation page written in markdown, and you want to see the rendered result before you commit it. This is a split-pane editor: raw markdown on the left, live rendered output on the right, updating as you type. No account, no upload, no round trip — the parser runs in your browser and your text stays in the tab.
Paste into the left pane, or use the Upload button to load a local .md or .markdown file. The upload is read with the browser’s own file reader and never leaves your machine; that is the honest answer to the usual first question. Your content is auto-saved to the browser’s local storage two seconds after you stop typing, so a reload does not lose your work — and equally, it means the text persists on that device until you clear it, which is worth knowing on a shared machine. The Clear button removes both the editor content and the saved copy.
This matters more than people expect, because “markdown” is not one language. The preview parses CommonMark plus GitHub Flavored Markdown, using the same parser family that renders markdown across a great deal of the JavaScript ecosystem. Concretely, that means the GFM extensions on top of CommonMark are all live:
| Feature | Syntax | Supported |
|---|---|---|
| Tables | | a | b | with a |---|---| divider | Yes, including :--- / :---: / ---: alignment |
| Task lists | - [ ] todo and - [x] done | Yes — rendered as real checkboxes, deliberately read-only |
| Strikethrough | ~~text~~ | Yes |
| Autolinks | A bare URL with no angle brackets or link syntax | Yes — linkified automatically |
| Footnotes | text[^1] with a [^1]: note definition | Yes — part of the same GFM extension set |
| Fenced code blocks | Triple backticks, optionally with a language | Yes, with syntax highlighting |
| Inline HTML | <div>, <kbd>, <details> and so on | Yes — raw HTML is passed through and rendered |
What is not here, stated plainly so you do not chase a bug that is really a missing extension: there is no LaTeX or KaTeX math rendering, so $x^2$ stays literal text. There is no emoji shortcode expansion, so :smile: renders as those exact characters — but pasted Unicode emoji work fine, because they are just characters. There is no diagram rendering, so a ```mermaid block is treated as a code block and highlighted rather than drawn. And YAML front matter is not stripped: a --- fence at the top of the file is read as ordinary markdown, which typically renders as a horizontal rule followed by a heading rather than disappearing the way a static site generator would hide it. Delete the front matter before pasting if it gets in the way.
Most “it looked different on GitHub” reports come down to three specific behaviours.
Line breaks. This is the big one. In CommonMark and in GFM as specified, a single newline inside a paragraph is not a line break — consecutive lines are joined into one flowing paragraph. To force a break you end the line with two trailing spaces, or use a <br> tag. GitHub’s comment boxes, issues and pull request descriptions turn on a non-standard “hard break” mode where every newline becomes a break, and so do Slack-adjacent editors and many note apps. This preview follows the specification, not the comment-box convention. So if your text renders as one long paragraph here but as separate lines in a GitHub issue, neither is broken — you are comparing a spec-compliant renderer against a hard-break one. README files on GitHub are rendered without hard breaks, which is why this preview matches a README more closely than it matches a comment.
Nested lists. Indentation rules are the second most common surprise. CommonMark ties a nested item’s indentation to the width of its parent’s marker, so a child under - item needs two spaces while a child under 1. item needs three. Editors that insert a hard tab, or four spaces regardless, can push a list item far enough that it becomes an indented code block instead of a sub-item. If a nested bullet renders in a grey monospace box, that is what happened: reduce the indentation. Similarly, a blank line between list items switches the list from “tight” to “loose”, which wraps every item in a paragraph and visibly increases the spacing — correct behaviour, not a styling bug.
HTML passthrough. Raw HTML is rendered here rather than escaped, which is what GitHub does for a controlled subset. That makes <details><summary> collapsibles, <kbd> keys and inline <img> tags work as written. Two things follow from it. First, markdown syntax inside an HTML block is generally not reprocessed, so **bold** on the line directly after an opening <div> may come out literal — leave a blank line to get markdown parsing back. Second, this preview does not run raw HTML through a sanitiser, so it will render whatever markup you give it. For your own drafts that is exactly what you want; do not use it as a safety check on markdown from an untrusted source, and be aware that GitHub and most content platforms strip far more than this does, so “it worked in the preview” is not a guarantee it survives publishing.
The formatting toolbar inserts syntax around your selection or at the cursor: bold, italic, heading, link, image, fenced code block, inline code, unordered list, ordered list, task list, blockquote, horizontal rule and a table skeleton. Four keyboard shortcuts cover the ones you reach for constantly:
| Shortcut | Action | Inserts |
|---|---|---|
Ctrl/Cmd + B | Bold | **selection** |
Ctrl/Cmd + I | Italic | *selection* |
Ctrl/Cmd + K | Link | [selection](url), or [link text](url) with nothing selected |
Ctrl/Cmd + H | Heading | ## at the start of the current line |
A view toggle switches between split, editor-only and preview-only. Split is the default on a desktop-width screen; on a narrow screen the two panes become tabs, because a split pane at phone width is unusable. A cheat sheet button (shown on wider screens) lists the syntax for headings, emphasis, strikethrough, inline code, both list types, task lists, links, fenced code blocks, blockquotes, rules and tables, so you do not have to leave the page to look up a table divider.
Code blocks are syntax-highlighted with a dark theme. Tag the fence with a language — ```javascript, ```python, ```bash — and the keywords colour correctly; leave it untagged and you get a plain monospace block, which is often the right choice for log output or plain text. Tables render inside their own horizontally scrolling container, so a wide table scrolls rather than breaking the page layout. Task list checkboxes are rendered as genuine, disabled checkboxes: they show state accurately and cannot be clicked, since the markdown source is the record and toggling a box in the preview would put the two out of sync.
Along the bottom you get a live count of words, characters, characters excluding whitespace, and lines, plus an estimated reading time. The reading-time figure divides the word count by 200 words per minute and rounds up, with a floor of one minute — a conventional assumption, not a measurement of you. The counts are taken from the markdown source, so syntax characters such as ** and # are included in the character total; expect the number to run slightly above what the rendered prose would count.
document.md.** or *. The live preview makes this obvious the moment it happens, which is most of the reason to preview at all.``` with no closing fence. Count your fences — they must pair.markdown-table-generator produces the aligned source for you.\_.# needs a space after it, and the line must start at the left margin — leading spaces can turn it into something else entirely.1. on every line is legal and produces 1, 2, 3.Because the preview and the platform you publish to may not run identical renderers, treat this as an accurate check of your markdown — is the syntax well-formed, do the tables and lists and fences parse the way you intended — rather than a pixel-exact simulation of any one destination. For structural correctness, which is what actually breaks, it is exactly the right check.
A Markdown preview tool renders Markdown syntax into formatted HTML in real time, allowing writers to see how their content will appear when published. Markdown—created by John Gruber in 2004—is a lightweight markup language used across GitHub, technical documentation, blogging platforms, note-taking apps, and content management systems. Its plain-text syntax is designed to be readable in raw form and convertible to HTML for web display.
Markdown has become the standard for developer documentation, README files, pull request descriptions, and technical blogging. The ability to preview rendered output while writing eliminates the guess-and-check cycle of writing raw Markdown, committing, and refreshing to see the result. Real-time preview is especially valuable for complex content with tables, code blocks, nested lists, and embedded images.
A Markdown renderer parses plain text according to the Markdown specification and converts it to HTML:
| Markdown Syntax | HTML Output | Purpose |
|---|---|---|
# Heading | <h1>Heading</h1> | Section headings (# through ######) |
**bold** | <strong>bold</strong> | Bold emphasis |
*italic* | <em>italic</em> | Italic emphasis |
[text](url) | <a href="url">text</a> | Hyperlinks |
 | <img src="url" alt="alt"> | Images |
| `code` | <code>code</code> | Inline code |
| ```lang | <pre><code>...</code></pre> | Code blocks with syntax highlighting |
- item | <ul><li>item</li></ul> | Unordered lists |
> quote | <blockquote>quote</blockquote> | Block quotes |
Markdown flavors: Different platforms extend standard Markdown with additional features:
[text][id] with definitions at the bottom keeps paragraphs clean improves accessibility and serves as fallback when images fail to loadMarkdown is a lightweight markup language using plain text formatting syntax that converts to HTML. Created by John Gruber in 2004, it uses simple symbols like # for headings, ** for bold, * for lists. Popular because: readable in plain text, easy to learn (5 minutes basics), widely supported (GitHub, Reddit, Stack Overflow, documentation platforms), separates content from formatting, version control friendly (git diff works well). Used for README files, documentation, blog posts, comments, notes. This tool provides live preview with GitHub Flavored Markdown support, showing exactly how your markdown will render.
GitHub Flavored Markdown (GFM) extends standard Markdown with additional features used on GitHub. Additions include: tables (| Syntax | Description |), task lists (- [ ] Todo item), strikethrough (text), auto-linking URLs without brackets, syntax highlighting in code blocks (```javascript), username mentions (@user), issue references (#123). GFM also has different line break handling - single line breaks create
tags. Standard Markdown requires two spaces or double line break. This tool supports full GFM syntax including tables, task lists, and fenced code blocks with syntax highlighting.
Tables use pipes | and hyphens - to separate columns and create headers. Basic syntax: | Header 1 | Header 2 | then | --------- | --------- | for separator, then data rows | Cell 1 | Cell 2 |. Alignment: left (default), center (:---:), right (---:). Cells can contain inline formatting like bold, italic, code. Tables must have header row and separator. Minimum 3 hyphens per column. This tool renders tables with proper HTML formatting. Note: tables are GFM extension, not in original Markdown.
Use clear heading hierarchy (# for title, ## for sections, ### for subsections). Start with brief overview and table of contents. Use code blocks with language specification (```python) for syntax highlighting. Include examples for each concept. Use lists (- or 1.) for steps and bullet points. Add links to related documentation. Use tables for comparing options or specifications. Include badges for build status, version, license. Keep paragraphs short (3-4 sentences). Use bold for important terms first use, inline code for commands/variables. Test all code examples before publishing. This tool helps preview documentation exactly as it will appear.
Use triple backticks with language name for fenced code blocks. Example:javascript for JavaScript, python for Python, bash for shell commands. Alternatively, indent 4 spaces for code block without syntax highlighting. Inline code uses single backticks: variable or function(). Common languages: javascript, python, java, go, rust, sql, html, css, json, yaml, bash, typescript. GFM supports 100+ languages. Syntax highlighting makes code more readable and helps identify errors. This tool provides real-time syntax highlighting preview for all major programming languages.
Links: [link text](https://url.com) or [link text](https://url.com "Title"). Reference-style: [link text][ref] then [ref]: url at bottom. Images:  - same as link but with ! prefix. Image with link: [](https://example.com). Relative paths work: [docs](./docs/file.md) or . Auto-linking (GFM): bare URLs become clickable automatically. Best practices: always include alt text for accessibility, use descriptive link text (not "click here"), use HTTPS for external links. This tool renders all link and image types with proper HTML output.
Task lists (GFM feature) create interactive checkboxes using - [ ] for unchecked, - [x] for checked. Example: - [ ] Write documentation, - [x] Review code, - [ ] Deploy to production. Tasks must start with hyphen and space, then brackets, then space, then text. Nesting works with indentation. On GitHub, clicking checkboxes updates the markdown source. Useful for: project TODOs, issue tracking, meeting notes, feature checklists. This tool renders task lists with proper checkbox styling. Note: checkboxes display-only in preview, editing requires changing [ ] to [x] in markdown source.
Most markdown tools export to HTML - click "Export" or "Download HTML". Markdown converts to semantic HTML5 (# becomes