Benchmarkยถ

Feature comparison between Click Extra and competing CLI frameworks across ecosystems. The tables below track where Click Extra leads, where it matches, and where it can still improve.

Developer experienceยถ

โœ“ = built-in support, ~ = basic or partial support, N/A = not applicable (compiled language).

Feature

click-extra

Click[1]

Cloup[2]

cobra[3]

Fire[4]

Typer[5]

clap[6]

Cement[7]

Cyclopts[8]

Tyro[9]

rich-click[10]

bpaf[11]

Config file discovery

โœ“

โœ“

โœ“

โœ“

Config precedence chain

โœ“

โœ“

~

โœ“

Type-hint-driven params

โœ“

โœ“

โœ“

โœ“

โœ“

Option groups / constraints

โœ“

โœ“

โœ“

โœ“

โœ“

~

โœ“

Persistent / inherited flags

โœ“

N/A

โœ“

โœ“

~

โœ“

โœ“

Lazy subcommand loading

โœ“

N/A

N/A

โœ“

N/A

Parameter introspection

โœ“

click-extra reads TOML, YAML, JSON, INI, and XML config files, including [tool.*] sections from pyproject.toml and remote URLs. Config-file precedence is layered through Clickโ€™s default_map, so command-line flags and environment variables always win. The strict-check pipeline ships an extension mechanism so apps can validate data-keyed sub-tables alongside click-extraโ€™s own CLI-flag checks. cobra achieves similar coverage through Viper (YAML, TOML, JSON, HCL, INI, env vars). Cyclopts supports TOML, YAML, JSON, and env vars. Cement uses INI by default with YAML and JSON via extensions. clap requires a companion crate for config file support.

End-user experienceยถ

Feature

click-extra

Click[1]

Cloup[2]

cobra[3]

Fire[4]

Typer[5]

clap[6]

Cement[7]

Cyclopts[8]

Tyro[9]

rich-click[10]

bpaf[11]

Colored help

โœ“

~

~

โœ“

โœ“

โœ“

โœ“

โœ“

โœ“

Command suggestions

โœ“

โœ“

โœ“

โœ“

Shell completion

~

~

~

โœ“

~

โœ“

โœ“

โœ“

โœ“

~

โœ“

Man page generation

โœ“

โœ“

Table / data output

โœ“

โœ“

Timer / profiling

โœ“

~

Telemetry control

โœ“

~

~

Version with git metadata

โœ“

~

~

~

~

~

click-extraโ€™s colored help uses a theme system with semantic highlighting for options, choices, metavars, defaults, env vars, and subcommand names. Seven built-in themes ship out of the box (dark, light, dracula, monokai, nord, solarized_dark, plus a monochrome manpage); users can override any slot of an existing palette or define brand-new themes directly in the CLIโ€™s --config file ([tool.<cli>.themes.<name>]), with overrides scoped per-invocation so concurrent runs in the same process donโ€™t bleed into each other. cobra only provides basic ANSI coloring. rich-click and Cyclopts use Rich for formatted help output but ship a single style; user-defined palettes require Python code. Shell completion in Click and click-extra covers command and option names; clap, cobra, bpaf, Cyclopts, and Typer add dynamic value completion and multi-shell auto-install. click-extra also offers --show-params, --time, --telemetry/--no-telemetry, --table-format, and git-aware --version out of the box.

Parser flag scopingยถ

Behavior when placing global flags before vs. after a subcommand:

Framework

Global flags before subcommand

click-extra

โœ“

Click[1]

โœ“

Cloup[2]

โœ“

cobra[3]

โœ“

Typer[5]

โœ“

clap[6]

โœ“

Cement[7]

โœ“

Cyclopts[8]

โœ“

Tyro[9]

โœ“

rich-click[10]

โœ“

bpaf[11]

Click (and click-extra, Cloup, rich-click, Typer) accepts global flags in both positions, the most permissive behavior. bpafโ€™s #[bpaf(external)] fields are scoped inside the subcommand variant, so tool --flag value subcommand is rejected. Fire uses object traversal rather than subcommand parsing, so flag scoping does not apply.

Unique strengthsยถ

