Markdown rendering for Typer CLI applications — drop-in replacement with syntax highlighting
Project description
typermd
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 (
# H1through###### 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_COLORfor CI/CD pipelines - Supports
TYPERMD_THEMEfor 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
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 typermd-0.1.4.tar.gz.
File metadata
- Download URL: typermd-0.1.4.tar.gz
- Upload date:
- Size: 191.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd5ee93866f92bc01f055ea2f4409bc55b6d81c2fb987f25d293521d0b0ab9d6
|
|
| MD5 |
2d9c485ccf2e659be3c4160c6e18989a
|
|
| BLAKE2b-256 |
96ec2ef233d9b046b55fcb3870e97d5854b402095e7fcfe4d352a9fda1863470
|
File details
Details for the file typermd-0.1.4-py3-none-any.whl.
File metadata
- Download URL: typermd-0.1.4-py3-none-any.whl
- Upload date:
- Size: 18.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
54bfabd55ea4f64f850efdeedc75ff963834bb06ec637bace30a26cd12b75e86
|
|
| MD5 |
41eb968dc83f2faae27cf73487f7da1f
|
|
| BLAKE2b-256 |
39e3b13804ae10d2034e5fe8c14870bbc51431c914d4dab1eca38eccb7fc2eca
|