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.
Last updated: March 3, 2026
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
| Aspect | Markdown | reStructuredText |
|---|---|---|
| Created | 2004 (John Gruber) | 2002 (David Goodger) |
| Specification | CommonMark + GFM | Docutils spec |
| File extension | .md | .rst |
| Learning curve | Low (15-30 minutes) | Medium (1-2 hours) |
| Ecosystem | GitHub, VS Code, almost everything | Python, Sphinx, Read the Docs |
| Extensibility | Limited (HTML fallback) | Built-in directive and role system |
| Cross-references | Not built-in | Built-in |
| Table of contents | Not built-in (tool-dependent) | Built-in (.. toctree::) |
| Admonitions | GFM alerts (GitHub-only) | Built-in (.. note::, .. warning::) |
| Adoption | Dominant overall | Dominant in Python |
Syntax Comparison
Headings
Markdown:
# Heading 1## Heading 2### Heading 3reStructuredText:
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.
Links
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:
reStructuredText:
.. image:: /images/photo.png :alt: Alt text :width: 400pxRST images support width, height, alignment, and scale as built-in options. Markdown needs HTML fallback for sizing.
Code Blocks
Markdown:
```pythondef 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. First2. SecondreStructuredText:
- Item one- Item two
#. First (auto-numbered)#. SecondRST 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 42bar 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
| Scenario | Recommendation |
|---|---|
| GitHub README | Markdown |
| General-purpose documentation | Markdown |
| Python project docs | RST (Sphinx) or Markdown (via MyST) |
| Note-taking / personal writing | Markdown |
| Blog posts | Markdown |
| Large documentation projects (100+ pages) | RST (Sphinx) or Markdown (Docusaurus, Starlight) |
| Cross-referenced technical docs | RST or Markdown + tool support |
| Quick document sharing | Markdown |
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:
pandoc input.rst -f rst -t gfm -o output.mdManual 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
pandoc input.md -f gfm -t rst -o output.rstSimpler 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?.
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.