NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #897 most downloaded on PyPI
Typer, build great CLIs. Easy to code. Based on Python type hints.
Last release 7 months ago
16 Feb 2026
Release timing varies
gaps range from 2 weeks to 3 months
Nearly every release is documented
notes for 37 of 37 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
41 releases · first in 2023
➖ Drop support for Python 3.9. PR #1546 by @tiangolo.
✅ Monkeypatch console width to allow running pytest directly. PR #1542 by @SwaatiR.
One column per month.
🐛 Fix TYPER_USE_RICH parsing to allow disabling Rich completely. PR #1539 by @bckohan.
📝 Add more explicit deprecation note in shell packages. PR #1534 by @tiangolo.
💥 Make typer-slim a shallow wrapper around typer, always requiring rich and shellingham. PR #1522 by @svlandeg.
🐛 Fix highlighting of optional variadic argument metavars. PR #1508 by @BenjyWiener.
--help text alignment when using typer.style() in option descriptions. PR #1356 by @mahimairaja.uv instead of poetry. PR #1474 by @svlandeg.management-tasks.md to be in line with management-tasks.md in FastAPI repo. PR #1519 by @YuriiMotov.custom.js. PR #1488 by @alejsdev.ty to the CI lint check. PR #1477 by @svlandeg.Lint step in test.yml workflow. PR #1511 by @YuriiMotov.mod fixture. PR #1506 by @svlandeg.uv.lock gets the internal label. PR #1497 by @svlandeg.🐛 Fix escaping in help text when rich is installed but not used. PR #1089 by @svlandeg.
prek. PR #1466 by @YuriiMotov.➖ Drop support for Python 3.8. PR #1464 by @tiangolo.
ruff dependency to shared requirements-docs-tests.txt to fix "Build docs" workflow in CI. PR #1458 by @YuriiMotov.✨ Add support for standard tracebacks via the env TYPER_STANDARD_TRACEBACK. PR #1299 by @colin-nolan.
TYPER_STANDARD_TRACEBACK. PR #1299 by @colin-nolan.options_metavar is passed through correctly. PR #816 by @gar1t.metavar is set. PR #1409 by @svlandeg.rich_markup_mode is interpreted correctly. PR #1304 by @svlandeg.shellingham. PR #1347 by @nathanjmcdougall.printing.md. PR #1365 by @svlandeg.master. PR #1414 by @svlandeg.Typer() more prominently. PR #1418 by @svlandeg.--showlocals to test.sh. PR #1169 by @rickwporter.mod.app . PR #1427 by @svlandeg.latest-changes GitHub Action and pin actions/checkout@v5. PR #1424 by @tiangolo.✨ Enable command suggestions on typo by default. PR #1371 by @savannahostrowski.
waiting label in issue-manager. PR #1378 by @YuriiMotov.🐛 Fix list convertor with an empty list default factory . PR #1350 by @svlandeg.
Note: this is the last version to support Python 3.7, going forward Typer will require Python 3.8+. And soon Python 3.8 will also be dropped as Python
Note: this is the last version to support Python 3.7, going forward Typer will require Python 3.8+. And soon Python 3.8 will also be dropped as Python 3.8 reached it's end of life almost a year ago.
Optional[list] values work correctly with callbacks. PR #1018 by @solesensei.✨ Support typing.Literal to define a set of predefined choices. PR #429 by @blackary.
typing.Literal to define a set of predefined choices. PR #429 by @blackary.None in CliRunner.invoke. PR #1303 by @arjenzorgdoc.rich. PR #1297 by @nathanjmcdougall.👽️ Ensure compatibility with Click 8.3.0 by restoring the original value_is_missing function. PR #1333 by @svlandeg.
⬇️ Restrict Click to below 8.3.0 to handle changes in the new version. PR #1336 by @svlandeg.
🐛 Make sure rich.markup is imported when rendering help text. PR #1290 by @g-arjones.
rich.markup is imported when rendering help text. PR #1290 by @g-arjones.✨ Allow annotated parsing with a subclass of Path. PR #1183 by @emfdavid.
🐛 Avoid printing default: None in the help section when using Rich. PR #1120 by @mattmess1221.
default: None in the help section when using Rich. PR #1120 by @mattmess1221.🐛 Fix markdown formatting in --help output. PR #815 by @gar1t.
⚡️ Lazy-load rich_utils to reduce startup time. PR #1128 by @oefe.
🐛 Avoid printing additional output with no_args_is_help=True and Click 8.2. PR #1278 by @svlandeg.
environment-variables.md. PR #1277 by @neirzhei.count parameter in the documentation. PR #1201 by @PokkaKiyo.⬆️ Add compatibility with Click 8.2. PR #1222 by @tiangolo.
When using the CliRunner with Click < 8.2, to be able to access the stderr output, you needed to set the mix_stderr parameter to True. Since Click 8.2 (and Typer 0.160 this release supporting it) this is no longer necessary, so this parameter has been removed.
📌 Pin Click to < 8.2, compatibility for Click >= 8.2 will be added in a future version. PR #1225 by @tiangolo.
🐛 Ensure that autocompletion works for Path arguments/options. PR #1138 by @svlandeg.
Path arguments/options. PR #1138 by @svlandeg.rich_markup_mode . PR #964 by @svlandeg.✨ Allow custom styles for commands in help output. PR #1103 by @TheTechromancer.
typing_extensions in newer Python versions. PR #1048 by @horta.Annotated. PR #983 by @gkeuccsr.mix_stderr when accessing the output of stderr in tests. PR #1045 by @mrchrisadams.🗑️ Deprecate shell_complete and continue to use autocompletion for CLI parameters. PR #974 by @svlandeg.
shell_complete and continue to use autocompletion for CLI parameters. PR #974 by @svlandeg.✨ Add support for extending typer apps without passing a name, add commands to the top level. PR #1037 by @patrick91.
🔥 Remove auto naming of groups added via add_typer based on the group's callback function name. PR #1052 by @patrick91.
add_typer based on the group's callback function name. PR #1052 by @patrick91.Before, it was supported to infer the name of a command group from the callback function name in the sub-app, so, in this code:
import typer
app = typer.Typer()
users_app = typer.Typer()
app.add_typer(users_app)
@users_app.callback()
def users(): # <-- This was the inferred command group name
"""
Manage users in the app.
"""
@users_app.command()
def create(name: str):
print(f"Creating user: {name}")
...the command group would be named users, based on the name of the function def users().
Now you need to set it explicitly:
import typer
app = typer.Typer()
users_app = typer.Typer()
app.add_typer(users_app, name="users") # <-- Explicitly set the command group name
@users_app.callback()
def users():
"""
Manage users in the app.
"""
@users_app.command()
def create(name: str):
print(f"Creating user: {name}")
Updated docs SubCommand Name and Help.
Note: this change will enable important features in the next release. 🤩
✨ Remove Rich tags when showing completion text. PR #877 by @svlandeg.
🗑️ Deprecate support for is_flag and flag_value parameters. PR #987 by @svlandeg.
KeyboardInterrupt separately from other exceptions. PR #1039 by @patrick91.launch to not print anything when opening urls. PR #1035 by @patrick91.is_flag and flag_value parameters. PR #987 by @svlandeg._typing.py file. PR #805 by @ivantodorovich._make_rich_text. PR #959 by @svlandeg._TYPER_RUN_INSTALL_COMPLETION_TESTS is set. PR #995 by @svlandeg._make_rich_text method. PR #972 by @svlandeg.labeler.yml. PR #1014 by @tiangolo.issue-manager.yml. PR #978 by @tiangolo.include-hidden-files to True when using the upload-artifact GH action. PR #967 by @svlandeg.latest-changes GitHub Action. PR #955 by @tiangolo.💄 Unify the width of the Rich console for help and errors. PR #788 by @racinmat.
rich_markup_mode=None disables Rich formatting. PR #859 by @svlandeg.main.py in tutorial on CLI option names. PR #868 by @fsramalho.docs/virtual-environments.md. PR #952 by @tiangolo.docs/contributing.md. PR #947 by @tiangolo.needs_bash test fixture. PR #888 by @svlandeg.✨ Add support for Python 3.12, tests in CI and official marker. PR #807 by @ivantodorovich.
UnionType (e.g. str | None) with Python 3.11. PR #548 by @jonaslb.zsh autocompletion installation. PR #237 by @alexjurkiewicz.Annotated with future annotations in Python 3.7+. PR #814 by @ivantodorovich.shell_complete not working for Arguments. PR #737 by @bckohan.pyproject.toml, show up in PyPI. PR #931 by @tiangolo.__init__.py files to fix test suite. PR #809 by @svlandeg.🐛 Fix Rich formatting with no commands. PR #796 by @svlandeg.
✨ Improve column help display, ensure commands column width is the same on all panels. PR #567 by @ssbarnea.
Optional[Tuple] and default value None. PR #757 by @Asthestarsfalll.Now you don't need to install typer[all]. When you install typer it comes with the default optional dependencies and the typer command.
Now you don't need to install typer[all]. When you install typer it comes with the default optional dependencies and the typer command.
If you don't want the extra optional dependencies (rich and shellingham), you can install typer-slim instead.
You can also install typer-slim[standard], which includes the default optional dependencies, but not the typer command.
Now the package typer-cli doesn't add anything on top of what typer has, it only depends on typer, and is there only for backwards compatibility, so that projects that depend on typer-cli can get the latest features of the typer command while they upgrade their dependencies to require typer directly.
typer <0.12.0 to typer >=0.12.0, make typer independent of typer-slim, include typer command in typer package. PR #791 by @tiangolo.This fixes a problem that would break the typer installation directory when upgrading from typer <0.12.0 to typer >=0.12.0, see issue #790.
By installing the latest version (0.12.1) it fixes it, for any previous version, even if the installation directory was already broken by the previous upgrade.
Nothing published for this version
Nothing published for this version
In version 0.12.0, the typer package depends on typer-slim[standard] which includes the default dependencies (instead of typer[all]) and typer-cli (th
In version 0.12.0, the typer package depends on typer-slim[standard] which includes the default dependencies (instead of typer[all]) and typer-cli (that provides the typer command).
If you don't want the extra optional dependencies (rich and shellingham), you can install typer-slim instead.
You can also install typer-slim[standard], which includes the default optional dependencies, but not the typer command.
In version 0.12.0 the typer-cli package only provides the typer command, but the code is still in the main code, so even without installing typer-cli, it can be called with python -m typer.
This approach of having typer depend on typer-slim[standard] instead of including the whole code and dependencies itself caused an issue when upgrading from typer <0.12.0 to typer >=0.12.0, see issue #790. This is fixed in version 0.12.1.
typer-slim package without extras, make typer include typer-slim[default] and integrate Typer CLI (typer command) into Typer. PR #780 by @tiangolo.Nothing published for this version
Nothing published for this version
First commit. Publish to PyPI to reserve package name.
Back to top
Your coding agent can read these notes before it upgrades. Set up the MCP server →