Beautiful markdown viewer and renderer for CLI, CI/CD, and automated workflows
Reason this release was yanked:
Unusable
Project description
Markdown Viewer
Open any markdown file in a full browser UI with one command. Supports PDF and Word export, Mermaid diagrams, math equations, syntax highlighting, and content translation.
[TOC]
๐ฆ Installation
pip install markdown-viewer-app
playwright install chromium
playwright install chromiumis a one-time setup (~140 MB) required for PDF export. Skip it if you don't need PDF export.
๐ Quick Start
# Open a file in your browser
mdview README.md
# Export to PDF
mdview README.md --export-pdf
# Export to Word
mdview README.md --export-word
# Export to both at once
mdview README.md --export-pdf --export-word
# Render to HTML only (no browser โ useful for CI/CD)
mdview README.md --no-browser
# Save HTML to a specific file
mdview README.md -o output.html
# Use a custom port (default is 5000)
# Note: Some ports like 6000 are blocked by Chrome - use 5001, 8000, 8080, etc.
mdview README.md -p 5001
# Stop the background server on a custom port
mdview --stop -p 5001
When you run mdview <file>, the app:
- Starts a background server on port 5000 (silently โ no extra window opens)
- Opens your browser directly to the rendered file
- Returns you to the terminal immediately
The server keeps running in the background. Subsequent mdview calls reuse it instantly. Use -p/--port to run multiple servers on different ports simultaneously.
Port Selection: Chrome and Edge block certain ports for security reasons. For example:
- Port 6000-6063: Blocked because they're used by the X11 windowing system (Unix/Linux). Chrome prevents malicious websites from using your browser to attack local X11 services, which could allow screen capture, keystroke logging, or connection hijacking.
- Port 6665-6669: IRC ports, also blocked for security.
If you see
ERR_UNSAFE_PORT, choose a safe port like 5001, 8000, 8080, or 3000. Full list of blocked ports.
๐ฅ๏ธ CLI Reference
mdview [file] [options]
Arguments
| Argument | Description |
|---|---|
file |
Path to the markdown file to render (optional โ prompts interactively if omitted in a terminal) |
Options
| Flag | Default | Description |
|---|---|---|
-o, --output <path> |
(temp file) | Save rendered HTML to this path instead of a temporary file |
--no-browser |
off | Render without opening a browser window |
--keep |
off | Keep the HTML output file after rendering (saved as <filename>.html next to the source) |
--export-pdf [path] |
โ | Export to PDF; optionally specify an output path |
--export-word [path] |
โ | Export to Word (.docx); optionally specify an output path |
--share-pdf |
โ | Export to PDF and open your email client with it attached |
--share-word |
โ | Export to Word and open your email client with it attached |
--browser <name-or-path> |
(system default) | Browser to open (e.g. firefox, chrome, msedge, safari, opera, iexplore). Accepts any name recognised by Python's webbrowser module or a full path to the browser executable |
-p, --port <port> |
5000 |
Port for the background Flask server. Note: Chrome/Edge block certain ports for security (e.g., 6000-6063 for X11, 6665-6669 for IRC). Use safe ports like 5001, 8000, 8080, 3000 |
--stop |
โ | Stop the background server and release the port |
--version |
โ | Print the installed version and exit |
Examples
# --- Viewing ---
mdview README.md # Open in browser (default)
mdview README.md --no-browser # Render without opening browser
mdview README.md --no-browser --keep # Render and save README.html next to the source
# --- HTML output ---
mdview README.md -o docs/out.html # Save rendered HTML to a specific path
mdview README.md --no-browser -o out.html # Save HTML, no browser
# --- PDF export ---
mdview README.md --export-pdf # Export to README.pdf (same directory)
mdview README.md --export-pdf ~/docs/out.pdf # Export to a specific path
# --- Word export ---
mdview README.md --export-word # Export to README.docx
mdview README.md --export-word ~/docs/out.docx
# --- Export both at once ---
mdview README.md --export-pdf --export-word
# --- Email sharing ---
mdview README.md --share-pdf # Export PDF and open email client
mdview README.md --share-word # Export Word and open email client
# --- Browser selection ---
mdview README.md --browser firefox # Open in Firefox
mdview README.md --browser chrome # Open in Google Chrome
mdview README.md --browser msedge # Open in Microsoft Edge
mdview README.md --browser safari # Open in Safari (macOS)
mdview README.md --browser opera # Open in Opera
mdview README.md --browser brave # Open in Brave (if on PATH)
mdview README.md --browser iexplore # Open in Internet Explorer
# Full executable path (useful when browser is not on PATH)
mdview README.md --browser "C:/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe"
mdview README.md --browser "/usr/bin/google-chrome"
# --- Server / port management ---
mdview README.md -p 5001 # Open using a custom port
mdview --stop # Stop the default server (port 5000)
mdview --stop -p 5001 # Stop a server on a custom port
# โ ๏ธ Note: Some ports are blocked by browsers for security reasons
# Chrome/Edge block port 6000-6063 (X11 windowing system - prevents screen capture/keystroke hijacking)
# Also blocked: 6665-6669 (IRC), and others
# Full list: https://chromium.googlesource.com/chromium/src.git/+/refs/heads/main/net/base/port_util.cc
# Use safe ports like: 5001, 5050, 8000, 8080, 8888, 9000, 3000, 4000
mdview README.md -p 8080 # Safe alternative port
# --- CI/CD (non-interactive) ---
# When stdout is not a TTY, browser and server are skipped automatically
mdview README.md -o output.html
# --- Version ---
mdview --version
โจ Features
๐ Rich Markdown Rendering
- Full GitHub Flavored Markdown (GFM) support
- Syntax highlighting for 180+ programming languages
- Tables, task lists, footnotes, blockquotes, and more
- Emoji support with correct Unicode rendering
๐ Diagram Support
- Mermaid: flowcharts, sequence diagrams, pie charts, Gantt charts, state diagrams
- Diagrams are preserved in all export formats
๐ข Math Equations
- KaTeX integration for beautiful math rendering
- Inline:
$E = mc^2$ - Block equations with full LaTeX syntax
๐ Export
- PDF โ high-quality, print-ready (powered by Playwright/Chromium)
- Word (.docx) โ editable documents with preserved formatting
- Silent: no popup dialogs, status bar updates on completion
๐ Translation
- Translate content to 15+ languages directly from the UI
- Preserves markdown formatting and code blocks
- Powered by MyMemory (free API, no key needed)
๐ Security
- CSRF protection on all API endpoints
- Content Security Policy (CSP) headers
- Input validation with Marshmallow schemas
- Path traversal protection
- Localhost-only server binding (127.0.0.1)
๐ Frontend Asset Policy (No CDN at Runtime)
- The Electron renderer does not fetch JS/CSS libraries from external CDNs at runtime.
- Frontend libraries are vendored locally under
markdown_viewer/electron/renderer/vendor/. - This avoids CSP
connect-srcviolations, improves reliability in restricted networks, and keeps the UI functional offline. - Source map references are stripped from vendored assets to prevent blocked
.mapfetch noise in the console. - When upgrading frontend library versions, update the files in
renderer/vendor/and keepindex.htmlscript/style references local.
๐ Local File Navigation
- Both relative and absolute paths to
.mdfiles open the target inside the viewer โ no 404s:[See also](../other-doc.md) <!-- relative --> [Changelog](docs/CHANGELOG.md) <!-- relative --> [Notes](C:\Users\me\Documents\notes.md) <!-- absolute -->
- File transclusion โ embed another markdown file's full content inline using the
![[path]]syntax (Obsidian-style). Both relative and absolute paths work:![[../shared/header.md]] <!-- relative --> ![[snippets/installation.md]] <!-- relative --> ![[C:\docs\shared\footer.md]] <!-- absolute -->
Transclusions are resolved recursively (up to 10 levels). Images inside embedded files are re-resolved relative to their own location, so they always display correctly.
๐ผ๏ธ Local Image Rendering
- Images referenced by relative or absolute paths are served securely via the built-in
/api/imageendpoint - Both Windows backslash and forward-slash paths are supported:
 <!-- relative -->  <!-- relative, parent dir -->  <!-- absolute, backslash -->  <!-- absolute, forward-slash -->
