Skip to main content
 ███╗   ███╗ █████╗ ██████╗ ██╗  ██╗██████╗ ██████╗ ██╗   ██╗
 ████╗ ████║██╔══██╗██╔══██╗██║ ██╔╝██╔══██╗██╔══██╗╚██╗ ██╔╝
 ██╔████╔██║███████║██████╔╝█████╔╝ ██║  ██║██████╔╝ ╚████╔╝
 ██║╚██╔╝██║██╔══██║██╔══██╗██╔═██╗ ██║  ██║██╔═══╝   ╚██╔╝
 ██║ ╚═╝ ██║██║  ██║██║  ██║██║  ██╗██████╔╝██║        ██║
 ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═════╝ ╚═╝        ╚═╝

markdpy - markdown in python

Python-based markdown preview server with live reload, themes, diagrams, and static export capabilities.

GitHub Release GitHub License GitHub Repo stars

✨ Features

  • 🔄 Live Reload: Automatic browser refresh on file changes with WebSocket
  • 🎨 Multiple Themes: Light and dark themes with smooth toggle
  • 📊 Mermaid Diagrams: Render flowcharts, sequence diagrams, and more
  • 📐 MathJax Support: Beautiful mathematical formulas (KaTeX-ready)
  • 📁 Directory Navigation: Browse multiple markdown files with sidebar
  • 📤 Static Export: Generate self-contained HTML for sharing
  • 🔒 Secure by Default: Directory traversal prevention, CSP headers
  • ⚡ Fast: <100ms rendering, <200ms reload latency
  • 🌐 Cross-Platform: Works on Linux, macOS, and Windows

📦 Installation

pip install markdpy

From Source

git clone https://github.com/eosho/markdpy.git
cd markdpy
pip install -e .

🚀 Quick Start

Serve a Single File

The simplest way to preview a markdown file:

markdpy README.md

This will:

  • Start the server on http://127.0.0.1:8000
  • Open your default browser automatically
  • Enable live reload (changes refresh the browser)

Serve a Directory

Preview all markdown files in a directory with navigation:

markdpy docs/

Features:

  • Sidebar navigation with all .md files
  • Automatic index detection (index.md, README.md)
  • Directory browsing support

Custom Configuration

markdpy docs/ --port 3000 --theme dark --no-open

📖 Detailed Usage

serve Command

Start a markdown preview server.

markdpy serve [PATH] [OPTIONS]

Arguments

Argument Type Default Description
PATH Path . (current directory) Path to markdown file or directory to serve

Options

Option Short Type Default Description
--port -p Integer 8000 Port to bind server (1024-65535)
--host -h String 127.0.0.1 Host address to bind server
--theme -t Choice light UI theme: light or dark
--no-open Flag False Don't open browser automatically
--no-reload Flag False Disable live reload (WebSocket)
--log-level Choice INFO Logging level: DEBUG, INFO, WARNING, ERROR

Examples

Serve with custom port:

markdpy docs/ --port 3000

Dark theme without auto-opening:

markdpy README.md --theme dark --no-open

Debug mode with live reload disabled:

markdpy docs/ --log-level DEBUG --no-reload

Bind to all interfaces (accessible from network):

markdpy docs/ --host 0.0.0.0 --port 8080

export Command

Export markdown to static HTML files.

markdpy export SOURCE [OUTPUT] [OPTIONS]

Arguments

Argument Type Default Description
SOURCE Path Required Source markdown file or directory
OUTPUT Path output Output directory for exported HTML

Options

Option Short Type Default Description
--theme -t Choice light Theme for exported HTML: light or dark
--minify Flag False Minify exported HTML (reduces file size)

Examples

Export single file:

markdpy export README.md output/

Export directory with dark theme:

markdpy export docs/ site/ --theme dark

Export with minification:

markdpy export docs/ site/ --minify

📝 Supported markdown Features

GitHub Flavored markdown (GFM)

  • Tables: Full table support with alignment
  • Task Lists: - [ ] and - [x] checkboxes
  • Strikethrough: ~~deleted text~~
  • Autolinks: Automatic URL detection

Code Blocks

Syntax highlighting for 100+ languages using Pygments:

def hello_world():
    print("Hello from markdpy!")

Mermaid Diagrams

graph LR
    A[Start] --> B[Process]
    B --> C[End]

Supported diagram types:

  • Flowcharts
  • Sequence diagrams
  • Class diagrams
  • State diagrams
  • Gantt charts
  • Pie charts

Mathematical Expressions

Inline math: $E = mc^2$

Block math:

$$ \int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2} $$

🔧 Configuration

Server Configuration

Configure via command-line options or environment variables:

Setting CLI Option Environment Variable Default
Host --host HOST 127.0.0.1
Port --port PORT 8000
Theme --theme THEME light
Log Level --log-level LOG_LEVEL INFO

Themes are stored in browser localStorage:

  • Key: markdpy-theme
  • Values: light | dark

🧪 Development

Setup Development Environment

# Clone repository
git clone https://github.com/eosho/markdpy.git
cd markdpy

# Create virtual environment
python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate

# Install with dev dependencies
pip install -e ".[dev]"

Run Tests

# Run all tests
pytest

# Run with coverage
pytest --cov=src/markdpy --cov-report=html

# Run specific test file
pytest tests/integration/test_http_view.py

# Run with verbose output
pytest -v

Code Quality

# Format code
black src/ tests/

# Lint code
ruff check src/ tests/

# Type checking
mypy src/

🐛 Troubleshooting

Port Already in Use

# Error: Port 8000 is already in use
markdpy README.md --port 8080

Live Reload Not Working

  1. Check that --no-reload is not set
  2. Verify WebSocket connection in browser console (F12)
  3. Check firewall settings
  4. Try --log-level DEBUG for detailed logs

Theme Not Loading

  1. Clear browser cache (Ctrl+Shift+R or Cmd+Shift+R)
  2. Check browser console for CSS loading errors
  3. Verify src/markdpy/static/css/themes/ directory exists

Mermaid Diagrams Not Rendering

  1. Ensure CDN is accessible (requires internet connection)
  2. Check browser console for JavaScript errors
  3. Verify diagram syntax at mermaid.live

Made with ❤️ by the markdpy team

Metadata

Release files for markdpy 0.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for markdpy 0.1.3
File Size Uploaded
markdpy-0.1.3.tar.gz 182.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for markdpy 0.1.3
File Interpreter ABI Platform
markdpy-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 294.1 kB

Release files / markdpy-0.1.3.tar.gz

Download URL markdpy-0.1.3.tar.gz
Size 182.0 kB
Tags Source
SHA-256 checksum
How to use checksums
66b194e2f52a998961db2bacf7e43f9b2bb9abc83b79052ec12983a756fc96a6
BLAKE2b-256 checksum
How to use checksums
dae8cc315c3f5f81f312197bf169e27a6ebd9886775f1f120929dd0525e6d9ea
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.11

Release files / markdpy-0.1.3-py3-none-any.whl

Download URL markdpy-0.1.3-py3-none-any.whl
Size 112.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c8b2e9b0207dea902956cfb95a7344b3794dcf4c96c89a3d95e4ac87fc6f4123
BLAKE2b-256 checksum
How to use checksums
2da3537f1ccae91a149abfeea66d8c839645337d9f72a78a98910c95796bcba4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.11

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page