Skip to main content

Terminal Markdown viewer with LaTeX math, Jupyter notebooks, live reload, and themes.

Project description

innomd

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

Tests PyPI License Python Platform by Innomatica


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 .ipynb notebooks without starting Jupyter.
  • Developers writing technical documentation (physics, ML, signal processing) who already use tools like glow, mdcat, or bat and 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}, …)
  • Jupyter notebook support — pass any .ipynb file and it's rendered as Markdown: cells, code with syntax highlighting, stream and execution outputs.
  • Live reloadinnomd --watch file.md opens 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 with innomd --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

innomd-0.3.0.tar.gz (28.4 kB view details)

Uploaded Source

Built Distribution

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

innomd-0.3.0-py3-none-any.whl (18.1 kB view details)

Uploaded Python 3

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

Hashes for innomd-0.3.0.tar.gz
Algorithm Hash digest
SHA256 3003ec0a880d87fc775c8b35bc4583f400b36395abd5d917a0e8959fa0e26b1a
MD5 66f9a35409b57d4fa562e537b41d93d5
BLAKE2b-256 b20352ddb57c714baee193adbd79afec3fcc30bb293cb01d5985d4888ca67d5c

See more details on using hashes here.

Provenance

The following attestation bundles were made for innomd-0.3.0.tar.gz:

Publisher: publish.yml on Innomatica-GmbH/innomd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for innomd-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7582226020a1e4aa921f3cce8310a4ece1bc7176457e251c68d3ce5f01d80672
MD5 14af6ed8deaa05e7b9e8360f5922a5d3
BLAKE2b-256 453d8babe7d5f842e31ee7ce30b61551a2cc6ac7d26f77748476d38362043f5d

See more details on using hashes here.

Provenance

The following attestation bundles were made for innomd-0.3.0-py3-none-any.whl:

Publisher: publish.yml on Innomatica-GmbH/innomd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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