Features unique to click-extra or significantly stronger than all competitors:

  • Multi-format config with pyproject.toml: no other framework reads [tool.*] from pyproject.toml natively. Cobra/Viper comes closest but targets Go projects.

  • Help colorization with theme system: click-extra highlights options, choices, metavars, defaults, env vars, and subcommand names with configurable themes. Seven built-in themes (six color palettes dark, light, dracula, monokai, nord, solarized_dark and a monochrome manpage) plus user-defined and partial-override themes declared directly in the CLIโ€™s --config file ([tool.<cli>.themes.<name>]). Theme overrides are scoped per invocation via ctx.meta, so back-to-back runs in the same process donโ€™t cross-contaminate. Other frameworks offer basic ANSI colors but not semantic highlighting, and none load user palettes from config.

  • Table and data serialization: print_table() and serialize_data() with 20+ output formats. Cement offers table output but with fewer format options and no serialization pipeline.

  • Parameter introspection: --show-params exposes every parameterโ€™s value, source, default, and environment variable. No other framework offers this.

  • Version with git metadata: template variables for branch, hash, date, tag, with pre-baking for compiled binaries (Nuitka, PyInstaller).

  • Configuration validation extension hook: ConfigValidator lets apps declare extension paths ([tool.<cli>.managers.<id>], [tool.<cli>.plugins], โ€ฆ) that click-extraโ€™s strict check skips and the app validates with rooted ValidationErrors. --validate-config collects every error in one pass. No other framework exposes the strict-check pipeline this way.

  • wrap subcommand: applies click-extraโ€™s help colorization, themes, and config loading to any installed Click CLI without touching its source code. The wrapped CLI inherits the --config theme loader, so users can theme a third-party tool from their own pyproject.toml.

  • Man page generation: render_manpages() and write_manpages() emit one roff man page per command. They work on a command object (no console_scripts entry point) and discover subcommands dynamically, superseding the unmaintained click-man (last released 0.4.2 in 2021). The long-standing click-man limitations are fixed by construction: Clickโ€™s \b markers (click-man#9), modern Python (#72), dynamic subcommands (#14, #56), plus the ENVIRONMENT, FILES and EXIT STATUS sections it never grew. cobra and bpaf are the only compared frameworks with comparable native man page output; Click itself closed the topic in 2018 (pallets/click#434).

Gaps and opportunitiesยถ

Persistent / inherited flagsยถ

cobraโ€™s persistent flags propagate from a parent command to all subcommands automatically. Clickโ€™s maintainers have consistently stated that options belong to the command they modify, and positional dependence (cli --opt subcmd vs cli subcmd --opt) is intentional (pallets/click#66, pallets/click#1034). The official workaround is custom decorators that apply the same options to multiple commands.

This is one of Clickโ€™s most requested features. The highest-demand closed issues all center on the same family of problems: parent group options are invisible to subcommands (pallets/click#108, 9 thumbs-up), required group options block --help on child commands (pallets/click#814, 14 thumbs-up; pallets/click#295, 15 thumbs-up), and group options are lost in CommandCollection (pallets/click#347, 13 thumbs-up โ€” closed as not_planned in September 2025, formalizing the rejection).

The ongoing parser rewrite (pallets/click#2205) and related PR for dynamic context parameters (pallets/click#2784) could eventually unblock this upstream, but both have been in progress since 2022 with no merge date in sight. click-extra could add a @persistent_option decorator (or a persistent=True kwarg on @option) that registers the option on the group and injects it into all subcommands at decoration time. The config file support already handles cross-command defaults; persistent flags would complete the story for the CLI layer.

Enhanced shell completionยถ

Clickโ€™s built-in completion covers command and option names but has several known gaps. clap, cobra, bpaf, Cyclopts, and Typer all provide richer completion out of the box. The upstream issues below represent the main areas where click-extra could close the gap:

Context-dependent completions (pallets/click#2303, pallets/click#2184, pallets/click#928): the Context object during shell completion is missing already-parsed parameter values, so completions cannot depend on previous arguments (like completing tags based on a previously typed project name). This is the highest-demand open completion issue (14+ thumbs-up). click-extra could override the completion resolution to populate ctx.params properly.

Broken --option=value completion (pallets/click#2847): completing --option=val<TAB> is broken in both bash and zsh. The = separator parsing in _resolve_context needs fixing.

Default callbacks evaluated during completion (pallets/click#2614): since Click 8.0, default value callbacks run during tab-completion even when resilient_parsing should suppress them. Makes completion slow for apps with expensive defaults.

Fish multiline help (pallets/click#3043): help text containing newlines used to break fish completion. Fixed upstream in pallets/click#3126 (merged 2026-04-29), which also closes the bug report. Once click-extraโ€™s Click floor bumps to the release that ships the fix, fish completion handles multi-line help text out of the box and no click-extra workaround is needed.

Enum Choice mismatch (pallets/click#3015): click.Choice(MyEnum) completes MyEnum.foo instead of foo because completion skips the normalization the Choice type applies at parse time.

Additional shells rejected upstream (pallets/click#2888, pallets/click#3188, pallets/click#2672): Click explicitly rejected adding nushell, Carapace, and PowerShell completion to core โ€” all three issues are closed as not_planned, so the door is closed upstream and remains a click-extra opportunity. click-extra could provide NushellComplete and PowerShellComplete classes, and generate Carapace YAML from its parameter introspection.

Multi-shell auto-install: Typerโ€™s --install-completion detects the current shell and installs the completion script automatically. click-extra could bundle a similar @completion_option.

Activityยถ

Metrics

click-extra

Click[1]

Cloup[2]

cobra[3]

Fire[4]

Typer[5]

clap[6]

Cement[7]

Cyclopts[8]

Tyro[9]

rich-click[10]

bpaf[11]

Watchers

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

Contributors

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

Commit activity

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

Commits since latest release

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

Last release date

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

Last commit

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

Open issues

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

Open PRs

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

Forks

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

Dependencies freshness

Libraries.io

Libraries.io

Libraries.io

-

Libraries.io

Libraries.io

Libraries.io

Libraries.io

Libraries.io

Libraries.io

Libraries.io

Libraries.io

Popularityยถ

Star History Chart

Metrics

click-extra

Click[1]

Cloup[2]

cobra[3]

Fire[4]

Typer[5]

clap[6]

Cement[7]

Cyclopts[8]

Tyro[9]

rich-click[10]

bpaf[11]

Stars

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

SourceRank

Libraries.io SourceRank

Libraries.io SourceRank

Libraries.io SourceRank

-

Libraries.io SourceRank

Libraries.io SourceRank

Libraries.io SourceRank

Libraries.io SourceRank

Libraries.io SourceRank

Libraries.io SourceRank

Libraries.io SourceRank

Libraries.io SourceRank

Dependent repos

Dependent repos (via libraries.io)

Dependent repos (via libraries.io)

Dependent repos (via libraries.io)

-

Dependent repos (via libraries.io)

Dependent repos (via libraries.io)

Dependent repos (via libraries.io)

Dependent repos (via libraries.io)

Dependent repos (via libraries.io)

Dependent repos (via libraries.io)

Dependent repos (via libraries.io)

Dependent repos (via libraries.io)

Distributionยถ

Registry

click-extra

Click[1]

Cloup[2]

cobra[3]

Fire[4]

Typer[5]

clap[6]

Cement[7]

Cyclopts[8]

Tyro[9]

rich-click[10]

bpaf[11]

PyPI

PyPI

PyPI

PyPI

-

PyPI

PyPI

-

PyPI

PyPI

PyPI

PyPI

-

Crates.io

-

-

-

-

-

-

Crates.io

-

-

-

-

Crates.io

Metadataยถ

Metadata

click-extra

Click[1]

Cloup[2]

cobra[3]

Fire[4]

Typer[5]

clap[6]

Cement[7]

Cyclopts[8]

Tyro[9]

rich-click[10]

bpaf[11]

License

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

Main language

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

GitHub

Latest version

GitHub release (latest SemVer)

GitHub release (latest SemVer)

GitHub release (latest SemVer)

GitHub release (latest SemVer)

GitHub release (latest SemVer)

GitHub release (latest SemVer)

GitHub release (latest SemVer)

GitHub release (latest SemVer)

GitHub release (latest SemVer)

GitHub release (latest SemVer)

GitHub release (latest SemVer)

GitHub release (latest SemVer)

Benchmark date

2026-05

2026-05

2026-05

2026-05

2026-05

2026-05

2026-05

2026-05

2026-05

2026-05

2026-05

2026-05

Excluded frameworksยถ

Note

argh (~400 stars) is not included. No commits or releases since July 2024. Recent issues from 2026 have no maintainer responses.

Note

Cleo (~1,300 stars) is not included. Its last release (2.1.0) was October 2023 and the 3.0 rewrite has stalled indefinitely. Recent repository activity is limited to automated pre-commit updates. Cleo is tightly coupled to Poetry and not independently maintained.

Note

docopt-ng (the maintained fork of the original docopt with ~8,000 stars) is not included. The Jazzband organization that maintained the fork announced its wind-down in March 2026, and docopt-ng is sunsetting along with it. The original docopt has been stale since 2021. While docoptโ€™s docstring-driven approach to CLI definition was historically influential, no actively maintained Python implementation remains.

Project URLsยถ