What this markdown to HTML converter does
You already have the note in Markdown: a README section, a changelog, a draft for a post, or a checklist you wrote in an editor. The next field wants HTML. This page runs marked in your browser and writes an HTML fragment. Headings become h1–h6, lists become ul or ol, fenced code becomes a pre/code block, and links keep their URLs. With GitHub-flavored Markdown left on, pipe tables, task lists, strikethrough, and bare URLs are included. The HTML tab shows that source. The Preview tab renders it after sanitizing.
The whole conversion stays on your machine. The parser and DOMPurify load the first time the box has text, so the first visit does not download them until you need them. Nothing you paste is sent to WebInk to be converted. That is a different job from HTML to Markdown, which starts from markup you already copied and writes Markdown. If you only have a public link, use URL to Markdown first, then bring the Markdown here if the next step needs tags. The tools hub lists the other one-job pages.
GitHub-flavored Markdown support
The GitHub Flavored Markdown switch is on by default. Turn it off when you want a smaller CommonMark-style subset. The table is what this page’s parser emits, not a promise about every editor that also says “GFM”.
| Syntax | GFM on | GFM off |
|---|---|---|
| ATX headings | h1–h6 | h1–h6 |
| Setext heading (underline of = or -) | h1 or h2 | h1 or h2 |
| Bullet and numbered lists | ul and ol | ul and ol |
| Fenced code with a language | pre/code, class language-* | pre/code, class language-* |
| Pipe table | table | Plain text |
| Task list | Checkbox input (see sanitize note) | Literal [x] text |
| Strikethrough | del | Plain ~~text~~ |
| Bare http(s) URL or email | Link | Plain text |
| Angle-bracket autolink | Link | Link |
| Heading id attributes | Only if Heading ids is on | Only if Heading ids is on |
| Raw HTML in the note | Passed through, then optional sanitize | Passed through, then optional sanitize |
| Footnotes and math | Not supported | Not supported |
| Single newline in a paragraph | Not a br | Not a br |
| Two spaces at end of line | br | br |
Sanitize HTML, which is also on by default, rewrites a task checkbox to the text [x] or [ ] and drops style attributes, style elements, SVG, iframes, and form controls. The language class on a code block, such as language-js, is kept, and so is a heading id when that option is on. A footnote marker like [^1] is not rendered as a footnote, and dollar-sign math is left as text.
How to convert Markdown to HTML
- 1
Paste Markdown
Paste a note into the Markdown box, or click Sample note. The parser loads the first time you enter text. Conversion runs in your browser. A note over 200,000 characters is refused so the page stays responsive.
- 2
Choose GFM, heading ids, and sanitizing
Leave GitHub-flavored Markdown on for tables, task lists, strikethrough, and bare URLs. Turn on Heading ids if you want slug ids on headings. Leave Sanitize HTML on unless you trust the note and need raw HTML passed through. Preview always shows the sanitized result.
- 3
Copy, download, or read the preview
Open the HTML tab for the source. Copy it, or download a .html file. Turn on Full HTML document to wrap that source in a doctype, head, charset, title, and body. Open Preview to read the sanitized HTML in the page. Copy and Download stay off when the box is empty.
A worked example
Click Sample note, or paste the Markdown below. Defaults are GitHub-flavored Markdown on, Heading ids off, Sanitize HTML on, and Full HTML document off. The HTML box then has an h1 for “Café launch”, strong around “note”, list items that start with [x] and [ ], a Day/Topic table, a link to https://webink.app/tools, del around “the old draft”, and a code element with class language-js. The characters 你好 stay inside the fence. Turn Heading ids on and that h1 becomes <h1 id="café-launch">. Full HTML document adds the doctype, charset, and title to the HTML box and the download only. Preview stays the sanitized fragment.
# Café launch A short **note** for the newsletter. ## Checklist - [x] Write the intro - [ ] Check the links ## Schedule | Day | Topic | | --- | --- | | Mon | Launch | | Tue | Follow-up | See https://webink.app/tools and ~~the old draft~~. ```js const greeting = "你好" ```
Why the HTML is sanitized
Markdown is not a closed format. A note can contain raw HTML, and marked passes that HTML through. That is useful when you wrote a class on a paragraph on purpose. It is unsafe when the note came from somewhere else. This payload is the case the sanitizer is there for:
<img src=x onerror=alert(1)> [click](javascript:alert(1))
Before sanitizing, the onerror attribute and the javascript: URL are still in the HTML string. After sanitizing, the event handler is gone and the link no longer has a javascript: URL. The same pass removes style attributes (a javascript: URL or expression() in CSS would otherwise stay), style elements, SVG, iframes including srcdoc, and form controls. A language class on a code element and a heading id stay. Preview never skips that step, because the preview is inserted into this page. The HTML box follows the switch, so you can compare the raw string with the cleaned one. A task checkbox is rewritten to [x] or [ ] text, which email and CMS editors can keep. Turn the switch off only for a note you trust, when you need a tag the cleaner would change.
Sanitizing is not a publishing workflow. It does not rewrite relative links, add a content security policy, or check that a class name matches your stylesheet. Read the preview, then read the HTML box, before you paste the result into a site you do not fully control.
Where the HTML is useful
Email newsletters are a common destination. Many editors accept an HTML block and ignore Markdown, so a pasted README shows the hash marks and the pipes. Convert here, leave Full HTML document off so you do not paste a second html element inside their template, and use the fragment. Expect the editor to drop the language class on code or to rewrite links. The preview on this page is a reading check, not a picture of their template.
A CMS that only stores HTML is the same shape of problem. A rich-text field, a legacy blog, or a help-center article often wants h2, p, ul, and table, not a Markdown string. Paste the fragment into the HTML view of that field. If the CMS strips tables, build the grid in the Markdown Table Generator first so the pipes are correct, then convert the finished note here. This page does not open a spreadsheet.
A static page can take the fragment inside a layout you already have, or a full document download when you want one file. The title is the first ATX or setext heading outside a code fence, or “Converted Markdown” when there is none. For words with no tags, continue in HTML to Text. For a token count of the note or the HTML, use the Token Counter. This converter does not count tokens. If the destination is a model rather than a CMS, HTML vs Markdown for LLMs explains why the note is usually the smaller prompt, and when the HTML is the right input because the task is the document itself.
Compared with Pandoc, an editor, and the WebInk extension
Pandoc is the tool when the file is on disk and you need more than GitHub-flavored HTML: a batch of files, docx or LaTeX, footnotes, or citations. You install it. A desktop editor such as VS Code, Obsidian, or Typora already previews the note and may export HTML under its own rules. Use this page when the note is on the clipboard and you want GFM, heading ids, a sanitizer, and an optional full document, with no install and no file picker.
The WebInk Chrome extension reads a page you already have open, including a page behind a login, and writes Markdown. It does not turn a Markdown note into HTML. Clip with the extension, or fetch a public URL, then convert here only if the destination cannot store Markdown. The Markdown feature describes that clipping path.
| Feature | This page | Pandoc | By hand |
|---|---|---|---|
| Install | No | Yes | No |
| Input | Paste | Files on disk | You type tags |
| GFM tables, tasks, strike, autolinks | Yes, switch on by default | With the right extensions | You write the tags |
| Footnotes, citations, math | No | Yes, when enabled | If you write them |
| Sanitize before copy | On by default | Your own step | Your own step |
| Full HTML document | Optional wrap | Yes | If you write it |
| Many output formats | HTML only | Yes | No |
The extension clips web pages to Markdown. It does not convert Markdown to HTML.
Limits to expect
Empty input leaves Copy and Download off. A note past 200,000 characters is refused so a huge paste does not freeze the tab. Shorter notes update on a deferred pass, and the status line says when the HTML is catching up. Unicode is preserved, and a heading id keeps those letters. Malformed Markdown rarely throws; marked usually emits the closest HTML, and a real failure shows an English error. There is no file picker, no upload, and no call to /api/markdown. Markup you already have belongs on HTML to Markdown.