md2rich
· Markdown Publishing

Markdown to Substack: How to Write in Markdown and Publish Beautiful Posts (2026)

Substack has become the default home for independent newsletter writers, with hundreds of thousands of authors publishing long-form essays, industry analysis, and serialized content to paid subscribers. Yet Substack's editor has one glaring gap for professional writers: it does not support Markdown.

If you write in Obsidian, iA Writer, Typora, VS Code, or any Markdown-first tool (and most serious writers do), you have experienced the friction: compose a well-structured draft with headings, tables, blockquotes, code samples, and carefully nested lists — then paste it into Substack and watch the formatting fall apart.

This guide walks through the problem, tests three real workflows against a sample Substack post, and shows a two-second workaround that preserves every piece of formatting without uploading your content to any server.

The Problem: Substack Has No Markdown Input

Substack's editor is a rich text editor built on ProseMirror. It handles typed formatting well (click the bold button, type bold text) and accepts rich text pastes from other sources like Google Docs or Notion. But it offers no Markdown import, no Markdown paste support, and no file import pipeline for .md documents.

Consider this typical newsletter excerpt that an independent analyst might write:

# AI Infrastructure Weekly — June 2026

## This Week's Headlines

| Company | Round | Amount | Lead Investor |
|---------|-------|--------|---------------|
| Lambda | Series D | $480M | SoftBank Vision Fund 2 |
| CoreWeave | Extension | $350M | Fidelity |
| Together AI | Series C | $210M | Kleiner Perkins |

## Analysis: GPU Supply Loosens

The GPU shortage that defined the past 18 months is showing signs of easing. **Three signals** point in this direction:

1. AWS re:Invent announced EC2 Trn3 instances at **40% lower cost** than equivalent NVIDIA H100 deployments.
2. Microsoft opened pre-orders for AMD MI400-based Azure instances — a first for a major cloud provider outside the NVIDIA ecosystem.
3. CoreWeave's Q1 2026 earnings call explicitly mentioned "increased availability" for new contracts.

> **Bottom line**: If you've been waiting to launch an AI training pipeline,
> Q3 2026 may be the window. Lock in a 12-month reservation while capacity
> is abundant and pricing is competitive.

## Recommended Setup

```bash
# Deploy a GPU cluster with CUDA 13.0
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu130
nvidia-smi topo -m  # Check NVLink topology before your first multi-GPU run
```

Now paste this directly into Substack's editor and see what happens. Here are the observed results:

Element Direct Paste into Substack
# H1 heading Pasted as plain paragraph text — no heading formatting
## H2 heading Pasted as plain paragraph — heading not detected
Table with pipes Flattened into literal pipe-and-dash characters
Code block (triple backtick) Pasted as a single plain paragraph with backticks visible
Ordered list with items Numbers preserved but only if copied from HTML — raw Markdown numbering is lost
Blockquote (>) Pastas as plain text — no blockquote styling applied
Bold text Pasted as raw **text** markers — not rendered as bold
Inline code Pasted as plain text with backticks visible
Horizontal rule Three dashes pasted as literal characters

The result is a flat wall of text. Every structural element — headings, tables, code blocks, blockquotes — is lost. The Substack editor treats Markdown syntax as literal characters, not as formatting instructions. A 300-line analytical newsletter becomes a single unreadable paragraph.

Workflow 1: Write and Format Directly in Substack

The most obvious approach: skip Markdown entirely and write directly in Substack's editor. Use its toolbar buttons for headings, bold, links, and blockquotes. Type tables by hand using the editor's table menu.

This works for simple posts — a few hundred words, one or two links, no code samples. The friction becomes real with longer content:

Writing directly in Substack is fine for short updates. For analytical newsletters, deep dives, or series with recurring formatting needs, it creates friction that compounds with every post.

Workflow 2: Ghost Export and Migration

Some writers maintain a secondary blog on Ghost (which is Markdown-native) and manually copy content into Substack. Ghost's editor accepts Markdown directly and renders it live. You write in Ghost, copy the rendered output, and paste into Substack.

This preserves formatting better than raw Markdown paste because Ghost converts Markdown to HTML internally, and Substack's editor accepts HTML-rich clipboard data. However:

For a writer who already runs a Ghost site, this may be a natural workflow. But standing up a Ghost instance just to format Substack posts is disproportionate.

