Skip to main content

Markdown rendering for Typer CLI applications — drop-in replacement with syntax highlighting

Project description

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

Apache License 2.0 - see LICENSE for details.

Author

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

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

typermd-0.1.1.tar.gz (22.7 kB view details)

Uploaded Source

Built Distribution

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

typermd-0.1.1-py3-none-any.whl (16.2 kB view details)

Uploaded Python 3

File details

Details for the file typermd-0.1.1.tar.gz.

File metadata

  • Download URL: typermd-0.1.1.tar.gz
  • Upload date:
  • Size: 22.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for typermd-0.1.1.tar.gz
Algorithm Hash digest
SHA256 87ea722181649d579ebd79e1a48afcaaa58df6684dccd48123b8546776edcbdd
MD5 6b360e7b6b0cbdf3333ad24f38afa196
BLAKE2b-256 c8aac4a8b8fd57c878deb155dd8a5a50a62555c6a3e7d1f46c364acf6ac512be

See more details on using hashes here.

File details

Details for the file typermd-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: typermd-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 16.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for typermd-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 78742c332f643149fefa079b24df6c81570dca66db568c324abadd611e52198b
MD5 89187b699e2a4230ff41aba8c8c04eb6
BLAKE2b-256 0e911539810821ad0dab1101763902ea975807cb368d2152f760d72a67a54ecb

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