- Remote images (
https://) pass through unchanged
๐ Browser Compatibility
The viewer UI runs in any modern browser. The --browser flag lets you specify exactly which one to use โ useful when a corporate proxy or security policy restricts the default browser:
| Browser | --browser value |
Notes |
|---|---|---|
| Google Chrome | chrome |
Recommended; best Mermaid and PDF support |
| Mozilla Firefox | firefox |
Fully supported |
| Microsoft Edge | msedge |
Fully supported (Chromium-based) |
| Brave | brave or full path |
Fully supported (Chromium-based) |
| Opera | opera |
Fully supported |
| Safari | safari |
Fully supported (macOS only) |
| Internet Explorer | iexplore |
Basic rendering only โ IE does not support ES6 modules; a "Browser Not Supported" notice is shown instead of a broken page |
| Any other browser | Full path to executable | Pass the absolute path, e.g. "C:/MyBrowser/browser.exe" |
Corporate environments: if the system default browser is locked down (e.g. a hardened Internet Explorer), pass
--browser firefoxor--browser msedgeto open in a modern browser instead.
๐ ๏ธ Productivity Tools
- Copy all content with one click
- Share via email
- Keyboard shortcuts:
Ctrl+O(open),Ctrl+Shift+C(copy),F5(refresh),F11(fullscreen)
๐ Markdown Reference
Basic Formatting
# Heading 1
## Heading 2
### Heading 3
**bold**, *italic*, ~~strikethrough~~, ==highlighted==
- Unordered list
- Nested item
1. Ordered list
[Link text](https://example.com)

Local File Links
Both relative and absolute paths to .md files open the target inside the viewer:
[Changelog](CHANGELOG.md) <!-- same directory -->
[Installation guide](docs/INSTALLATION.md) <!-- subdirectory -->
[Parent README](../README.md) <!-- parent directory -->
[Notes](C:\Users\me\Documents\notes.md) <!-- absolute path -->
File Transclusion (Embed)
Embed the full content of another markdown file inline using ![[path]]:
# My Document
![[shared/header.md]]
## Section 1
...
![[shared/footer.md]]
- Both relative and absolute paths are supported
- Relative paths resolve from the current file's directory
- Transclusions are resolved recursively (up to 10 levels deep)
- Circular includes are detected and skipped
- Images inside embedded files resolve correctly relative to their own location
Code Blocks
```python
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
```
```sql
SELECT name, COUNT(*) FROM users GROUP BY name;
```
Tables
| Feature | Markdown Viewer | Typora | VS Code |
|----------------|:---------------:|:------:|:-------:|
| PDF Export | โ
| โ
| โ |
| Word Export | โ
| โ
| โ |
| Translation | โ
| โ | โ |
| Diagrams | โ
| โ
| โ
|
| Free & Open | โ
| โ | โ
|
Mermaid Diagrams
```mermaid
graph TD
A[Start] --> B{Working?}
B -->|Yes| C[Great!]
B -->|No| D[Debug] --> B
```
```mermaid
sequenceDiagram
Client->>Server: Request
Server-->>Client: Response
```
Math Equations
Inline: $x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$
Block:
$$
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
$$
Task Lists
- [x] Install Markdown Viewer
- [x] Open first document
- [ ] Try exporting to PDF
๐ง Development Setup
git clone https://github.com/dimpletz/markdown-viewer.git
cd markdown-viewer
poetry install
poetry run playwright install chromium
Run
# Open a file (server auto-reloads on code changes)
poetry run mdview README.md
# Or start the server standalone
poetry run mdview README.md --no-browser
Tests
# Run all tests
poetry run pytest
# With coverage report
poetry run pytest --cov=markdown_viewer --cov-report=html
Project Structure
markdown-viewer/
โโโ markdown_viewer/
โ โโโ app.py # Flask application factory
โ โโโ routes.py # API endpoints
โ โโโ server.py # Server management
โ โโโ cli.py # CLI entry point (mdview)
โ โโโ electron/ # Browser UI (HTML/JS/CSS)
โ โ โโโ renderer/
โ โ โโโ index.html
โ โ โโโ scripts/
โ โ โโโ styles/
โ โโโ exporters/ # PDF & Word export
โ โโโ processors/ # Markdown processing
โ โโโ translators/ # Translation service
โ โโโ utils/ # File handling
โโโ tests/
โโโ docs/
โโโ examples/
๐ Known Limitations
- PDF export requires
playwright install chromium(one-time ~140 MB download) - Translation requires an internet connection
- Word export has limited support for complex CSS styling
๐ More Documentation
๐ค Contributing
- Fork the repository
- Create a branch:
git checkout -b feature/my-feature - Make your changes and add tests:
poetry run pytest - Open a pull request
๐ License
MIT License โ see LICENSE for details.
๐ Acknowledgments
- Flask โ Python web framework
- Python-Markdown โ Markdown parser
- Playwright โ PDF generation via Chromium
- python-docx โ Word document export
- Mermaid โ Diagram rendering
- KaTeX โ Math typesetting
- Pygments โ Syntax highlighting
- DOMPurify โ XSS sanitization
- MyMemory โ Free translation API (called directly via stdlib
urllib)
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 markdown_viewer_app-1.3.3.tar.gz.
File metadata
- Download URL: markdown_viewer_app-1.3.3.tar.gz
- Upload date:
- Size: 2.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.4 CPython/3.14.3 Windows/11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eff710de2d98aff1b6da3f0b496f704464350c3c372994419fbd96e45cf40dc7
|
|
| MD5 |
1ed28a3608fbf97c9078408de837c8d3
|
|
| BLAKE2b-256 |
02fbbed5d3fbd4bafa5901110f60752a27c5dd79a7710f6848ed20e7cd19f502
|
File details
Details for the file markdown_viewer_app-1.3.3-py3-none-any.whl.
File metadata
- Download URL: markdown_viewer_app-1.3.3-py3-none-any.whl
- Upload date:
- Size: 2.3 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.4 CPython/3.14.3 Windows/11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c6916d366af3c28f83f112ee5634f48bc4f628b2d91332523aa8d0c609ccc248
|
|
| MD5 |
48f3c993bb69d4d1bbfb92f57bafe041
|
|
| BLAKE2b-256 |
3b832839ce2593a1e88431ac5bbc788f0bbbedd9a47815bd77e2840354e534e1
|