███╗ ███╗ █████╗ ██████╗ ██╗ ██╗██████╗ ██████╗ ██╗ ██╗
████╗ ████║██╔══██╗██╔══██╗██║ ██╔╝██╔══██╗██╔══██╗╚██╗ ██╔╝
██╔████╔██║███████║██████╔╝█████╔╝ ██║ ██║██████╔╝ ╚████╔╝
██║╚██╔╝██║██╔══██║██╔══██╗██╔═██╗ ██║ ██║██╔═══╝ ╚██╔╝
██║ ╚═╝ ██║██║ ██║██║ ██║██║ ██╗██████╔╝██║ ██║
╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝
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
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)
| File | Size | Uploaded | |
|---|---|---|---|
| markdpy-0.1.3.tar.gz | 182.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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
|