Markdown vs reStructuredText: Which Should You Use?

A detailed comparison of markdown and reStructuredText for documentation. Covers syntax, ecosystem, extensibility, and when each format is the better choice.

· · 7 min read

Last updated: March 3, 2026

markdown restructuredtext comparison

Markdown and reStructuredText (reST or RST) are both lightweight markup languages for writing documentation. Markdown is simpler and more widely adopted. reStructuredText is more powerful and the standard in the Python ecosystem. This guide compares them so you can pick the right one for your project.

Quick Comparison

AspectMarkdownreStructuredText
Created2004 (John Gruber)2002 (David Goodger)
SpecificationCommonMark + GFMDocutils spec
File extension.md.rst
Learning curveLow (15-30 minutes)Medium (1-2 hours)
EcosystemGitHub, VS Code, almost everythingPython, Sphinx, Read the Docs
ExtensibilityLimited (HTML fallback)Built-in directive and role system
Cross-referencesNot built-inBuilt-in
Table of contentsNot built-in (tool-dependent)Built-in (.. toctree::)
AdmonitionsGFM alerts (GitHub-only)Built-in (.. note::, .. warning::)
AdoptionDominant overallDominant in Python

Syntax Comparison

Headings

Markdown:

# Heading 1
## Heading 2
### Heading 3

reStructuredText:

Heading 1
=========
Heading 2
---------
Heading 3
^^^^^^^^^

RST headings use underlines (and optionally overlines). The character determines the level, but the convention is flexible: any punctuation character works, and the first one used becomes H1.

Bold and Italic

Markdown:

**bold** and *italic*

reStructuredText:

**bold** and *italic*

Same syntax here. One of the few areas where the two formats are identical.

Markdown:

[MDtoLink](https://mdtolink.com)

reStructuredText:

`MDtoLink <https://mdtolink.com>`_

RST links use backtick-angle-bracket syntax with a trailing underscore. This is one of the steepest parts of the RST learning curve.

Images

Markdown:

![Alt text](/images/photo.png)

reStructuredText:

.. image:: /images/photo.png
:alt: Alt text
:width: 400px

RST images support width, height, alignment, and scale as built-in options. Markdown needs HTML fallback for sizing.

Code Blocks

Markdown:

```python
def hello():
print("Hello")
```

reStructuredText:

.. code-block:: python
def hello():
print("Hello")

Both support language-specific syntax highlighting. RST uses the code-block directive; markdown uses fenced code blocks.

Lists

Markdown:

- Item one
- Item two
1. First
2. Second

reStructuredText:

- Item one
- Item two
#. First (auto-numbered)
#. Second

RST supports auto-numbered lists with #., which is convenient for long lists.

Tables

Markdown (GFM):

| Name | Value |
|------|-------|
| foo | 42 |

reStructuredText (grid table):

+------+-------+
| Name | Value |
+======+=======+
| foo | 42 |
+------+-------+

reStructuredText (simple table):

===== =====
Name Value
===== =====
foo 42
bar 99
===== =====

RST grid tables support merged cells, multi-line content, and complex layouts. Markdown tables are limited to single-line cells with no cell spanning.

Where Markdown Wins

Broader adoption. Markdown works on GitHub, GitLab, VS Code, Obsidian, Slack, Discord, Stack Overflow, Reddit, and thousands of other platforms. RST is rarely supported outside the Python ecosystem.

Simpler syntax. Markdown’s link syntax ([text](url)) is easier to remember than RST’s (`text <url>`_). New contributors can start writing markdown in minutes.

Better tooling for general use. Markdown editors, linters, and preview tools are abundant. VS Code, for example, has built-in markdown support but needs an extension for RST.

Developer familiarity. Most developers already know markdown. Onboarding to a markdown-based docs project is faster.

Where reStructuredText Wins

Built-in extensibility. RST has a directive system for custom content blocks:

.. warning::
This operation is destructive.
.. note::
See the API reference for details.

Markdown has no native equivalent. GFM alerts (> [!WARNING]) are GitHub-specific and more limited.

Cross-references. RST links to other documents, sections, and code objects by reference name:

See :doc:`getting-started` for setup instructions.
The :func:`process_data` function handles this.

Markdown requires manual URL management for cross-document links.

Sphinx integration. Sphinx is the documentation generator used by Python, Linux, and many large projects. It reads RST natively and provides:

  • Multi-page documentation with table of contents trees
  • Automatic API reference from docstrings
  • Versioning
  • Internationalization
  • PDF and ePub export

Richer tables. RST grid tables support merged cells, multi-line content, and complex layouts that markdown tables cannot express.

Formal specification. RST has one specification, one parser (docutils), and one authoritative implementation. Markdown has multiple specs (CommonMark, GFM) and hundreds of parsers with subtle differences.

When to Use Which

ScenarioRecommendation
GitHub READMEMarkdown
General-purpose documentationMarkdown
Python project docsRST (Sphinx) or Markdown (via MyST)
Note-taking / personal writingMarkdown
Blog postsMarkdown
Large documentation projects (100+ pages)RST (Sphinx) or Markdown (Docusaurus, Starlight)
Cross-referenced technical docsRST or Markdown + tool support
Quick document sharingMarkdown

The MyST Bridge

MyST (Markedly Structured Text) is a markdown flavor designed to work with Sphinx:

:::{note}
This is a MyST admonition.
:::
{ref}`cross-reference-label`

MyST gives you markdown syntax with RST’s extensibility and Sphinx integration. If you want Sphinx’s power but prefer markdown, MyST is the bridge.

Migration

RST to Markdown

Pandoc converts RST to markdown:

Terminal window
pandoc input.rst -f rst -t gfm -o output.md

Manual cleanup is usually needed for:

  • Directives (no markdown equivalent for many)
  • Cross-references (need to become explicit links)
  • Complex tables (simplify or use HTML)

Markdown to RST

Terminal window
pandoc input.md -f gfm -t rst -o output.rst

Simpler conversion since markdown features map to RST more cleanly. GFM tables become RST tables, links become RST links, and code blocks become code-block directives.

FAQ

Should I use markdown or reStructuredText for documentation?

Use markdown for most projects. It has broader adoption, simpler syntax, and works everywhere. Use reStructuredText if you’re working on a Python project that uses Sphinx, need built-in cross-references, or require complex table layouts.

Can I use markdown with Sphinx?

Yes. Sphinx supports markdown through the MyST-Parser extension. You get markdown syntax with Sphinx’s features (cross-references, directives, toctree). Install myst-parser and add it to your Sphinx conf.py.

What is the difference between RST and markdown?

RST has richer built-in features (directives, roles, cross-references, complex tables) and a single authoritative specification. Markdown is simpler, more widely adopted, and supported by far more tools. RST is dominant in the Python ecosystem; markdown is dominant everywhere else.

Is reStructuredText outdated?

No. RST is still the default for Python project documentation and is actively maintained. However, its adoption has not grown beyond the Python ecosystem, while markdown has become the universal standard for developer writing.

Try It Out

Write your documentation in markdown and publish it to a shareable URL with the MDtoLink editor. No Sphinx setup, no build pipeline.

For the full markdown syntax, see the markdown cheat sheet. For GFM features that close the gap with RST, see What Is GitHub Flavored Markdown?.


David Schemm
David Schemm

Founder, MDtoLink

David builds developer tools and writes about markdown workflows, documentation, and AI-assisted publishing.

Publish your markdown to a shareable URL

One command. Free to start. No credit card.