June 25, 2026
Markdown to Medium: 2026 Publishing Guide with md2rich
Medium is one of the highest-traffic long-form publishing platforms on the web, and it does not support Markdown. As of June 2026, pasting # Heading into a Medium draft still shows literal hash characters, and pasting **bold** shows literal asterisks. For writers who draft everything in Markdown, this is the single biggest friction point in the Medium workflow. Here is how to convert Markdown to Medium-ready rich text in 2026, including the table problem, the code-block problem, and the canonical-URL problem, using a privacy-first client-side tool: md2rich.
Why Medium Doesn't Accept Markdown
Medium's editor is a WYSIWYG rich-text editor built on the ContentEditable browser API. It was designed for a general audience who selects text and clicks a Bold button — not for developers or technical writers who want to write in syntax. The Medium team has not added a Markdown import mode, a paste-as-Markdown shortcut, or a Markdown toggle in settings. According to the April 2026 Kitmul guide: "Medium doesn't support Markdown. Not in 2024, not in 2025, and still not in 2026."
What breaks when you paste raw Markdown source into a Medium draft:
- Headings appear as
## My Titlewith the hash symbols visible - Bold and italic show the asterisks instead of formatting
- Code blocks lose syntax highlighting and sometimes indent
- Tables are not supported at all — the text scatters across the page
- Task lists like
- [x] Donerender as plain characters - Links display the raw
[text](url)syntax - Images render the
source instead of the picture
If you have ever tried to manually reformat a 2,000-word technical article in Medium's editor, you know the feeling. It takes 30 minutes, and you still miss something. There is a better way.
The Three Paths From Markdown to Medium
There are three realistic workflows for publishing Markdown on Medium in 2026. Each has different trade-offs on privacy, fidelity, and effort.
| Method | Fidelity | Privacy | Setup | Best For |
|---|---|---|---|---|
| Copy raw Markdown, fix by hand | Low (tables impossible) | Full | None | Short posts, no tables |
Medium's medium.com/p/import |
Medium (degrades tables) | Sends URL to Medium | Already-published URL | Cross-posts with canonical set |
| Convert to Medium HTML, paste (md2rich) | High (tables converted to lists) | Full (client-side) | None — paste into editor | All post types, including drafts |
For unpublished drafts and any writing that contains proprietary or sensitive content, the third option is the only one that keeps the text on your device. The second option is the right answer when the article is already published on your own blog and you are cross-posting to Medium for reach — the import tool sets the canonical URL automatically. The first option is a last resort for short posts.
The Step-by-Step Workflow With md2rich
md2rich is a static HTML page that converts Markdown to rich HTML in the browser. No backend, no signup, no upload. The whole workflow takes under a minute:
1. Write or paste your Markdown
Open md2rich.com. The editor is two panes: Markdown on the left, live preview on the right. Paste or type your post. Common patterns you can use without thinking about Medium's quirks:
2. Click "Copy rich text"
md2rich converts the Markdown into text/html clipboard content. Your clipboard now carries both the visible plain text and the rich-text formatting Medium needs. You can verify by pasting into a plain text editor first — you will see the formatted version, not the Markdown source.
3. Paste into Medium
Open medium.com/new, place the cursor in the editor, and press Ctrl+V (Windows/Linux) or Cmd+V (Mac). Medium's editor parses the text/html from your clipboard and renders the formatted version: headings, bold, lists, code blocks, and blockquotes all appear correctly.
4. Adjust what Medium cannot render
Some Markdown features have no Medium equivalent. md2rich makes the call automatically, but it is worth knowing what changes:
| Markdown | What md2rich does for Medium |
|---|---|
| | a | b | | Tables → bold-label list (Medium strips <table>) |
| #### H4 / ##### H5 / ###### H6 | Downgraded to <h3> (Medium max) |
| - [x] Done | Becomes "☑ Done" Unicode symbols |
| ```python | Code block without language hint (no Medium highlighting) |
| [^footnote] | Removed (Medium has no footnotes) |
| $$latex$$ | Kept as plain text (Medium has no math) |
5. Set the canonical URL (if cross-posting)
If this article is also on your own blog, set the canonical link before publishing. Click the three dots menu on the draft, find "Add canonical link", and paste the URL where the article lives on your domain. Without this, Google's algorithm may pick Medium's higher-authority copy as the primary version.
The Table Problem (and Why Lists Work Better)
Medium does not render HTML tables. Even when pasted as rich HTML, <table><tr><td> markup is stripped, and the cells scatter as a paragraph. The fix is to convert each table into a structured list before pasting. md2rich does this automatically — every table row becomes a bold label followed by the cell value, rendered as a paragraph or a sub-list. For readers on mobile (where Medium is mostly read), this is actually more readable than a horizontal table that breaks out of the viewport.
Here is an example. The source Markdown table:
Becomes this on Medium:
Each cell becomes its own bold-label paragraph. The visual scan order is identical to the original table, but it survives Medium's parser and renders well on phone screens.
The Code Block Problem (and the Gist Escape Hatch)
Medium supports <pre><code> blocks but does not apply syntax highlighting. The language class on the code element — language-python, language-js, and so on — is stripped. A 30-line Python function pasted into Medium looks like a gray rectangle.
The clean fix is GitHub Gists. Create a public Gist with your code, copy the Gist URL, and paste it on its own line in the Medium draft. Medium detects the Gist URL and embeds it as a formatted, syntax-highlighted snippet — the same embed you see in any Markdown renderer that supports https://gist.github.com/....
This works because Medium recognizes the Gist URL pattern and replaces the link with an embed at render time. The same trick works for CodePen, JSFiddle, and YouTube links — anything where the URL itself is enough for Medium to fetch and embed.
The Canonical URL Problem (Why It Matters)
When you cross-post the same article on your own site and Medium, Google needs to know which version is the "real" one. Without a canonical hint, Google picks based on domain authority — and Medium wins almost every time. The result: your original post on your domain gets outranked by your own writing on Medium.
Three ways to set canonical:
- Import via
medium.com/p/import— Medium sets the canonical automatically to the source URL. - Paste manually and set canonical in settings — three dots menu → "Add canonical link" → paste your URL.
- Don't cross-post — keep the article only on your own site and avoid the duplication entirely.
If your own site has any organic traffic at all, option 1 or 2 is worth the 30 seconds. The choice between them is whether you want the source HTML on a public URL first.
Privacy: Why Client-Side Conversion Matters Here
Medium drafts are unpublished content. If you are writing about an unreleased feature, an internal decision, or anything with a non-disclosure agreement, pasting that draft into a cloud conversion service means giving the service a copy of your work in their log files. Most online Markdown-to-HTML converters send the text to a backend for parsing.
md2rich runs entirely in the browser as a single static HTML page with no backend. The conversion happens in JavaScript on your device. There is no signup, no analytics on draft content, no third-party request beyond the static page itself. The page is small enough to save locally and use offline — useful if you are writing on a plane or in a high-security environment.
This is the same privacy posture that makes md2rich useful for confidential LinkedIn posts, internal X Articles, and private Substack drafts. The full publishing workflow for Markdown is "write in your favorite editor, paste into md2rich, copy rich text, paste into the destination." No third party sees the content between draft and publish.
The Full Workflow: Markdown → Medium in 60 Seconds
Putting it all together, the fastest reliable Markdown-to-Medium workflow in 2026 is:
- Draft in your favorite Markdown editor (Obsidian, VS Code, iA Writer, plain text).
- Open md2rich.com. Paste your Markdown into the left pane.
- Click "Copy rich text". Your clipboard now holds
text/htmlcontent. - Open
medium.com/new. Press Ctrl+V or Cmd+V. - Tables converted to bold-label lists appear automatically. Code blocks render as gray boxes (use Gists for syntax highlighting).
- Set the canonical URL in the story settings if the article also lives on your own site.
- Hit publish.
Total time: under a minute. Total third-party data exposure: zero. Total Medium formatting fidelity: as high as Medium's editor allows, which is high for prose and lists, partial for tables (auto-converted), and basic for code (use Gists for the rest).
Try md2rich
Convert Markdown to rich text instantly. No signup. No uploads. Just paste and copy. Works for Medium, LinkedIn, X Articles, Substack, Notion, and more.
Start converting →