painted

Quickstart

Five copy/paste steps: install → first Block → first composition → first print_block → first run_cli.


1) Install

pip install painted

2) First Block

Create a Block (an immutable rectangle of styled cells):

from painted import Block, Style

block = Block.text("deploy OK", Style(fg="green", bold=True))

3) First composition

Compose blocks into a small “card” using functions like join_vertical and border:

from painted import Block, Style, border, join_vertical, ROUNDED

header = Block.text(" api-gateway ", Style(bold=True, reverse=True))
status = join_vertical(
    Block.text("  replicas: 2/3 ready", Style(fg="yellow")),
    Block.text("  /health:  200  12ms", Style(fg="green")),
)
card = border(join_vertical(header, status), chars=ROUNDED)

4) First print_block

Print a Block to stdout. When stdout is a TTY, painted emits ANSI styles; when piped, it emits plain text.

from painted import print_block

print_block(card)

5) First run_cli

Use run_cli() when you want one entrypoint that can produce quiet/verbose output, JSON, and/or an interactive TUI.

import sys
from painted import Block, CliContext, run_cli

def render(ctx: CliContext, data: dict) -> Block:
    return Block.text(f"status: {data['status']}")

def fetch() -> dict:
    return {"status": "ok"}

if __name__ == "__main__":
    run_cli(sys.argv[1:], render=render, fetch=fetch)

Run it:

python myapp.py
python myapp.py --json
python myapp.py -q
python myapp.py -v
python myapp.py -i