Workflow 3: Markdown + md2rich (Tested, Recommended)

Here is the three-step workflow I recommend after testing both alternatives above:

  1. Write in your Markdown editor — Obsidian, iA Writer, VS Code, Typora. Draft, edit, and structure your newsletter. The file lives on your machine. You can version-control it with Git, back it up to Dropbox, access it offline, and diff revisions.
  2. Copy the Markdown → open md2rich.com → paste in the left editor — the right panel renders a real-time rich text preview. Headings render as headings. Tables render with visible rows and columns. Code blocks appear with syntax-highlighted text. Blockquotes show their left border. Everything your Markdown document contains is mirrored in the preview.
  3. Click "Copy as Rich Text" → paste into Substack's editor — the formatted content appears in full. The H1 becomes Substack's title block. The analysis table is a proper Substack table with all rows and columns. The bash code block becomes a Substack code block with a dark background. The blockquote appears with the distinctive gray left bar. The nested list keeps every level of indentation.

Here is the same newsletter document pasted through the md2rich pipeline:

Element md2rich + Substack Paste
H1 heading ✅ Proper Substack title block
H2 heading ✅ Substack heading with correct font size
Table (4 columns, 4 rows) ✅ Proper Substack table with header row
Code block (bash, 3 lines) ✅ Substack code block with dark background and monospace
Ordered list (3 items) ✅ Proper numbered list with correct spacing
Blockquote ✅ Substack blockquote with gray left bar
Bold text ✅ Bold formatting preserved
Inline code ✅ Monospace inline code
Horizontal rule (---) ✅ Substack divider line

The entire conversion happens client-side. Your Markdown never leaves your browser — a critical consideration for newsletter writers who draft subscriber-only content containing unreleased analysis, financial models, or proprietary research.

Why Client-Side Conversion Matters for Newsletter Writers

Substack runs on trust. Your subscribers pay for access to your analysis, reporting, or creative work. That means early drafts of paid posts, subscriber-only editions, and embargoed content must stay confidential until publication.

If you stage your drafts through a cloud-based Markdown converter before pushing into Substack, that converter's server sees the full text of every draft you paste — including content you have not published yet. For a newsletter covering M&A rumors, pre-IPO analysis, or competitive intelligence, this is a legal and editorial risk.

md2rich eliminates the server entirely. The conversion is a JavaScript function that runs in your browser tab:

No network request is made. No file is uploaded. No draft version is stored on any server between your editor and Substack. The pipeline is: your computer → your browser → Substack.

Real Example: A Paid Substack Post

Here is a sample paid-newsletter teaser written in Markdown, suitable for a weekly tech analysis:

# The State of AI Inference 2026

## Executive Summary

The inference market has crossed **$35B ARR**, surpassing training revenue
for the first time. Three trends define the landscape:

1. **Edge inference surged** — Apple's Neural Engine now handles 90%
   of on-device AI tasks. Qualcomm's Snapdragon Gen 4 ships with
   a dedicated NPU core for Llama 3-class models at under 5W.
2. **API pricing collapsed** — GPT-4o-class inference dropped from
   $15/MTok to under $2/MTok in 18 months. Groq's LPU now claims
   $0.59/MTok for Llama 3.3 70B.
3. **Custom silicon proliferates** — Amazon Trainium 3, Google TPU v7,
   and Microsoft's Maia 200 are all in production.

## Provider Comparison (Q2 2026)

| Provider | Best Model | $/MTok Input | $/MTok Output | Speed | Cold Start |
|----------|-----------|-------------|--------------|-------|------------|
| Groq | Llama 3.3 70B | $0.59 | $0.79 | 2,000+ tok/s | None |
| Cerebras | Llama 3.3 70B | $0.60 | $0.60 | 1,800+ tok/s | None |
| Together AI | Mixtral 8x22B | $0.90 | $0.90 | 180 tok/s | ~500ms |
| Replicate | Various | Usage-based | Usage-based | Varies | ~3s |

> **Subscriber note**: Full benchmarks for all 12 providers, including
> cold-start latency, P99 response times, and region availability, are
> in the full post below.

Write this in Markdown, paste through md2rich, and paste into Substack. The table becomes a proper Substack table. The code blocks render with dark backgrounds. The blockquote appears with Substack's quote styling. Every structural element survives the pipeline.

Comparison: Three Approaches Head-to-Head

