A zero-dependency Python library for consistent, semantic CLI output.
Project description
Every module in a CLI codebase ends up inventing its own way to print "success" or "error." One file uses green text, another uses an emoji, a third does both differently. Output looks inconsistent, breaks in CI, and nobody notices until a log line leaks a password.
# before
print("\033[32mSuccess\033[0m")
# after
print(paint("Success", intent="success"))
RazTint defines a fixed mapping from intent (success, danger, warning, …) to color and icon once, and every call site reuses that same mapping instead of picking its own.
Preview
A simulated production log stream 9 secrets detected, 9 secrets redacted, 0 leaked to the terminal.
Table of Contents
- When to Use RazTint
- Installation
- Quick Start
- How It Compares
- Features
- Logging Integration Example
- Documentation
- Known Limitations
- Contributing
- License
When to Use RazTint
Reach for it if your CLI prints more than a couple of message types and you want them to look the same across modules, or you need output that renders correctly in CI, on Windows, and on terminals without a Nerd Font.
For a single colored print() in a one-off script, plain ANSI codes or termcolor are simpler and enough.
Installation
Requires Python 3.10+.
pip install raztint
From source:
git clone https://github.com/razbuild/raztint.git
cd raztint
uv sync
Quick Start
from raztint import ok, paint
print(f"{ok()} File saved.")
print(paint("Connection failed.", color="red", icon="err"))
# intent sets color + icon together from one semantic name
print(paint("Deployment complete.", intent="success"))
# redact masks secrets before the string is printed
print(paint("password=1234", intent="debug", redact=True)) # password=****
Redaction on its own, without formatting:
from raztint import redact
print(redact("password=supersecret api_key=ghp_abc123"))
# password=**** api_key=****
More examples in Getting Started.
How It Compares
| Capability | colorama / termcolor | rich | RazTint |
|---|---|---|---|
| ANSI color support | ✅ | ✅ | ✅ |
| Terminal UI components | ❌ | ✅ | ❌ |
| Semantic logging intents | ❌ | ❌ | ✅ |
| Automatic icon fallback | ❌ | ⚠️ Partial | ✅ |
| Secret masking | ❌ | ❌ | ✅ |
| Extra dependencies | None | Several | None |
RazTint isn't a rich replacement for dashboards or tables, it solves the narrower problem of making ok/err/warn/info messages consistent and safe by default.
Features
- Intents: presets (
success,danger,warning,debug, …) that separate meaning from styling paint(): one call for color, background, styles, and icons- Status icons:
ok(),err(),warn(),info(), each with the three-tier fallback - Redaction: pattern-based masking (
key=valuepairs likepassword=,api_key=,token=) applied as part of the formatting call, not a separate logging step; patterns are configurable, see Security & Redaction - Environment detection: Nerd Font → Unicode → ASCII, cached; configurable via
NO_COLOR,RAZTINT_FORCE_COLOR - Typed:
py.typed, full public API type hints - Low-level escape hatch: raw 16-color, 256-color, and 24-bit True Color support, plus bold/dim/italic/underline/strikethrough, for when intents aren't enough
Logging Integration Example
RazTint only returns a formatted string, it doesn't hook into logging or replace a handler. Pass that string to print(), a logger, or anything else that accepts a string.
import logging
from logging import Logger, getLogger
from raztint import paint
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
logger: Logger = getLogger(__name__)
logger.info(paint("Database migration completed.", intent="success", icon=None))
logger.warning(paint("Disk usage above 90%.", intent="warning", icon=None, styles="dim"))
logger.error(
paint("Authentication failed for token=abc123", intent="danger", redact=True, icon=None)
)
Documentation
| Guide | Description |
|---|---|
| Getting Started | Functional usage, paint(), and the tint instance |
| API Reference | Colors, styles, icons, and RazTint class methods |
| Intents | Semantic presets for common CLI messages |
| Security & Redaction | Masking tokens, credentials, and custom rules |
| Icons & Detection | Icon modes and environment/font/color detection logic |
| Configuration | Environment variables and runtime toggles |
| Development | Local setup, tests, and linting |
| Tutorial | Philosophy, detection walk-through, and best practices |
Example Scripts
| Script | Description |
|---|---|
examples/basic_usage.py |
Colors, styles, icons, intents, and redaction in one script |
examples/paint_demo.py |
Every color, style, and icon mode |
examples/real_world_cli.py |
Simulated file-processor CLI |
Known Limitations
- Python 3.10+ only.
- Font detection relies on OS tools (
fc-liston Linux,system_profileron macOS, PowerShell on Windows). SetRAZTINT_SKIP_SYSTEM_FONT_SCAN=1in sandboxed environments. - When
NO_COLORis set, all color output is suppressed regardless of other settings.
Contributing
PRs and issues are welcome. Open an issue first to discuss before starting work on a feature. See CONTRIBUTING.md for setup and guidelines.
License
Project details
Release history Release notifications | RSS feed
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 raztint-0.8.4.tar.gz.
File metadata
- Download URL: raztint-0.8.4.tar.gz
- Upload date:
- Size: 15.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.27 {"installer":{"name":"uv","version":"0.11.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40bf3f50e094af19e8460a924b3cc72e3c8dc3652521468bccd2737a553e95d7
|
|
| MD5 |
01a300de597d63fd875eb35709e8069d
|
|
| BLAKE2b-256 |
35754e7c9016821899e71ebe23934097d67ac98b6a8c191993751f1643fc676c
|
File details
Details for the file raztint-0.8.4-py3-none-any.whl.
File metadata
- Download URL: raztint-0.8.4-py3-none-any.whl
- Upload date:
- Size: 22.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.27 {"installer":{"name":"uv","version":"0.11.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f76dc2e4ef091e7fab1723203f49796ccbda0a702000cc8cda18f05219c0d8d
|
|
| MD5 |
739a58c18bd6e31e96ada4fc95274619
|
|
| BLAKE2b-256 |
f5450e57d375cab21cf2a01da0d0feed32d7293da677ad958e957329d821ddda
|