Skip to main content

Fast popup Markdown viewer with sidebar TOC, multi-file tabs, css themes, mermaid, katex, obsidian yaml show/hide, keyboard-based

Project description

openmd

Markdown viewer for humans — not AI models.

I got tired of reading raw Markdown with less or opening VS Code/Cursor just to see it nicely rendered. So I built openmd.

Run openmd *.md (or any Markdown files) from the shell and a window pops up instantly — the shell prompt returns immediately, no blocking, no & needed.

Python 3.10+ License: MIT Platform: macOS / Linux PyPI version

GitHub: RufusLin/openmd

Warning - Lazy Maintainer: Yeah, not a fan of reading PRs, but will pay attention to issues to fix bugs. Feel free to fork, but remember to give credit, please.🙏🏻

X: @rufuslinjapan


What it looks like

openmd with multiple tabs and TOC sidebar Mermaid diagram and KaTeX math rendered

(Click any image to enlarge)


Usage

# Open a single file
openmd README.md

# Open multiple files (each in its own tab)
openmd doc1.md doc2.md doc3.md

# No arguments — interactive picker (choose from .md files in current directory)
openmd

# Glob expansion
openmd docs/*.md

Shell function (optional, for quick access)

Add to your ~/.zshrc or ~/.bashrc:

openmd() { "$HOME/lab/openmd/openmd" "$@" 2>&1 }

Or if installed via pip, the openmd command is already in your PATH.

Remote preview via SSH (optional)

remotemd() {
    local remote_path="$1"
    local filename=$(basename "$remote_path")
    local tmp_file="/tmp/remote_preview_${filename}.md"
    scp "home:$remote_path" "$tmp_file" && openmd "$tmp_file"
}

Features

  • Meta panel — shows YAML front‑matter in a hidden-by-default div; toggle via the META button or the M shortcut key
  • Quick Help — access a concise help dialog with navigation and shortcuts via the HELP button or the H shortcut key
  • Instant launch — the shell prompt returns immediately; openmd runs as a fully detached GUI app (no & needed, no blocking)
  • GitHub-dark theme by default — comfortable reading in low-light environments
  • 16 built-in themes — dark and light, switch instantly via the swatch bar at the bottom of the sidebar; fully customizable via .openmd.css
  • Live reload — the preview updates instantly when the file is saved; no manual refresh needed
  • Mermaid diagrams — fenced mermaid blocks render automatically via CDN
  • KaTeX math — inline $…$ and display $$…$$ expressions render out of the box
  • Sidebar TOC — hierarchical (H1 → H2 → H3); click or press Return to jump to any heading. The sidebar takes up 20% of your screen, and you can easily jump between the sidebar and display using the left/right arrow keys.
  • Dynamic Pane Focus — unselected panes automatically dim to 60% opacity so you always know exactly where your keyboard focus is.
  • Multi-file tabs — pass multiple .md files (even *.md globs) and each opens in its own tab, max 6
  • Interactive file picker — run with no arguments and choose from .md files in the current directory via a curses-based picker
  • Remote image caching — remote images in your Markdown are downloaded to a local temp cache so they render correctly in the Qt WebEngine view
  • External link handling — clicking any http/https link opens it in your default browser; the preview window never navigates away
  • Update notifications — on startup, openmd quietly checks PyPI (at most once every 6 hours) and shows a non-intrusive popup if a newer version is available
  • Version in title bar — the window title shows the running version for quick reference
  • Keyboard shortcutsEsc closes the window; Up/Down arrows and Return navigate the sidebar, Left/Right switch panes, and Cmd+Left/Right switch tabs

Theming with .openmd.css

openmd ships with 16 built-in themes (8 dark, 8 light) selectable from the swatch bar. To customize further, create a .openmd.css file — it is appended after the built-in CSS so any rule you write overrides the default via normal CSS cascade.

Lookup order (first match wins):

Priority Location
1 Current working directory (./)
2 openmd install directory
3 Home directory (~/)

To switch themes programmatically, add body.theme-yourname { ... } blocks to your .openmd.css. The swatch bar automatically discovers and displays any themes defined there.


Requirements

Note: Mermaid and KaTeX require an internet connection to load from CDN.


Installation

pip (recommended)

pip install openmd

After installing, the openmd command is available in your shell.

macOS Installation (IMPORTANT)

The default python3 on macOS is still Python 3.9, which is not supported.

Easiest & recommended (auto-handles Python):

brew install uv
uv tool install openmd

Alternative with plain Homebrew:

brew install python          # installs the latest Python 3
python3 -m pip install openmd

From source

git clone https://github.com/RufusLin/openmd.git
cd openmd
pip install -e .

Keyboard shortcuts

Key Action
Esc Close the preview window
/ Navigate the sidebar TOC
/ Move focus between sidebar and display
Cmd + ← / → Navigate among tabs
Cmd + Shift + < / > Change font size
Return Jump to selected heading
M Toggle Meta Panel (YAML front-matter)
H Show Quick Help dialog

License

MIT

Project details


Download files

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

Source Distribution

openmd-1.4.26.tar.gz (21.9 kB view details)

Uploaded Source

Built Distribution

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

openmd-1.4.26-py3-none-any.whl (22.4 kB view details)

Uploaded Python 3

File details

Details for the file openmd-1.4.26.tar.gz.

File metadata

  • Download URL: openmd-1.4.26.tar.gz
  • Upload date:
  • Size: 21.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for openmd-1.4.26.tar.gz
Algorithm Hash digest
SHA256 9dd4ba6a039eff61972f628c6ce1cd7e1f9e74b8884edd7a281d89690c261fc8
MD5 b5ab9fb8ef2ed399b35adbc4bb7ccf4f
BLAKE2b-256 f38624106be0f0f76c0023edd6055b5fc0573d2a43f8463d065e6a6ef81b2e3f

See more details on using hashes here.

File details

Details for the file openmd-1.4.26-py3-none-any.whl.

File metadata

  • Download URL: openmd-1.4.26-py3-none-any.whl
  • Upload date:
  • Size: 22.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for openmd-1.4.26-py3-none-any.whl
Algorithm Hash digest
SHA256 42686e4605e11607476bde1a3d18a970e305bbe00ead006c8b062126d91c1544
MD5 2be321d5958213a605b01e3b0afd6f36
BLAKE2b-256 7e569d8876da70377ad348f7022014621d6e85218548ea450a08d3cead8db929

See more details on using hashes here.

Supported by

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