How these tests are run
Every compatibility claim on this site comes from pasting one versioned fixture into a real editor, on a stated date, with a screenshot saved. Nothing is inferred from platform marketing or documentation alone. If a construct was not tested, it is labeled unknown and stays that way until someone tests it.
Evidence levels
- Verified
- Reproduced in the live editor with a saved screenshot. Only this level supports wording like "we tested".
- Documented, not tested
- Stated by current primary platform documentation but not reproduced here. Always described as the platform's claim.
- Unknown
- No current evidence supports a reliable answer.
The protocol
Platform Test Protocol v1
Purpose
Produce reproducible evidence for every public compatibility claim. Use only controlled unpublished drafts and the fixture at docs/research/fixtures/markdown-portability-test-v1.md.
Evidence levels
V — Verified in the current platform editor with saved screenshot or exported evidence.
D — Documented by a primary platform source but not yet reproduced.
C — Supported only by a current community/competitor report.
U — Unknown or not tested.
N/A — The destination does not have the relevant rendering surface.
Only V can support wording such as “we tested” or “works.” D must be described as platform documentation, never as our own result.
Test modes
Run each fixture through all modes the destination allows:
raw-paste — Copy Markdown source and paste it directly.
rich-paste — Render Markdown in a trusted local renderer, then paste rich clipboard content.
native-block — Recreate fragile elements with destination-native controls.
web-preview — Inspect the unpublished web preview.
email-preview — Send to a controlled test address and inspect desktop and narrow/mobile presentation.
Safety
- Never publish the fixture publicly.
- Never send it to real subscribers.
- Never alter an existing creator draft.
- Use a new draft titled
Compatibility Test v1 — YYYY-MM-DD.
- If a platform requires paid activation, record the blocker instead of purchasing without approval.
- Delete the test draft after evidence is complete unless it is explicitly retained for the next controlled test.
Screenshot naming
<date>-<platform>-<mode>-<case-id>-<viewport>.png
Examples:
2026-08-24-substack-raw-paste-t06-desktop.png
2026-08-24-beehiiv-email-preview-t07-mobile.png
Per-platform test record
Record:
- platform and visible editor generation/version;
- account/workspace type;
- browser and operating system;
- test date and timezone;
- fixture commit/version;
- input mode;
- result for every case;
- manual repairs and elapsed time;
- screenshot path;
- web-versus-email differences;
- uncertainty or inconsistent behavior.
Publication rule
Before a result is published, a second visual pass must confirm that the screenshot, matrix cell, page copy and workaround all describe the same behavior.
The fixture
One file, 3,876 characters, covering inline formatting, heading depth, nested and task lists, quotes, dividers, fenced and long-line code, small and wide GFM tables, remote and local images, footnotes, inline and block math, Mermaid, Obsidian syntax, raw HTML, hard breaks, escaping, and Unicode including CJK, Arabic, and emoji. It is versioned, and its length is checked by the test suite so it cannot drift away from the records that cite it.
Read the full fixture source
---
title: Markdown Portability Test v1
description: A reproducible fixture for testing Markdown publishing destinations.
author: Compatibility Lab
tags:
- markdown
- publishing
- compatibility
date: 2026-08-24
---
# Markdown Portability Test v1
This fixture tests common Markdown, technical blocks, newsletter content, and editor-specific syntax. The sentence includes “smart quotes,” an em dash — and Unicode: café, naïve, 中文, العربية, 🚀.
## T01 — Inline formatting
This sentence contains **bold**, *italic*, ***bold italic***, ~~strikethrough~~, `inline code`, and a [public HTTPS link](https://example.com/?utm_source=compatibility-test&utm_medium=fixture).
This sentence contains a [mailto link](mailto:test@example.com), an [anchor link](#t03--lists-and-tasks), and a [relative link](../guides/example-page.md).
## T02 — Heading hierarchy
### Third-level heading
#### Fourth-level heading
##### Fifth-level heading
###### Sixth-level heading
## T03 — Lists and tasks
- First bullet
- Second bullet
- Nested bullet
- Third-level bullet
- Final bullet
1. First numbered item
2. Second numbered item
1. Nested numbered item
2. Another nested item
3. Final numbered item
- [x] Completed task
- [ ] Open task
## T04 — Quote and divider
> A blockquote with **bold text**, a [link](https://example.com/quote), and a second line.
>
> A second paragraph inside the same quote.
---
## T05 — Code
```js
export function publish(markdown, destination) {
return { markdown, destination, ready: false };
}
```
```text
This_is_an_intentionally_long_unbroken_line_for_testing_mobile_email_overflow_ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789_abcdefghijklmnopqrstuvwxyz
```
## T06 — Small table
| Platform | Markdown document | Native table | Footnotes |
| --- | :---: | :---: | ---: |
| Substack | No | Test | Yes |
| Beehiiv | Test | Yes | Yes |
| Ghost | Yes | Test | Yes |
## T07 — Wide table
| Platform | Headings | Links | Lists | Code | Tables | Math | Footnotes | Local images |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Example | Preserve | Preserve | Preserve | Review wrapping | Review width | Review syntax | Review anchors | Manual upload |
## T08 — Images


## T09 — Footnotes
This sentence has a short footnote.[^short]
This sentence has a longer footnote.[^long]
[^short]: A short footnote used by the compatibility fixture.
[^long]: A longer footnote with a second paragraph.
The second paragraph includes `inline code` and a [link](https://example.com/footnote).
## T10 — Math
Inline math: $E = mc^2$.
Block math:
$$
\int_0^1 x^2\,dx = \frac{1}{3}
$$
## T11 — Mermaid
```mermaid
flowchart LR
M[Markdown source] --> C{Compatibility check}
C -->|Pass| P[Publish]
C -->|Degrade| R[Review]
```
## T12 — Obsidian-specific syntax
Wiki link: [[Publishing Notes]]
Aliased wiki link: [[Publishing Notes|publishing workflow]]
Transclusion: ![[Reusable Introduction]]
Callout:
> [!NOTE]
> This is an Obsidian callout that is not part of CommonMark.
Block reference: ^compatibility-block
## T13 — Raw HTML
<details>
<summary>Expandable summary</summary>
Raw HTML content with <mark>highlighting</mark>.
</details>
## T14 — Line breaks and paragraphs
This line ends with two spaces.
This line should remain in the same paragraph as a hard break.
This is a new paragraph after one blank line.
This paragraph follows two blank lines.
## T15 — Escaping and literal characters
Escaped Markdown: \*not italic\*, \# not a heading, and \[not a link\].
Literal symbols: < > & © ™ € $ | { } [ ] ( ).
## T16 — Final link check
[Return to the heading test](#t02--heading-hierarchy).
Retest policy
- A record is never edited to reflect later behavior.
- A behavior change adds a new dated record and keeps the old one.
- A rule change requires new evidence, an updated contract, and updated expected output.
- Commercial claims older than 90 days are hidden or rechecked.
What this method cannot tell you
- Behavior on untested account tiers, editor versions, themes, plugins, or email clients.
- Whether a link preview card will appear; that is decided by the destination crawler.
- Anything about a platform after its editor changes and before the next dated test.
Back to the five-platform comparison