Python-based markdown preview server with live reload, themes, and static export
Project description
███╗ ███╗ █████╗ ██████╗ ██╗ ██╗██████╗ ██████╗ ██╗ ██╗
████╗ ████║██╔══██╗██╔══██╗██║ ██╔╝██╔══██╗██╔══██╗╚██╗ ██╔╝
██╔████╔██║███████║██████╔╝█████╔╝ ██║ ██║██████╔╝ ╚████╔╝
██║╚██╔╝██║██╔══██║██╔══██╗██╔═██╗ ██║ ██║██╔═══╝ ╚██╔╝
██║ ╚═╝ ██║██║ ██║██║ ██║██║ ██╗██████╔╝██║ ██║
╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝
markdpy - markdown in python
Python-based markdown preview server with live reload, themes, diagrams, and static export capabilities.
✨ 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
.mdfiles - 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
- Check that
--no-reloadis not set - Verify WebSocket connection in browser console (F12)
- Check firewall settings
- Try
--log-level DEBUGfor detailed logs
Theme Not Loading
- Clear browser cache (Ctrl+Shift+R or Cmd+Shift+R)
- Check browser console for CSS loading errors
- Verify
src/markdpy/static/css/themes/directory exists
Mermaid Diagrams Not Rendering
- Ensure CDN is accessible (requires internet connection)
- Check browser console for JavaScript errors
- Verify diagram syntax at mermaid.live
Made with ❤️ by the markdpy team
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file markdpy-0.1.2.tar.gz.
File metadata
- Download URL: markdpy-0.1.2.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
621711b38049e350aeda463f08ce3bb0b5202c6e7292d0b71ea7bb1275bf07b5
|
|
| MD5 |
ddbd40113b5343fe00f4368563b34366
|
|
| BLAKE2b-256 |
eb3bdcb73745cffa9e3f98845ec9c4e376af65999281357c019ce07c95992e73
|
File details
Details for the file markdpy-0.1.2-py3-none-any.whl.
File metadata
- Download URL: markdpy-0.1.2-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d19030ea4def025c83c4be737485a730de527819846f99950df035c96d8cc356
|
|
| MD5 |
eee927ad9b6a4dfd4fc4a1ef88651da5
|
|
| BLAKE2b-256 |
c2e33abe1c937e0ec281d638c66679a681f84cdaf063527661c7d899923bccab
|