changelogs/0.7.x.md
This release contains various changes that improve correctness and user experience, but could break some workflows; many changes have been marked as breaking out of an abundance of caution. We expect most users to be able to upgrade without making changes.
Update uv version to display and update project versions
(#12349)
Previously, uv version displayed uv's version. Now, uv version will display or update the
project's version. This interface was
heavily requested and, after much consideration, we
decided that transitioning the top-level command was the best option.
Here's a brief example:
$ uv init example
Initialized project `example` at `./example`
$ cd example
$ uv version
example 0.1.0
$ uv version --bump major
example 0.1.0 => 1.0.0
$ uv version --short
1.0.0
If used outside of a project, uv will fallback to showing its own version still:
$ uv version
warning: failed to read project: No `pyproject.toml` found in current directory or any parent directory
running `uv self version` for compatibility with old `uv version` command.
this fallback will be removed soon, pass `--preview` to make this an error.
uv 0.7.0 (4433f41c9 2025-04-29)
As described in the warning, --preview can be used to error instead:
$ uv version --preview
error: No `pyproject.toml` found in current directory or any parent directory
The previous functionality of uv version was moved to uv self version.
Avoid fallback to subsequent indexes on authentication failure (#12805)
When using the first-index strategy (the default), uv will stop searching indexes for a package
once it is found on a single index. Previously, uv considered a package as "missing" from an index
during authentication failures, such as an HTTP 401 or HTTP 403 (normally, missing packages are
represented by an HTTP 404). This behavior was motivated by unusual responses from some package
indexes, but reduces the safety of uv's index strategy when authentication fails. Now, uv will
consider an authentication failure as a stop-point when searching for a package across indexes.
The index.ignore-error-codes option can be used to recover the existing behavior, e.g.:
[[tool.uv.index]]
name = "pytorch"
url = "https://download.pytorch.org/whl/cpu"
ignore-error-codes = [401, 403]
Since PyTorch's indexes always return a HTTP 403 for missing packages, uv special-cases indexes on
the pytorch.org domain to ignore that error code by default.
Require the command in uvx <name> to be available in the Python environment
(#11603)
Previously, uvx would attempt to execute a command even if it was not provided by a Python
package. For example, if we presume foo is an empty Python package which provides no command,
uvx foo would invoke the foo command on the PATH (if present). Now, uv will error early if
the foo executable is not provided by the requested Python package. This check is not enforced
when --from is used, so patterns like uvx --from foo bash -c "..." are still valid. uv also
still allows uvx foo where the foo executable is provided by a dependency of foo instead of
foo itself, as this is fairly common for packages which depend on a dedicated package for their
command-line interface.
Use index URL instead of package URL for keyring credential lookups (#12651)
When determining credentials for querying a package URL, uv previously sent the full URL to the
keyring command. However, some keyring plugins expect to receive the index URL (which is
usually a parent of the package URL). Now, uv requests credentials for the index URL instead. This
behavior matches pip.
Remove --version from subcommands (#13108)
Previously, uv allowed the --version flag on arbitrary subcommands, e.g., uv run --version.
However, the --version flag is useful for other operations since uv is a package manager.
Consequently, we've removed the --version flag from subcommands — it is only available as
uv --version.
Omit Python 3.7 downloads from managed versions (#13022)
Python 3.7 is EOL and not formally supported by uv; however, Python 3.7 was previously available for download on a subset of platforms.
Reject non-PEP 751 TOML files in install, compile, and export commands (#13120, #13119)
Previously, uv treated arbitrary .toml files passed to commands (e.g.,
uv pip install -r foo.toml or uv pip compile -o foo.toml) as requirements.txt-formatted
files. Now, uv will error instead. If using PEP 751 lockfiles, use the standardized format for
custom names instead, e.g., pylock.foo.toml.
Ignore arbitrary Python requests in version files (#12909)
uv allows arbitrary strings to be used for Python version requests, in which they are treated as
an executable name to search for in the PATH. However, using this form of request in
.python-version files is non-standard and conflicts with pyenv-virtualenv which writes
environment names to .python-version files. In this release, uv will now ignore requests that
are arbitrary strings when found in .python-version files.
Error on unknown dependency object specifiers (12811)
The [dependency-groups] entries can include "object specifiers", e.g. set-phasers-to = ... in:
[dependency-groups]
foo = ["pyparsing"]
bar = [{set-phasers-to = "stun"}]
However, the only current spec-compliant object specifier is include-group. Previously, uv would
ignore unknown object specifiers. Now, uv will error.
Make --frozen and --no-sources conflicting options
(#12671)
Using --no-sources always requires a new resolution and --frozen will always fail when used
with it. Now, this conflict is encoded in the CLI options for clarity.
Treat empty UV_PYTHON_INSTALL_DIR and UV_TOOL_DIR as unset
(#12907,
#12905)
Previously, these variables were treated as set to the current working directory when set to an empty string. Now, uv will ignore these variables when empty. This matches uv's behavior for other environment variables which configure directories.
poetry-core as a uv init build backend option
(#12781)pylock.toml
(#13136)pyvenv.cfg version mismatch
(#13027)pylock.toml
(#13132)uvx --version (#13109)--no-binary et al) in pylock.toml
(#13134)upload-time rather than upload_time in uv.lock
(#13176)fish completions append >> to overwrite >
(#13130)pylock.toml mentions where relevant (#13115)uv version is used with project-specific flags but no project is found
(#13203)clang in managed Python sysconfig
(#13237)--project in uv version (#13230)--dry-run support to uv self update (#9829)--show-with to uv tool list to list packages included by --with
(#13264)fs_err for paths in symlinking errors (#13303)python-downloads-json-url option for uv.toml to configure custom Python installations via
JSON URL (#12974)musllinux_1_0 as a valid platform tag
(#13289)uv run --with
(#13283)uv run --with
(#13284)--no-sync
(#13287)uv add (#13462)--raw-sources to --raw (#13348)self update is used to install an older version
(#13340)uv self update if required uv version is newer
(#13305)pylock.toml dependency entries
(#13384).tgz parsing to respect true extension
(#13382)pylock.toml in uv add -r (#13421)libpython into the interpreter on Linux for a significant performance boostSee the
python-build-standalone release notes
for more details.
VIRTUAL_ENV_PROMPT value
(#13501)See the
python-build-standalone release notes
for more details.
uv version lock and sync (#13317)ldd in diagnostics to correctly refer to ld.so
(#13552)We are reverting most of our Python changes from uv 0.7.6 and uv 0.7.7 due to a miscompilation
that makes the Python interpreter behave incorrectly, resulting in spurious type-errors involving
str. This issue seems to be isolated to x86_64 Linux, and affected at least Python 3.12, 3.13, and
3.14.
The following changes that were introduced in those versions of uv are temporarily being reverted while we test and deploy a proper fix for the miscompilation:
libpython into the interpreter on Linux for a significant performance boostThe changes reverted in 0.7.8 have been restored.
See the
python-build-standalone release notes
for more details.
uvx
(#13583)uvw as alias for uv without console window on Windows
(#11786)uv python list
(#13721)extends-environment key in the pyvenv.cfg file
of an ephemeral environment (#13598)uv-python crate's manylinux submodule
(#11131)Version display (#13643)uv cache clean
(#13669)--all-packages
(#13678)self update if global --offline is set
(#13663)uv python install --reinstall
(#13645)LC_ALL=C for git when checking git worktree
(#13637)uv add --bounds to configure version constraints
(#12946)exclude-newer date format for persistent configuration files
(#13706).pre-commit-config.yaml
(#10243)--show-extras to uv tool list (#13783)git username when using SSH authentication
(#13799)/+simple
(#13743)uv export
(#13809)reqwest and hyper-util to resolve connection reset errors over IPv6
(#13835)uv's binary's version when checking if it's up to date
(#13840)SIGINT docs
(#13787)uv python pin --rm to remove .python-version pins
(#13860)excluded-newer
(#13884)tool.uv.environments on resolution error
(#13455)tool.uv.required-environments on resolution error
(#13575)python pin error messages (#13862)uv sync, uv add and uv remove to prevent race conditions
(#13869)--no-editable to uv export for pylock.toml
(#13852).gitignore in project init files (#13855)gh auth login
(#13850)uuid.getnode on 3.13See the
python-build-standalone release notes
for more details.
uv python pin if not found
(#13946)zstd and deflate to Accept-Encoding
(#13982)uv python pin
(#13944)uv add --group ... --script (#13997)llms.txt to uv (#13929)--torch-backend (#14172)--torch-backend (#14120)--torch-backend (#14119)[tool.uv.dependency-groups].mygroup.requires-python
(#13735)requires-python
(#14076)platform_machine marker for win_amd64 platform tag
(#14041)dependency-groups from pyproject.tomls with no [project]
(#13742)uv init --script
(#14141)uv run
(#14153)Ordering::Relaxed for standalone atomic use cases
(#14190)--index
(#14152)schema.json descriptions
(#13693)See the
python-build-standalone release notes
for more details.
~= is used as a Python version specifier without a patch version
(#14008)requirements.txt
(#14288)/simple component
(#14251)--with dependencies
(#14340)UV_PYTHON_CACHE_DIR when empty (#14336)pyvenv.cfg version conflict
(#14329)cpython-<version>-windows-aarch64.See the python-build-standalone release for more details.
ManagedPythonDownload::fetch_with_retry
(#14378)python_version and python_full_version
(#14271)The uv build backend is now stable, and considered ready for production use.
The uv build backend is a great choice for pure Python projects. It has reasonable defaults, with
the goal of requiring zero configuration for most users, but provides flexible configuration to
accommodate most Python project structures. It integrates tightly with uv, to improve messaging and
user experience. It validates project metadata and structures, preventing common mistakes. And,
finally, it's very fast — uv sync on a new project (from uv init) is 10-30x faster than with
other build backends.
To use uv as a build backend in an existing project, add uv_build to the [build-system] section
in your pyproject.toml:
[build-system]
requires = ["uv_build>=0.7.19,<0.8.0"]
build-backend = "uv_build"
In a future release, it will replace hatchling as the default in uv init. As before, uv will
remain compatible with all standards-compliant build backends.
See the python-build-standalone release for more details.
--universal pip compile
(#14405)sys.prefix in cached environment keys to avoid --with collisions across projects
(#14403)See the PyPy and
python-build-standalone
release notes for more details.
--workspace flag to uv add (#14496)uv version
(#14434)uv-extract to enable retries
(#14450)NoSolutionError
(#14457)ErrorTree for NoSolutionError public
(#14444)cache-dependency-glob examples for setup-uv
(#14493)uv pip sync suggestion with pyproject.toml
(#14510)setup-uv@v6
(#14490)fts4, fts5, rtree, and geopoly extensions on macOS and LinuxSee the
python-build-standalone release notes
for more details.
--python-platform to uv sync (#14320)uv version --bump (#13578)-w shorthand for --with (#14530)UV_HTTP_RETRIES to customize retry counts
(#14544)cache-key
(#13438)..) in globs in cache-key
(#13469)cache-key performance (#13469)uv sync --output-format json (#13689)uv tool if it is incompatible with --python
(#14606)include-group
(#14539)setup-python (#14533)See the GraalPy release notes for more details.
UV_COMPILE_BYTECODE_TIMEOUT environment variable
(#14369)cache-control headers
(#14620)UV_LIBC to override libc selection in multi-libc environment
(#14646)--all-arches when paired with --only-downloads
(#14629)uv.toml when provided via direct path
(#14653)revision in the lockfile versioning doc
(#14634)uv cache clean prior to --reinstall
(#14659)