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

From PyPI (Recommended)

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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

markdpy-0.1.3.tar.gz (182.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

markdpy-0.1.3-py3-none-any.whl (112.1 kB view details)

Uploaded Python 3

File details

Details for the file markdpy-0.1.3.tar.gz.

File metadata

  • Download URL: markdpy-0.1.3.tar.gz
  • Upload date:
  • Size: 182.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.11

File hashes

Hashes for markdpy-0.1.3.tar.gz
Algorithm Hash digest
SHA256 66b194e2f52a998961db2bacf7e43f9b2bb9abc83b79052ec12983a756fc96a6
MD5 cbee18897a4265a4714655ed3f10bd0a
BLAKE2b-256 dae8cc315c3f5f81f312197bf169e27a6ebd9886775f1f120929dd0525e6d9ea

See more details on using hashes here.

File details

Details for the file markdpy-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: markdpy-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 112.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.11

File hashes

Hashes for markdpy-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 c8b2e9b0207dea902956cfb95a7344b3794dcf4c96c89a3d95e4ac87fc6f4123
MD5 2b6baaac0e45a96b28c057222b38a737
BLAKE2b-256 2da3537f1ccae91a149abfeea66d8c839645337d9f72a78a98910c95796bcba4

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 files

0.1.2

2 files

0.1.1

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page