{"id":700,"library":"rich-click","title":"Rich-Click","description":"rich-click is a wrapper around Click that renders help output nicely using Rich. It provides attractive, color-formatted help text with minimal customization required, serving as a drop-in replacement for Click. The library is currently at version 1.9.7 and has an active development cycle with frequent releases.","status":"active","version":"1.9.7","language":"python","source_language":"en","source_url":"https://github.com/ewels/rich-click","tags":["CLI","Click","Rich","Terminal UI","help text","Typer"],"install":[{"cmd":"pip install rich-click","lang":"bash","label":"Basic Installation"},{"cmd":"pip install \"rich-click[typer]\"","lang":"bash","label":"With Typer Support"}],"dependencies":[{"reason":"Core dependency; rich-click is a wrapper around Click. Click 8+ is recommended for full features.","package":"click","optional":false},{"reason":"Core dependency; provides the rich text formatting capabilities. Rich 12+ is recommended.","package":"rich","optional":false},{"reason":"For enhanced compatibility and features when building CLIs with Typer.","package":"typer","optional":true}],"imports":[{"note":"This is the most common and recommended way to use rich-click as a drop-in replacement for Click.","symbol":"click","correct":"import rich_click as click"},{"note":"While 'command' and 'group' are re-exported, using the explicit 'RichCommand' and 'RichGroup' is clearer when opting for declarative usage with `cls=`.","wrong":"from rich_click import command, group","symbol":"RichCommand, RichGroup","correct":"from rich_click import RichCommand, RichGroup"}],"quickstart":{"code":"import rich_click as click\nimport os\n\n@click.command()\n@click.option(\"--count\", default=1, help=\"Number of greetings.\")\n@click.option(\"--name\", prompt=\"Your name\", help=\"The person to greet.\")\n@click.option(\n    \"--api-key\",\n    envvar=\"MY_APP_API_KEY\",\n    help=\"API key for external service.\",\n    default=os.environ.get('MY_APP_API_KEY', '')\n)\ndef hello(count, name, api_key):\n    \"\"\"\n    A simple program that greets NAME for a total of COUNT times.\n    It also demonstrates an optional API key from an environment variable.\n    \"\"\"\n    if not api_key:\n        click.echo(\"[red]Warning:[/] No API key provided (set MY_APP_API_KEY environment variable).\")\n\n    for _ in range(count):\n        click.echo(f\"Hello, {name}!\")\n\nif __name__ == '__main__':\n    hello()","lang":"python","description":"This example demonstrates a basic rich-click CLI with options, a prompt, and an environment variable for an API key. Save it as `cli.py` and run `python cli.py --help` for rich-formatted output or `python cli.py --name World`."},"warnings":[{"fix":"Upgrade Python to 3.8+, Click to 8+, and Rich to 12+.","message":"Rich-Click 1.9+ dropped support for Python 3.7, Click 7, and Rich versions 10/11. Ensure your environment uses Python 3.8+, Click 8+, and Rich 12+ for full compatibility and features.","severity":"breaking","affected_versions":"<1.9.0"},{"fix":"Enable rich markup by setting `click.rich_click.USE_RICH_MARKUP = True` or by configuring `RichHelpConfiguration` with `use_rich_markup=True`.","message":"Rich formatting markup (e.g., '[red]') in help texts is disabled by default to maintain broad compatibility. It will render as plain text unless explicitly enabled.","severity":"gotcha","affected_versions":"All versions"},{"fix":"Install `rich-click[typer]` and upgrade rich-click to version 1.9.6 or later.","message":"Minor Typer incompatibilities, such as default panel placements, have been addressed in recent versions. For optimal integration with Typer CLIs, ensure `rich-click[typer]` is installed.","severity":"gotcha","affected_versions":"<1.9.6"},{"fix":"Upgrade to rich-click v1.9.3 or later to ensure correct subcommand discovery behavior, which was restored to match v1.8.","message":"Subcommand discovery in help text had inconsistent behavior between versions 1.8 and 1.9.3. If using an affected version, subcommands might not display correctly.","severity":"gotcha","affected_versions":">=1.9.0, <1.9.3"},{"fix":"Upgrade to rich-click v1.9.5 or later for improved Windows compatibility.","message":"Early versions (prior to v1.9.5) experienced strange encoding issues on Windows environments, potentially leading to malformed help output.","severity":"gotcha","affected_versions":"<1.9.5"},{"fix":"Migrate to the 'Panels' API for command and option organization for better control and flexibility.","message":"The 'groups' feature for organizing commands and options was superseded by the more intuitive 'Panels' API in rich-click 1.9. While old code might still function, 'Panels' offer more powerful customization.","severity":"deprecated","affected_versions":">=1.9.0"},{"fix":"Review the rich-click documentation for version 1.9.7+ regarding Typer integration. If 'typer' functionality is required, install 'typer' directly as a separate dependency and verify compatibility, or consider using a rich-click version that explicitly supports the '[typer]' extra if available.","message":"When attempting to install 'rich-click[typer]', pip reports that rich-click 1.9.7 does not provide the 'typer' extra. If an application relies on this extra for Typer integration and it is not available, it can lead to an unexpected 'Aborted.' error during execution.","severity":"breaking","affected_versions":"1.9.7"}],"env_vars":null,"last_verified":"2026-05-12T17:57:15.436Z","next_check":"2026-06-26T00:00:00.000Z","problems":[{"fix":"pip install rich-click","cause":"The rich-click library has not been installed in the current Python environment.","error":"ModuleNotFoundError: No module named 'rich_click'"},{"fix":"import rich_click as click","cause":"The code is attempting to use the 'click' object (e.g., '@click.command()') without first importing rich-click and aliasing it as 'click'.","error":"NameError: name 'click' is not defined"},{"fix":"Replace `rich_click.rich_command` with `click.command` after using `import rich_click as click` at the top of your file.","cause":"The code is attempting to use a deprecated API (like 'rich_click.rich_command' or 'rich_click.rich_group') which was removed in newer rich-click versions in favor of directly re-exporting Click's decorators.","error":"AttributeError: module 'rich_click' has no attribute 'rich_command'"},{"fix":"pip install --upgrade rich-click","cause":"This error typically occurred in older rich-click versions (specifically pre-1.7.0) due to an incompatibility with how Click handled type hints.","error":"TypeError: 'TypeHintError' object is not iterable"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":0,"quickstart_tag":"stale","pypi_latest":"1.9.7","install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"typer","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.08,"mem_mb":4.4,"disk_size":"31.7M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.09,"mem_mb":4.4,"disk_size":"31.7M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"typer","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.09,"mem_mb":4.4,"disk_size":"31.7M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.09,"mem_mb":4.4,"disk_size":"31.7M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"typer","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.8,"import_time_s":0.06,"mem_mb":4.4,"disk_size":"32M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.7,"import_time_s":0.06,"mem_mb":4.4,"disk_size":"32M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"typer","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.06,"mem_mb":4.4,"disk_size":"32M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.06,"mem_mb":4.4,"disk_size":"32M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"typer","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.13,"mem_mb":4.3,"disk_size":"34.6M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.14,"mem_mb":4.3,"disk_size":"34.6M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"typer","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.15,"mem_mb":4.3,"disk_size":"34.6M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.14,"mem_mb":4.3,"disk_size":"34.6M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"typer","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.8,"import_time_s":0.11,"mem_mb":4.3,"disk_size":"35M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.8,"import_time_s":0.11,"mem_mb":4.3,"disk_size":"35M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"typer","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.1,"mem_mb":4.3,"disk_size":"35M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":4.3,"disk_size":"35M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"typer","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":4.2,"disk_size":"26.3M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":4.2,"disk_size":"26.3M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"typer","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.12,"mem_mb":4.2,"disk_size":"26.2M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.15,"mem_mb":4.2,"disk_size":"26.2M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"typer","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.6,"import_time_s":0.11,"mem_mb":4.2,"disk_size":"27M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.6,"import_time_s":0.11,"mem_mb":4.2,"disk_size":"27M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"typer","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":4.2,"disk_size":"27M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.12,"mem_mb":4.2,"disk_size":"27M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"typer","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.12,"mem_mb":5.1,"disk_size":"26.0M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":5.1,"disk_size":"26.0M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"typer","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":5.1,"disk_size":"25.9M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":5.1,"disk_size":"25.9M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"typer","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.6,"import_time_s":0.1,"mem_mb":4.9,"disk_size":"27M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.6,"import_time_s":0.1,"mem_mb":4.9,"disk_size":"27M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"typer","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":4.9,"disk_size":"26M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":4.9,"disk_size":"26M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"typer","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.09,"mem_mb":4.3,"disk_size":"30.8M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.09,"mem_mb":4.3,"disk_size":"30.8M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"typer","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.1,"mem_mb":4.3,"disk_size":"30.8M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.09,"mem_mb":4.3,"disk_size":"30.8M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"typer","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":3.2,"import_time_s":0.1,"mem_mb":4.3,"disk_size":"31M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":3.2,"import_time_s":0.08,"mem_mb":4.3,"disk_size":"31M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"typer","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.08,"mem_mb":4.3,"disk_size":"31M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.08,"mem_mb":4.3,"disk_size":"31M"}]},"quickstart_checks":{"last_tested":"2026-04-24","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]}}