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
Demo CLI¶
You can try Click Extra right now in your terminal, without installing any dependency or virtual env thanks to uvx:
$ uvx --from click-extra -- click-extra-demo
$ uvx --from click-extra@7.2.0 -- click-extra-demo
$ uvx --from git+https://github.com/kdeldycke/click-extra -- click-extra-demo
$ uvx --from file:///Users/me/code/click-extra -- click-extra-demo
This will download click-extra (the package), and run click-extra-demo, a demo CLI included in the package.
The click-extra-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 --from click-extra -- click-extra-demo
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 --from click-extra -- click-extra-demo --version
Installed 16 packages in 14ms
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'
>>>
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`"])
urllib3(["`urllib3`"])
bracex(["`bracex`"])
certifi(["`certifi`"])
charset_normalizer(["`charset-normalizer`"])
distro(["`distro`"])
idna(["`idna`"])
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_xml [--extra xml]
xmltodict{{"`xmltodict >=1`"}}
end
subgraph grp_docs [--group docs]
sphinx{{"`sphinx`"}}
myst_parser{{"`myst-parser >=4`"}}
furo{{"`furo >=2025.9.25`"}}
pygments{{"`pygments`"}}
jinja2(["`jinja2`"])
sphinxcontrib_mermaid{{"`sphinxcontrib-mermaid >=1.2.3`"}}
beautifulsoup4(["`beautifulsoup4`"])
docutils{{"`docutils`"}}
markdown_it_py(["`markdown-it-py`"])
pyyaml{{"`pyyaml`"}}
accessible_pygments(["`accessible-pygments`"])
markupsafe(["`markupsafe`"])
mdit_py_plugins(["`mdit-py-plugins`"])
packaging(["`packaging`"])
pygments_ansi_color{{"`pygments-ansi-color >=0.3`"}}
sphinx_autodoc_typehints{{"`sphinx-autodoc-typehints >=2.4`"}}
sphinx_basic_ng(["`sphinx-basic-ng`"])
sphinx_copybutton{{"`sphinx-copybutton >=0.5.2`"}}
sphinx_design{{"`sphinx-design >=0.6`"}}
sphinx_issues{{"`sphinx-issues >=5`"}}
sphinxext_opengraph{{"`sphinxext-opengraph >=0.13`"}}
alabaster(["`alabaster`"])
babel(["`babel`"])
imagesize(["`imagesize`"])
mdurl(["`mdurl`"])
roman_numerals(["`roman-numerals`"])
snowballstemmer(["`snowballstemmer`"])
soupsieve(["`soupsieve`"])
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 grp_test [--group test]
pytest{{"`pytest`"}}
pytest_cov{{"`pytest-cov >=7`"}}
coverage{{"`coverage >=7.12`"}}
exceptiongroup(["`exceptiongroup`"])
pluggy(["`pluggy`"])
pytest_github_actions_annotate_failures{{"`pytest-github-actions-annotate-failures >=0.3`"}}
pytest_httpserver{{"`pytest-httpserver >=1.1`"}}
pytest_randomly{{"`pytest-randomly >=4.0.1`"}}
werkzeug(["`werkzeug`"])
backports_strenum{{"`backports-strenum >=1.3`"}}
iniconfig(["`iniconfig`"])
end
subgraph grp_typing [--group typing]
types_docutils{{"`types-docutils >=0.22.3.20251115`"}}
types_pygments{{"`types-pygments >=2.19.0.20251121`"}}
types_requests{{"`types-requests >=2.32.4.20250611`"}}
types_boltons{{"`types-boltons >=25.0.0.20250919`"}}
types_pyyaml{{"`types-pyyaml >=6.0.12.9`"}}
types_tabulate{{"`types-tabulate >=0.9.0.2`"}}
types_xmltodict{{"`types-xmltodict >=1.0.1.20250920`"}}
end
click_extra ==>|" >=2.32.5 "| requests
click_extra ==>|" >=2.3 "| tomli
click_extra ==>|" >=8.3.1 "| click_0
click_extra ==>|" >=3.0.7 "| cloup
click_extra ==>|" >=5 "| extra_platforms
click_extra ==>|" >=0.9 "| tabulate
click_extra ==>|" >=10 "| wcmatch
click_extra ==>|" >=25 "| boltons
click_extra ==>|" >=2 "| deepmerge
sphinx ==> pygments
sphinx ==> requests
sphinx --> jinja2
sphinx ==> tomli
sphinx --> colorama
sphinx ==> docutils
sphinx --> packaging
sphinx --> alabaster
sphinx --> babel
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
pytest ==> pygments
pytest ==> tomli
pytest --> colorama
pytest --> exceptiongroup
pytest --> packaging
pytest --> pluggy
pytest --> iniconfig
myst_parser ==> sphinx
myst_parser --> jinja2
myst_parser ==> docutils
myst_parser --> markdown_it_py
myst_parser ==> pyyaml
myst_parser --> mdit_py_plugins
furo ==> sphinx
furo ==> pygments
furo --> beautifulsoup4
furo --> accessible_pygments
furo --> sphinx_basic_ng
requests --> urllib3
requests --> certifi
requests --> charset_normalizer
requests --> idna
pytest_cov ==> pytest
pytest_cov ==> coverage
pytest_cov --> pluggy
sphinxcontrib_mermaid ==> sphinx
sphinxcontrib_mermaid --> jinja2
sphinxcontrib_mermaid ==> pyyaml
click_0 --> colorama
cloup ==> click_0
cloup --> typing_extensions
coverage ==> tomli
extra_platforms ==> pytest
extra_platforms --> distro
pygments_ansi_color ==> pygments
pytest_github_actions_annotate_failures ==> pytest
pytest_httpserver --> werkzeug
pytest_randomly ==> pytest
sphinx_autodoc_typehints ==> sphinx
sphinx_copybutton ==> sphinx
sphinx_design ==> sphinx
sphinx_issues ==> sphinx
sphinxext_opengraph ==> sphinx
tabulate --> wcwidth
types_pygments ==> types_docutils
types_requests --> urllib3
wcmatch --> bracex
jinja2 --> markupsafe
beautifulsoup4 --> typing_extensions
beautifulsoup4 --> soupsieve
markdown_it_py --> mdurl
accessible_pygments ==> pygments
exceptiongroup --> typing_extensions
mdit_py_plugins --> markdown_it_py
sphinx_basic_ng ==> sphinx
werkzeug --> markupsafe
click_extra -.-> ext_hjson
click_extra -.-> ext_json5
click_extra -.-> ext_jsonc
click_extra -.-> ext_xml
click_extra -.-> grp_docs
click_extra -.-> grp_test
click_extra -.-> grp_typing
click accessible_pygments "https://pypi.org/project/accessible-pygments/" _blank
click alabaster "https://pypi.org/project/alabaster/" _blank
click babel "https://pypi.org/project/babel/" _blank
click backports_strenum "https://pypi.org/project/backports-strenum/" _blank
click beautifulsoup4 "https://pypi.org/project/beautifulsoup4/" _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 coverage "https://pypi.org/project/coverage/" _blank
click deepmerge "https://pypi.org/project/deepmerge/" _blank
click distro "https://pypi.org/project/distro/" _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 furo "https://pypi.org/project/furo/" _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_it_py "https://pypi.org/project/markdown-it-py/" _blank
click markupsafe "https://pypi.org/project/markupsafe/" _blank
click mdit_py_plugins "https://pypi.org/project/mdit-py-plugins/" _blank
click mdurl "https://pypi.org/project/mdurl/" _blank
click myst_parser "https://pypi.org/project/myst-parser/" _blank
click packaging "https://pypi.org/project/packaging/" _blank
click pluggy "https://pypi.org/project/pluggy/" _blank
click pygments "https://pypi.org/project/pygments/" _blank
click pygments_ansi_color "https://pypi.org/project/pygments-ansi-color/" _blank
click pytest "https://pypi.org/project/pytest/" _blank
click pytest_cov "https://pypi.org/project/pytest-cov/" _blank
click pytest_github_actions_annotate_failures "https://pypi.org/project/pytest-github-actions-annotate-failures/" _blank
click pytest_httpserver "https://pypi.org/project/pytest-httpserver/" _blank
click pytest_randomly "https://pypi.org/project/pytest-randomly/" _blank
click pyyaml "https://pypi.org/project/pyyaml/" _blank
click requests "https://pypi.org/project/requests/" _blank
click roman_numerals "https://pypi.org/project/roman-numerals/" _blank
click snowballstemmer "https://pypi.org/project/snowballstemmer/" _blank
click soupsieve "https://pypi.org/project/soupsieve/" _blank
click sphinx "https://pypi.org/project/sphinx/" _blank
click sphinx_autodoc_typehints "https://pypi.org/project/sphinx-autodoc-typehints/" _blank
click sphinx_basic_ng "https://pypi.org/project/sphinx-basic-ng/" _blank
click sphinx_copybutton "https://pypi.org/project/sphinx-copybutton/" _blank
click sphinx_design "https://pypi.org/project/sphinx-design/" _blank
click sphinx_issues "https://pypi.org/project/sphinx-issues/" _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_mermaid "https://pypi.org/project/sphinxcontrib-mermaid/" _blank
click sphinxcontrib_qthelp "https://pypi.org/project/sphinxcontrib-qthelp/" _blank
click sphinxcontrib_serializinghtml "https://pypi.org/project/sphinxcontrib-serializinghtml/" _blank
click sphinxext_opengraph "https://pypi.org/project/sphinxext-opengraph/" _blank
click tabulate "https://pypi.org/project/tabulate/" _blank
click tomli "https://pypi.org/project/tomli/" _blank
click types_boltons "https://pypi.org/project/types-boltons/" _blank
click types_docutils "https://pypi.org/project/types-docutils/" _blank
click types_pygments "https://pypi.org/project/types-pygments/" _blank
click types_pyyaml "https://pypi.org/project/types-pyyaml/" _blank
click types_requests "https://pypi.org/project/types-requests/" _blank
click types_tabulate "https://pypi.org/project/types-tabulate/" _blank
click types_xmltodict "https://pypi.org/project/types-xmltodict/" _blank
click typing_extensions "https://pypi.org/project/typing-extensions/" _blank
click urllib3 "https://pypi.org/project/urllib3/" _blank
click wcmatch "https://pypi.org/project/wcmatch/" _blank
click wcwidth "https://pypi.org/project/wcwidth/" _blank
click werkzeug "https://pypi.org/project/werkzeug/" _blank
click xmltodict "https://pypi.org/project/xmltodict/" _blank
style click_extra stroke-width:3px
style backports_strenum stroke-width:3px
style boltons stroke-width:3px
style click_0 stroke-width:3px
style cloup stroke-width:3px
style coverage stroke-width:3px
style deepmerge stroke-width:3px
style docutils stroke-width:3px
style extra_platforms stroke-width:3px
style furo stroke-width:3px
style hjson stroke-width:3px
style json_with_comments stroke-width:3px
style json5 stroke-width:3px
style myst_parser stroke-width:3px
style pygments stroke-width:3px
style pygments_ansi_color stroke-width:3px
style pytest stroke-width:3px
style pytest_cov stroke-width:3px
style pytest_github_actions_annotate_failures stroke-width:3px
style pytest_httpserver stroke-width:3px
style pytest_randomly stroke-width:3px
style pyyaml stroke-width:3px
style requests stroke-width:3px
style sphinx stroke-width:3px
style sphinx_autodoc_typehints stroke-width:3px
style sphinx_copybutton stroke-width:3px
style sphinx_design stroke-width:3px
style sphinx_issues stroke-width:3px
style sphinxcontrib_mermaid stroke-width:3px
style sphinxext_opengraph stroke-width:3px
style tabulate stroke-width:3px
style tomli stroke-width:3px
style types_boltons stroke-width:3px
style types_docutils stroke-width:3px
style types_pygments stroke-width:3px
style types_pyyaml stroke-width:3px
style types_requests stroke-width:3px
style types_tabulate stroke-width:3px
style types_xmltodict 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_xml fill:#7B1FA220,stroke:#BA68C8
style grp_docs fill:#546E7A20,stroke:#90A4AE
style grp_test fill:#546E7A20,stroke:#90A4AE
style grp_typing fill:#546E7A20,stroke:#90A4AE
Extra dependencies¶
For additional features, you may need to install extra dependencies.
Configuration file formats¶
YAML configuration files support:
$ pip install click-extra[yaml]
XML configuration files support:
$ pip install click-extra[xml]
JSON5 configuration files support:
$ pip install click-extra[json5]
JSONC configuration files support:
$ pip install click-extra[jsonc]
HJSON configuration files support:
$ pip install click-extra[hjson]
For Pygments¶
Register new ANSI-capable formatter, filter and lexers:
$ pip install click-extra[pygments]
For Sphinx¶
Register new click:source and click:run directives:
$ pip install click-extra[sphinx]
For Pytest¶
Activate new fixtures and utilities for testing Click CLIs:
$ pip install click-extra[pytest]