Dimension Write Directly in Substack Ghost Export + Paste md2rich Pipeline
Setup time 0 seconds Ghost account setup (~15 min) 0 seconds (open md2rich.com)
Login required Substack account Substack + Ghost accounts No login needed
Content leaves device Saved to Substack servers Saved to Ghost + Substack servers No — client-side only
Offline writing No (web app) No (both are web apps) Yes (your editor is local)
Tables preserved N/A (built in editor) ⚠️ Partial (depends on paste)
Code blocks preserved N/A (built in) ⚠️ Partial
Blockquotes preserved N/A (built in)
Local version control No No Yes (Markdown file is local)
Cost Free ~$9/mo for Ghost Free
Per-post time (1,000 words) 20-30 min (type + format in editor) 15-20 min (write in Ghost + fix paste) 10-15 min (write in editor + 10s conversion)

FAQ

Does Substack support Markdown?

Substack's editor does not natively support Markdown input. You cannot paste raw Markdown and expect it to convert. However, you can paste pre-formatted rich text (from a converter like md2rich) into Substack's editor and the formatting carries over completely — headings, bold, italic, links, lists, blockquotes, and tables all work after a rich-text paste.

Can I import a Markdown file directly into Substack?

Substack does not offer a Markdown import feature. The only way to bring Markdown content into Substack is through the paste workflow: convert Markdown to rich text in a client-side tool, then paste the formatted result into Substack's editor. There is no file upload or API-based import path for Markdown documents.

Is md2rich safe to use with unpublished Substack drafts?

Yes. md2rich runs 100% client-side in your browser. Your Markdown never leaves your device. For writers who draft paid subscriber content, embargoed analysis, or exclusive material before it publishes on Substack, this means zero risk of a third-party server caching your drafts. The content goes from your Markdown editor directly to Substack with no intermediate storage.

Will Substack's import from Medium, WordPress, or Revue help?

Substack offers importers for Medium, WordPress, Revue, and email lists. These import published posts, not drafts. They are useful for migrating an entire publication but do not solve the daily workflow of writing new content in Markdown and getting it into Substack's editor. The paste workflow is for ongoing use, not one-time migration.

Does md2rich support embedded tweets, images, and YouTube embeds?

md2rich converts Markdown formatting to rich text. Standard Markdown image syntax (![alt](url)) is rendered in the preview. For Substack-specific blocks — embedded tweets, YouTube videos, custom image galleries, and audio clips — you paste the formatted text first, then add these embed blocks inside Substack's editor. The workflow is: bulk structure first (md2rich), Substack-native polish second (editor).

Which Markdown editor should I use for Substack writing?

Any Markdown editor works because the pipeline is simply plain text copied between tools. iA Writer is a popular choice among newsletter writers for its clean, distraction-free interface and typewriter mode. Obsidian works well for writers who maintain a knowledge base of sources alongside their drafts. Typora offers the most WYSIWYG-like Markdown experience if you have a license. VS Code is the developer-friendly option with split-pane preview and syntax highlighting. The workflow is identical regardless of your choice: write, copy, open md2rich, paste, copy, paste into Substack.

Can I automate this for batch newsletters?

md2rich is designed for one-off conversion — open, paste, copy, close. For batch automation, you could pair a Markdown-to-HTML library (such as marked.js, which md2rich uses internally) with a script that converts each .md file to HTML and writes the rich text clipboard data. The client-side privacy advantage is lost in an automated pipeline, but the rendering logic is the same. Most newsletter writers publish one to two posts per week — the per-post workflow adds about 10 seconds, which is negligible.

Conclusion

Substack's lack of Markdown support is not a defect in the product — it is a design choice that favors simplicity for the broadest audience. But if you are a writer who takes formatting seriously, who values keyboard-first workflows, local backups, and version-controlled drafts, the single extra step of passing your Markdown through a client-side converter makes a measurable difference in both quality and speed.

The workflow costs 10 seconds per post:

Try it with the sample newsletter above. Paste the raw Markdown into Substack directly, then paste it through md2rich.com first. The difference is visible in under 30 seconds — and you will never write directly in Substack's editor again.

Try md2rich Free

Paste Markdown → copy rich text → paste into Substack, LinkedIn, X Articles, Notion, or Medium. md2rich.com — zero tracking, zero upload, free. No account needed.