Skip to main content

A zero-dependency Python library for consistent, semantic CLI output.

Project description

RazTint

PyPI Version Zero Dependencies Codecov

Python Versions PyPI Downloads

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

RazTint preview: Nerd Font, Unicode, and ASCII icon modes with colored and styled output examples

A simulated production log stream 9 secrets detected, 9 secrets redacted, 0 leaked to the terminal.

Table of Contents

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=value pairs like password=, 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-list on Linux, system_profiler on macOS, PowerShell on Windows). Set RAZTINT_SKIP_SYSTEM_FONT_SCAN=1 in sandboxed environments.
  • When NO_COLOR is 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

License

Made by RazBuild

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

raztint-0.8.4.tar.gz (15.1 kB view details)

Uploaded Source

Built Distribution

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

raztint-0.8.4-py3-none-any.whl (22.9 kB view details)

Uploaded Python 3

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

Hashes for raztint-0.8.4.tar.gz
Algorithm Hash digest
SHA256 40bf3f50e094af19e8460a924b3cc72e3c8dc3652521468bccd2737a553e95d7
MD5 01a300de597d63fd875eb35709e8069d
BLAKE2b-256 35754e7c9016821899e71ebe23934097d67ac98b6a8c191993751f1643fc676c

See more details on using hashes here.

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

Hashes for raztint-0.8.4-py3-none-any.whl
Algorithm Hash digest
SHA256 0f76dc2e4ef091e7fab1723203f49796ccbda0a702000cc8cda18f05219c0d8d
MD5 739a58c18bd6e31e96ada4fc95274619
BLAKE2b-256 f5450e57d375cab21cf2a01da0d0feed32d7293da677ad958e957329d821ddda

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