InstallationΒΆ
Click Extra is distributed on PyPI.
So you can install the latest stable release with your favorite package manager like pip:
$ pip install click-extra
Installation methodsΒΆ
Easiest way is to install uv, then add click-extra to your project:
$ uv add click-extra
Or to install the demo CLI system-wide with uv tool:
$ uv tool install click-extra
pipx is a great way to install the demo CLI globally:
$ pipx install click-extra
You can install the latest stable release and its dependencies with a simple pip call:
$ python -m pip install click-extra
If you have difficulties to use pip, see
pipβs own installation instructions.
Demo CLIΒΆ
You can try Click Extra right now in your terminal, without installing any dependency or virtual env thanks to uvx:
$ uvx click-extra
$ uvx click-extra@7.2.0
$ uvx --from git+https://github.com/kdeldycke/click-extra -- click-extra
$ uvx --from file:///Users/me/code/click-extra -- click-extra
This will download and run click-extra, a demo CLI included in the package.
The demo CLI showcases various features of Click Extra, such as enhanced help formatting, colored output, and more.
By default it will display the help message of the demo application:
$ uvx click-extra
Installed 16 packages in 14ms
Usage: click-extra [OPTIONS] COMMAND [ARGS]...
And so you can explore the various possibilities of the demo application, like showing the current version:
$ uvx click-extra --version
Installed 16 packages in 14ms
Click Extra demo, version 7.2.0
This is a great way to play with Click Extra and check that it runs fine on your system, and renders properly in your terminal.
Try the libraryΒΆ
Now that you have tried the demo application, you can also try the library itself in an interactive Python shell without installing anything on your system:
$ uvx --with click-extra python
Installed 3 packages in 5ms
Python 3.14.0 free-threading build (main, Oct 28 2025, 11:52:40) [Clang 20.1.4 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import click_extra
>>> click_extra.__version__
'7.2.0'
>>>
Python compatibilityΒΆ
The table below shows which Python versions each click-extra release range supports, derived from the Programming Language :: Python :: 3.X classifiers across all release tags. Releases prior to 4.9.0 did not declare explicit Python classifiers and are not represented.
|
Released |
|
|
|
|
|
|
|---|---|---|---|---|---|---|---|
|
2025-11-04 |
β |
β |
β |
β |
β |
β |
|
2025-10-08 |
β |
β |
β |
β |
β |
β |
|
2025-05-13 |
β |
β |
β |
β |
β |
β |
|
2024-10-08 |
β |
β |
β |
β |
β |
β |
|
2024-07-25 |
β |
β |
β |
β |
β |
β |
Click compatibilityΒΆ
Click Extra wraps Click, so the two are tightly coupled and the matrix of supported Click versions matters as much as the Python one. The table below shows which Click versions each click-extra release range accepts at install time, derived from the click runtime dependency specifier in pyproject.toml across all release tags. The 8.1 and 8.2 columns are minor-grouped (β
means at least one patch in that minor is accepted); the 8.3 columns are split per patch since click-extra releases pin distinct 8.3.x floors that matter at install time.
|
Released |
Spec |
|
|
|
|
|
|---|---|---|---|---|---|---|---|
|
2026-05-03 |
|
β |
β |
β |
β |
β |
|
2026-04-26 |
|
β |
β |
β |
β |
β |
|
2026-04-24 |
|
β |
β |
β |
β |
β |
|
2025-11-17 |
|
β |
β |
β |
β |
β |
|
2025-09-25 |
|
β |
β |
β |
β |
β |
|
2025-05-13 |
|
β |
β |
β |
β |
β |
|
2024-07-25 |
|
β |
β |
β |
β |
β |
Note
7.14.1 is the only release with relaxed Click bounds (>=8.1): it temporarily widened compatibility to ease pinning across downstreams that hadnβt yet bumped to Click 8.3. 7.15.0 re-tightened the floor to 8.3.1 once Click 8.3 adoption stabilized. 7.14.0 is the strictest floor on record (>=8.3.3), pulled in to match a specific Click parameter-name fix; 7.14.1 immediately relaxed it.
Default dependenciesΒΆ
This is a graph of the default, main dependencies of the Python package:
flowchart LR
click_extra[["`click-extra`"]]
subgraph primary-deps [Primary dependencies]
extra_platforms{{"`extra-platforms`"}}
requests{{"`requests`"}}
cloup{{"`cloup`"}}
click_0{{"`click`"}}
tabulate{{"`tabulate`"}}
wcmatch{{"`wcmatch`"}}
tomli{{"`tomli`"}}
boltons{{"`boltons`"}}
deepmerge{{"`deepmerge`"}}
end
colorama(["`colorama`"])
typing_extensions(["`typing-extensions`"])
bracex(["`bracex`"])
certifi(["`certifi`"])
charset_normalizer(["`charset-normalizer`"])
idna(["`idna`"])
urllib3(["`urllib3`"])
wcwidth(["`wcwidth`"])
subgraph ext_hjson [--extra hjson]
hjson{{"`hjson >=3.1`"}}
end
subgraph ext_json5 [--extra json5]
json5{{"`json5 >=0.12.1`"}}
end
subgraph ext_jsonc [--extra jsonc]
json_with_comments{{"`json-with-comments >=1.2.10`"}}
end
subgraph ext_mkdocs [--extra mkdocs]
mkdocs{{"`mkdocs >=1.4`"}}
mkdocs_get_deps(["`mkdocs-get-deps`"])
pyyaml{{"`pyyaml`"}}
jinja2(["`jinja2`"])
packaging(["`packaging`"])
ghp_import(["`ghp-import`"])
markdown(["`markdown`"])
markupsafe(["`markupsafe`"])
mergedeep(["`mergedeep`"])
pygments{{"`pygments >=2.14`"}}
pymdown_extensions{{"`pymdown-extensions >=10`"}}
python_dateutil(["`python-dateutil`"])
pyyaml_env_tag(["`pyyaml-env-tag`"])
pathspec(["`pathspec`"])
platformdirs(["`platformdirs`"])
six(["`six`"])
watchdog(["`watchdog`"])
end
subgraph ext_pytest [--extra pytest]
pytest{{"`pytest >=9`"}}
exceptiongroup(["`exceptiongroup`"])
iniconfig(["`iniconfig`"])
pluggy(["`pluggy`"])
end
subgraph ext_sphinx [--extra sphinx]
sphinx{{"`sphinx >=8`"}}
alabaster(["`alabaster`"])
babel(["`babel`"])
docutils{{"`docutils >=0.20`"}}
imagesize(["`imagesize`"])
roman_numerals(["`roman-numerals`"])
snowballstemmer(["`snowballstemmer`"])
sphinxcontrib_applehelp(["`sphinxcontrib-applehelp`"])
sphinxcontrib_devhelp(["`sphinxcontrib-devhelp`"])
sphinxcontrib_htmlhelp(["`sphinxcontrib-htmlhelp`"])
sphinxcontrib_jsmath(["`sphinxcontrib-jsmath`"])
sphinxcontrib_qthelp(["`sphinxcontrib-qthelp`"])
sphinxcontrib_serializinghtml(["`sphinxcontrib-serializinghtml`"])
end
subgraph ext_toml [--extra toml]
tomlkit{{"`tomlkit >=0.13`"}}
end
subgraph ext_xml [--extra xml]
xmltodict{{"`xmltodict >=1`"}}
end
click_extra ==>|" >=2.32.4 "| requests
click_extra ==>|" >=8.3.1 "| click_0
click_extra ==>|" >=3.0.7 "| cloup
click_extra ==>|" >=2 "| tomli
click_extra ==>|" >=5 "| extra_platforms
click_extra ==>|" >=0.9 "| tabulate
click_extra ==>|" >=10 "| wcmatch
click_extra ==>|" >=20 "| boltons
click_extra ==>|" >=1.0.1 "| deepmerge
sphinx ==> requests
sphinx --> colorama
sphinx --> jinja2
sphinx --> packaging
sphinx ==> pygments
sphinx ==> tomli
sphinx --> alabaster
sphinx --> babel
sphinx ==> docutils
sphinx --> imagesize
sphinx --> roman_numerals
sphinx --> snowballstemmer
sphinx --> sphinxcontrib_applehelp
sphinx --> sphinxcontrib_devhelp
sphinx --> sphinxcontrib_htmlhelp
sphinx --> sphinxcontrib_jsmath
sphinx --> sphinxcontrib_qthelp
sphinx --> sphinxcontrib_serializinghtml
mkdocs --> mkdocs_get_deps
mkdocs ==> pyyaml
mkdocs ==> click_0
mkdocs --> colorama
mkdocs --> jinja2
mkdocs --> packaging
mkdocs --> ghp_import
mkdocs --> markdown
mkdocs --> markupsafe
mkdocs --> mergedeep
mkdocs --> pyyaml_env_tag
mkdocs --> pathspec
mkdocs --> watchdog
pytest --> colorama
pytest --> packaging
pytest --> exceptiongroup
pytest ==> pygments
pytest ==> tomli
pytest --> iniconfig
pytest --> pluggy
requests --> certifi
requests --> charset_normalizer
requests --> idna
requests --> urllib3
mkdocs_get_deps ==> pyyaml
mkdocs_get_deps --> mergedeep
mkdocs_get_deps --> platformdirs
click_0 --> colorama
jinja2 --> markupsafe
cloup ==> click_0
cloup --> typing_extensions
exceptiongroup --> typing_extensions
ghp_import --> python_dateutil
pymdown_extensions ==> pyyaml
pymdown_extensions --> markdown
python_dateutil --> six
pyyaml_env_tag ==> pyyaml
extra_platforms ==> pytest
tabulate --> wcwidth
wcmatch --> bracex
click_extra -.-> ext_hjson
click_extra -.-> ext_json5
click_extra -.-> ext_jsonc
click_extra -.-> ext_mkdocs
click_extra -.-> ext_pytest
click_extra -.-> ext_sphinx
click_extra -.-> ext_toml
click_extra -.-> ext_xml
click alabaster "https://pypi.org/project/alabaster/" _blank
click babel "https://pypi.org/project/babel/" _blank
click boltons "https://pypi.org/project/boltons/" _blank
click bracex "https://pypi.org/project/bracex/" _blank
click certifi "https://pypi.org/project/certifi/" _blank
click charset_normalizer "https://pypi.org/project/charset-normalizer/" _blank
click click_0 "https://pypi.org/project/click/" _blank
click click_extra "https://pypi.org/project/click-extra/" _blank
click cloup "https://pypi.org/project/cloup/" _blank
click colorama "https://pypi.org/project/colorama/" _blank
click deepmerge "https://pypi.org/project/deepmerge/" _blank
click docutils "https://pypi.org/project/docutils/" _blank
click exceptiongroup "https://pypi.org/project/exceptiongroup/" _blank
click extra_platforms "https://pypi.org/project/extra-platforms/" _blank
click ghp_import "https://pypi.org/project/ghp-import/" _blank
click hjson "https://pypi.org/project/hjson/" _blank
click idna "https://pypi.org/project/idna/" _blank
click imagesize "https://pypi.org/project/imagesize/" _blank
click iniconfig "https://pypi.org/project/iniconfig/" _blank
click jinja2 "https://pypi.org/project/jinja2/" _blank
click json_with_comments "https://pypi.org/project/json-with-comments/" _blank
click json5 "https://pypi.org/project/json5/" _blank
click markdown "https://pypi.org/project/markdown/" _blank
click markupsafe "https://pypi.org/project/markupsafe/" _blank
click mergedeep "https://pypi.org/project/mergedeep/" _blank
click mkdocs "https://pypi.org/project/mkdocs/" _blank
click mkdocs_get_deps "https://pypi.org/project/mkdocs-get-deps/" _blank
click packaging "https://pypi.org/project/packaging/" _blank
click pathspec "https://pypi.org/project/pathspec/" _blank
click platformdirs "https://pypi.org/project/platformdirs/" _blank
click pluggy "https://pypi.org/project/pluggy/" _blank
click pygments "https://pypi.org/project/pygments/" _blank
click pymdown_extensions "https://pypi.org/project/pymdown-extensions/" _blank
click pytest "https://pypi.org/project/pytest/" _blank
click python_dateutil "https://pypi.org/project/python-dateutil/" _blank
click pyyaml "https://pypi.org/project/pyyaml/" _blank
click pyyaml_env_tag "https://pypi.org/project/pyyaml-env-tag/" _blank
click requests "https://pypi.org/project/requests/" _blank
click roman_numerals "https://pypi.org/project/roman-numerals/" _blank
click six "https://pypi.org/project/six/" _blank
click snowballstemmer "https://pypi.org/project/snowballstemmer/" _blank
click sphinx "https://pypi.org/project/sphinx/" _blank
click sphinxcontrib_applehelp "https://pypi.org/project/sphinxcontrib-applehelp/" _blank
click sphinxcontrib_devhelp "https://pypi.org/project/sphinxcontrib-devhelp/" _blank
click sphinxcontrib_htmlhelp "https://pypi.org/project/sphinxcontrib-htmlhelp/" _blank
click sphinxcontrib_jsmath "https://pypi.org/project/sphinxcontrib-jsmath/" _blank
click sphinxcontrib_qthelp "https://pypi.org/project/sphinxcontrib-qthelp/" _blank
click sphinxcontrib_serializinghtml "https://pypi.org/project/sphinxcontrib-serializinghtml/" _blank
click tabulate "https://pypi.org/project/tabulate/" _blank
click tomli "https://pypi.org/project/tomli/" _blank
click tomlkit "https://pypi.org/project/tomlkit/" _blank
click typing_extensions "https://pypi.org/project/typing-extensions/" _blank
click urllib3 "https://pypi.org/project/urllib3/" _blank
click watchdog "https://pypi.org/project/watchdog/" _blank
click wcmatch "https://pypi.org/project/wcmatch/" _blank
click wcwidth "https://pypi.org/project/wcwidth/" _blank
click xmltodict "https://pypi.org/project/xmltodict/" _blank
style click_extra stroke-width:3px
style boltons stroke-width:3px
style click_0 stroke-width:3px
style cloup stroke-width:3px
style deepmerge stroke-width:3px
style docutils stroke-width:3px
style extra_platforms stroke-width:3px
style hjson stroke-width:3px
style json_with_comments stroke-width:3px
style json5 stroke-width:3px
style mkdocs stroke-width:3px
style pygments stroke-width:3px
style pymdown_extensions stroke-width:3px
style pytest stroke-width:3px
style pyyaml stroke-width:3px
style requests stroke-width:3px
style sphinx stroke-width:3px
style tabulate stroke-width:3px
style tomli stroke-width:3px
style tomlkit stroke-width:3px
style wcmatch stroke-width:3px
style xmltodict stroke-width:3px
style primary-deps fill:#1565C020,stroke:#42A5F5
style ext_hjson fill:#7B1FA220,stroke:#BA68C8
style ext_json5 fill:#7B1FA220,stroke:#BA68C8
style ext_jsonc fill:#7B1FA220,stroke:#BA68C8
style ext_mkdocs fill:#7B1FA220,stroke:#BA68C8
style ext_pytest fill:#7B1FA220,stroke:#BA68C8
style ext_sphinx fill:#7B1FA220,stroke:#BA68C8
style ext_toml fill:#7B1FA220,stroke:#BA68C8
style ext_xml fill:#7B1FA220,stroke:#BA68C8
Extra dependenciesΒΆ
By default, Click Extra supports TOML configuration files and all standard table formats. Optional extras unlock additional features:
Extra |
Install command |
Unlocks |
|---|---|---|
|
$ pip install click-extra[hjson]
|
|
|
$ pip install click-extra[json5]
|
|
|
$ pip install click-extra[jsonc]
|
|
|
$ pip install click-extra[toml]
|
|
|
$ pip install click-extra[xml]
|
|
|
$ pip install click-extra[yaml]
|
|
|
$ pip install click-extra[mkdocs]
|
|
|
$ pip install click-extra[pygments]
|
|
|
$ pip install click-extra[sphinx]
|
|
|
$ pip install click-extra[pytest]
|
|
Tip
Install all extras at once with:
$ pip install click-extra[hjson,json5,jsonc,mkdocs,toml,xml,yaml,pygments,sphinx,pytest]