Skip to main content

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

Project description

Innomatica GmbH

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 License Python Platform


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+.

pip install innomd

That installs the innomd command on your $PATH. To install from source (e.g. a specific commit or for development):

git clone https://github.com/Innomatica-GmbH/innomd.git
cd innomd
pip install .            # or: pip install -e .   (editable)

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 python3-pip
pip 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.2.0.tar.gz (26.5 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.2.0-py3-none-any.whl (16.4 kB view details)

Uploaded Python 3

File details

Details for the file innomd-0.2.0.tar.gz.

File metadata

  • Download URL: innomd-0.2.0.tar.gz
  • Upload date:
  • Size: 26.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for innomd-0.2.0.tar.gz
Algorithm Hash digest
SHA256 9676199a8bec0cf7d2c693801ce54c9f851e9231c9b04bb542e9cbca486438f4
MD5 3853c341adac3589601bae88186fb951
BLAKE2b-256 17b279f7e260b9c54b4b9dd824d2a8a799b402b9e2a26ba352203df04a1095d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for innomd-0.2.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.2.0-py3-none-any.whl.

File metadata

  • Download URL: innomd-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 16.4 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.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9ef35dad61d8097c6c16b49ffb4821085ddc089402fc077852f9c862ac76f8eb
MD5 325d0bdcd42a47f8f39e64fea541aaf4
BLAKE2b-256 a9fafeb22676f61ad00f868a2c45db8da4c0efafe348f6c8b75eb04d024ecf39

See more details on using hashes here.

Provenance

The following attestation bundles were made for innomd-0.2.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