Terminal Markdown viewer with LaTeX math, Jupyter notebooks, live reload, and themes.
Project description
innomd — Terminal Markdown Viewer with LaTeX Math Support
Render Markdown files with real LaTeX math formulas, beautiful tables, and syntax-highlighted code — directly in your terminal.
Install · Usage · Features · vs glow / mdcat / bat · FAQ · License
innomd is a command-line Markdown viewer for Linux and macOS that
renders LaTeX math ($$…$$, $…$, \[…\], \(…\)) as clean Unicode,
so scientific notes, physics formulas, and technical documentation read
naturally in any terminal. Most CLI Markdown viewers — glow, mdcat, bat —
print $$\lambda = \frac{b}{T}$$ as raw LaTeX source. innomd shows it
as a proper formula:
$$\lambda_{\text{peak}} = \frac{b}{T} \quad \text{with } b = 2{,}898 \times 10^{-3} \text{ m·K}$$
renders as
▌ λₚₑₐₖ = b/T with b = 2,898 × 10⁻³ m·K
Who is this for?
- Scientists, engineers, and students who keep notes in Markdown with embedded LaTeX math and want to read them in a terminal instead of a browser.
- Data scientists and ML engineers who want to skim
.ipynbnotebooks without starting Jupyter. - Developers writing technical documentation (physics, ML, signal
processing) who already use tools like
glow,mdcat, orbatand miss proper math rendering. - Anyone who prefers a fast, keyboard-driven Markdown preview over spinning up VS Code or a PDF viewer.
Features
- LaTeX math to Unicode:
$$…$$,$…$,\[…\],\(…\)- Greek letters (
\lambda,\varepsilon,\sigma,\pi, …) - Operators (
\cdot,\times,\nabla,\int,\sum,\propto,\approx, …) - Fractions (
\frac,\dfrac,\tfrac), roots (\sqrt,\sqrt[n]{x}) - Sub- and superscripts, including nested braces
\text{…},\vec,\hat,\bar,\dot- Blackboard bold (
\mathbb{R},\mathbb{N},\mathbb{Z}, …)
- Greek letters (
- Jupyter notebook support — pass any
.ipynbfile and it's rendered as Markdown: cells, code with syntax highlighting, stream and execution outputs. - Live reload —
innomd --watch file.mdopens an interactive viewer that re-renders on every save and lets you scroll, search, and jump between matches — ideal for writing notes in one pane and previewing in another. - Theme presets — 9 built-in color themes:
default,nord,dracula,gruvbox,solarized-dark,solarized-light,tokyonight,github,mono. List withinnomd --list-themes. - Rich Markdown rendering via rich: headings, lists, blockquotes, links, syntax-highlighted code blocks.
- Beautiful tables with rounded Unicode borders and column alignment.
- Subtle horizontal rules (
---renders as centered· · ·). - Pager integration (
less -R) with automatic TTY detection. - Code-block safe — math inside fenced code blocks is never substituted.
- Pure Python — one script, one dependency (
rich), no Node, no Go toolchain.
Installation
Requires Python 3.9+. The recommended way is pipx,
which installs innomd into its own virtual environment and exposes the
command on your $PATH:
pipx install innomd
On Ubuntu/Debian, if pipx is not yet available:
sudo apt install -y pipx && pipx ensurepath
Why not plain pip? Modern Linux distributions (Debian, Ubuntu,
Fedora, …) ship Python as PEP 668 externally managed and will reject
sudo pip install. Either use pipx (recommended) or install into a
virtual environment:
python3 -m venv ~/.venvs/innomd
~/.venvs/innomd/bin/pip install innomd
ln -s ~/.venvs/innomd/bin/innomd ~/.local/bin/innomd
To install from source (e.g. a specific commit or for development):
git clone https://github.com/Innomatica-GmbH/innomd.git
cd innomd
pipx install . # or: pip install -e . (editable, inside a venv)
Windows (via WSL)
innomd depends on POSIX terminal APIs (termios, tty) for its
interactive watch mode, so it is developed and tested for Linux and
macOS. On Windows, use it inside the Windows Subsystem for Linux:
wsl --install -d Ubuntu
Then inside your Ubuntu shell:
sudo apt install -y pipx && pipx ensurepath
pipx install innomd
Open a WSL tab in Windows Terminal — everything including watch mode, mouse scrolling, and search works as on Linux.
Usage
innomd README.md # render a file (uses pager on TTY)
innomd analysis.ipynb # render a Jupyter notebook
innomd --watch notes.md # live-reload preview
innomd -t dracula file.md # use a preset theme
innomd -t nord -c dracula file.md # preset + override code theme
innomd --list-themes # list available presets
cat notes.md | innomd # pipe from stdin
innomd -P file.md # no pager
innomd -w 100 file.md # fixed width
innomd -r file.md # raw preprocessed markdown
Options
| Flag | Description |
|---|---|
-P, --no-pager |
Print directly, no pager |
-r, --raw |
Output preprocessed markdown, no render |
-w N, --width N |
Force terminal width in columns |
-t, --theme |
Preset theme (see --list-themes) |
-c, --code-theme |
Override Pygments code theme only |
-W, --watch |
Live-reload: re-render on file change |
--list-themes |
List available preset themes |
Watch mode
innomd --watch file.md opens a scrollable viewer that reloads on file
changes while keeping your scroll position. It's a small less-like
pager, no external dependencies.
| Key | Action |
|---|---|
j, ↓ |
line down |
k, ↑ |
line up |
space, PgDn |
page down |
b, PgUp |
page up |
g, Home |
jump to top |
G, End |
jump to bottom |
/pattern + Enter |
case-insensitive regex search |
n / N |
next / previous match |
:q + Enter or q |
quit |
:reload or :r |
force re-render |
Esc |
cancel / or : prompt |
| mouse wheel | scroll (3 lines per tick) |
Mouse scrolling uses SGR reporting (xterm 1006). Inside tmux, add
set -g mouse on to your ~/.tmux.conf. When mouse reporting is
active, hold Shift to select text with the mouse — standard
xterm behaviour shared with less, htop, vim.
Comparison
How innomd stacks up against other terminal Markdown viewers:
| Tool | LaTeX math | Jupyter .ipynb |
Live reload | Tables | Code highlighting | Images | Language |
|---|---|---|---|---|---|---|---|
| innomd | ✅ (Unicode) | ✅ | ✅ | ✅ | ✅ | — | Python |
| glow | ❌ | ❌ | ❌ | ✅ | ✅ | — | Go |
| mdcat | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ (Kitty/iTerm2) | Rust |
| bat | ❌ | ❌ | ❌ | ❌ | ✅ (syntax only) | — | Rust |
| frogmouth | ❌ | ❌ | ❌ | ✅ | ✅ | — | Python |
If you don't write formulas, use glow or mdcat — they're excellent.
If you do, this tool exists because nothing else did the job in the terminal.
FAQ
Does innomd render math like a LaTeX compiler?
No. It substitutes LaTeX commands with Unicode glyphs. Matrices, large
alignments, and exotic notation will not look like PDF output. Physics
formulas, basic algebra, and common engineering notation render cleanly.
Why Python and not Rust/Go?
Because rich already solves 90 % of the Markdown-in-terminal problem,
and math preprocessing is a small layer on top. One dependency, one file,
no cross-compilation headaches.
Why not just use a browser or VS Code preview?
For quick notes, cat-ing a .md in the terminal is faster than opening
a GUI. This tool is for people who already live in tmux.
Does it work on Windows?
Not natively — innomd uses POSIX terminal APIs (termios/tty) for
its interactive watch mode. Use it via WSL (see the install
section). Inside WSL everything works identically to Linux.
Limitations
innomd approximates LaTeX with Unicode — it will not render arbitrary math
to pixel perfection. Terminals can't. For papers, export to PDF with pandoc.
Notation that survives well: physics formulas, basic algebra, common operators.
Notation that degrades: matrices, commutative diagrams, large alignments.
Development
Run the test suite (53 unit + end-to-end tests):
python3 -m unittest discover -s tests -t tests -v
CI runs the suite on Python 3.9 – 3.12 against every push and pull request.
Contributing
Issues and pull requests welcome. Keep changes small and focused; there are
no runtime dependencies besides rich.
License
MIT © 2026 Innomatica GmbH
Maintainer: Ivan Maradzhiyski <ivan.maradzhiyski@innomatica.de>
Built by Innomatica GmbH — software engineering for DACH and beyond.
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
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 innomd-0.3.0.tar.gz.
File metadata
- Download URL: innomd-0.3.0.tar.gz
- Upload date:
- Size: 28.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3003ec0a880d87fc775c8b35bc4583f400b36395abd5d917a0e8959fa0e26b1a
|
|
| MD5 |
66f9a35409b57d4fa562e537b41d93d5
|
|
| BLAKE2b-256 |
b20352ddb57c714baee193adbd79afec3fcc30bb293cb01d5985d4888ca67d5c
|
Provenance
The following attestation bundles were made for innomd-0.3.0.tar.gz:
Publisher:
publish.yml on Innomatica-GmbH/innomd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
innomd-0.3.0.tar.gz -
Subject digest:
3003ec0a880d87fc775c8b35bc4583f400b36395abd5d917a0e8959fa0e26b1a - Sigstore transparency entry: 1341832743
- Sigstore integration time:
-
Permalink:
Innomatica-GmbH/innomd@d1f89df7ba5719c0f9e5ede45577bbde17910890 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/Innomatica-GmbH
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d1f89df7ba5719c0f9e5ede45577bbde17910890 -
Trigger Event:
release
-
Statement type:
File details
Details for the file innomd-0.3.0-py3-none-any.whl.
File metadata
- Download URL: innomd-0.3.0-py3-none-any.whl
- Upload date:
- Size: 18.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7582226020a1e4aa921f3cce8310a4ece1bc7176457e251c68d3ce5f01d80672
|
|
| MD5 |
14af6ed8deaa05e7b9e8360f5922a5d3
|
|
| BLAKE2b-256 |
453d8babe7d5f842e31ee7ce30b61551a2cc6ac7d26f77748476d38362043f5d
|
Provenance
The following attestation bundles were made for innomd-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on Innomatica-GmbH/innomd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
innomd-0.3.0-py3-none-any.whl -
Subject digest:
7582226020a1e4aa921f3cce8310a4ece1bc7176457e251c68d3ce5f01d80672 - Sigstore transparency entry: 1341832747
- Sigstore integration time:
-
Permalink:
Innomatica-GmbH/innomd@d1f89df7ba5719c0f9e5ede45577bbde17910890 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/Innomatica-GmbH
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d1f89df7ba5719c0f9e5ede45577bbde17910890 -
Trigger Event:
release
-
Statement type: