Skip to main content

typermd

PyPI version Python 3.10+ License: Apache-2.0 Tests

Markdown rendering for Typer CLI applications with syntax highlighting.

typermd is a drop-in replacement for Typer that adds beautiful markdown rendering to your CLI output — with zero code changes beyond the import.

Like clickmd is for Click, typermd is for Typer.

Installation

pip install typermd

Quick Start — Zero Code Changes

Just change your import:

# Before
import typer

# After — that's it!
import typermd as typer

Everything works exactly as before, but now typer.echo() auto-detects markdown and renders it with colors, and you get a new typer.md() function for explicit markdown output.

Minimal Example

import typermd as typer

app = typer.Typer()

@app.command()
def hello(name: str = typer.Option("World", "--name", "-n")):
    typer.md(f"""
## 👋 Hello, {name}!

Welcome to **typermd** — making Typer CLIs beautiful.

```python
import typermd as typer
typer.md("# It's that easy!")
""")

if name == "main": app()


## Features

### Drop-in Typer Replacement

All Typer API is re-exported: `Typer`, `Option`, `Argument`, `Context`, `run`, `echo`, `style`, `colors`, `confirm`, `prompt`, `progressbar`, `launch`, `edit`, and more.

### Auto-detecting `echo()`

```python
# Plain text — works normally
typer.echo("Regular output, no formatting applied")

# Markdown detected — auto-rendered with colors
typer.echo("## Status: **running**")

# Force plain output
typer.echo("## Not rendered", auto_markdown=False)

Explicit Markdown with md()

typer.md("""
# Deploy Report

| Service | Status |
|---------|--------|
| API     | ✅ OK  |
| DB      | ✅ OK  |

```bash
kubectl get pods -n production

""")


### Syntax Highlighting

Supported languages:

| Language | Aliases | Highlights |
|----------|---------|-----------|
| Python | `python`, `py` | Keywords, strings, comments, decorators |
| JavaScript | `javascript`, `js` | Keywords, strings, template literals |
| TypeScript | `typescript`, `ts` | Same as JavaScript |
| Bash | `bash`, `sh`, `shell`, `zsh` | Commands, comments, variables |
| JSON | `json` | Keys, strings, numbers, booleans |
| YAML | `yaml`, `yml` | Keys, values, comments |
| TOML | `toml` | Sections, keys, strings |
| SQL | `sql` | Keywords, strings |
| Rust | `rust`, `rs` | Keywords, types, attributes |
| Go | `go` | Keywords, strings |
| Dockerfile | `dockerfile` | Instructions |
| Log | `log` | Errors (red), warnings (yellow), success (green) |

### Tables

```python
from typermd import table

table(
    headers=["Name", "Version", "Status"],
    rows=[
        ["typermd", "0.1.0", "✅ OK"],
        ["typer", "0.9.0", "✅ OK"],
    ],
)

Panels

from typermd import panel

panel("Deployment complete!", title="Success")

Structured Logger

from typermd.logger import get_logger

log = get_logger("deploy")
log.info("Starting deployment...")
log.step(1, 3, "Building artifacts")
log.step(2, 3, "Running tests")
log.step(3, 3, "Deploying")
log.success("Deployed to production!")
log.warning("Cache may need warming")
log.error("Rollback required")
log.action("Next", "Monitor dashboard")

Themes

from typermd.themes import set_theme, list_themes

list_themes()         # ['default', 'monokai', 'solarized', 'nord']
set_theme("monokai")  # Switch theme

Or via environment variable:

export TYPERMD_THEME=monokai

Markdown Elements Supported

  • Headings (# H1 through ###### H6) with colored underlines
  • Bold (**text**) and italic (*text*)
  • Inline code (`code`) with background highlight
  • Code blocks with syntax highlighting
  • Bullet lists (- item) with indentation
  • Numbered lists (1. item)
  • Checklists (- [x] done, - [ ] todo)
  • Links ([text](url))
  • Blockquotes (> text)
  • Horizontal rules (---)

API Reference

Core Functions

Function Description
md(text) Render markdown to stdout
echo(msg, *, auto_markdown=True) Smart echo — auto-detects markdown
render_markdown(text, stream, use_colors) Render to any stream
render_to_string(text) Render and return as string
get_renderer(stream, use_colors) Get a MarkdownRenderer instance
table(headers, rows) Render a table
panel(content, title) Render a bordered panel
blockquote(content) Render a blockquote

All Typer Re-exports

Typer, Argument, Option, Context, Exit, Abort, run, main, colors, style, unstyle, prompt, confirm, progressbar, get_text_stream, get_binary_stream, open_file, launch, edit, clear, pause, get_app_dir

Project Structure

typermd/
├── src/typermd/          # Package source (src layout)
│   ├── __init__.py       # Public API: md(), echo(), table(), panel()
│   ├── renderer.py       # Core markdown renderer & syntax highlighting
│   ├── help.py           # Markdown help formatter for Typer
│   ├── logger.py         # Structured logger
│   ├── themes.py         # Color themes & NO_COLOR support
│   └── py.typed          # PEP 561 type marker
├── tests/                # Test suite
├── examples/             # Demo scripts
├── pyproject.toml        # Project config (hatchling)
└── README.md

Development

git clone https://github.com/wronai/typermd.git
cd typermd
pip install -e ".[dev]"
pytest

Comparison: clickmd vs typermd

Feature clickmd typermd
Framework Click Typer
Import import clickmd as click import typermd as typer
Type hints Click decorators Native Python type hints
Markdown click.md() typer.md()
Auto-detect click.echo() typer.echo()
Code changes Zero Zero

Standards

  • Respects NO_COLOR environment variable
  • Supports FORCE_COLOR for CI/CD pipelines
  • Supports TYPERMD_THEME for theme selection
  • PEP 561 typed package

License

Licensed under Apache-2.0.

Apache License 2.0 - see LICENSE for details.

Author

Tom Sapletta

Created by Tom Sapletta - tom@sapletta.com

Related Projects

  • Typer — Python CLI framework with type hints
  • Click — Python CLI framework
  • clickmd — Markdown rendering for Click CLIs
  • Rich — Rich text and formatting

Metadata

Release files for typermd 0.1.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for typermd 0.1.4
File Size Uploaded
typermd-0.1.4.tar.gz 191.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for typermd 0.1.4
File Interpreter ABI Platform
typermd-0.1.4-py3-none-any.whl Python 3 none any Details

Total release size: 210.5 kB

Release files / typermd-0.1.4.tar.gz

Download URL typermd-0.1.4.tar.gz
Size 191.8 kB
Tags Source
SHA-256 checksum
How to use checksums
bd5ee93866f92bc01f055ea2f4409bc55b6d81c2fb987f25d293521d0b0ab9d6
BLAKE2b-256 checksum
How to use checksums
96ec2ef233d9b046b55fcb3870e97d5854b402095e7fcfe4d352a9fda1863470
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release files / typermd-0.1.4-py3-none-any.whl

Download URL typermd-0.1.4-py3-none-any.whl
Size 18.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
54bfabd55ea4f64f850efdeedc75ff963834bb06ec637bace30a26cd12b75e86
BLAKE2b-256 checksum
How to use checksums
39e3b13804ae10d2034e5fe8c14870bbc51431c914d4dab1eca38eccb7fc2eca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release history Release notifications | RSS feed

This release

0.1.4 This release

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page