Change8

0.10.0

Breaking Changes
📦 uvView on GitHub →
12 breaking4 features🐛 1 fixes🔧 9 symbols

Summary

This release stabilizes several preview features, including Python version management and workspace utilities, while introducing several breaking changes to improve correctness, such as requiring explicit confirmation for venv removal and stricter index configuration validation.

⚠️ Breaking Changes

  • uv venv now requires the --clear flag to remove an existing virtual environment, instead of prompting or removing silently. Opt in by passing --clear or setting UV_VENV_CLEAR=1.
  • uv errors if multiple indexes in configuration have `default = true`. Remove `default = true` from all but one index.
  • uv errors if an explicit index defined in [tool.uv.sources] is unnamed. Add a `name` to the explicit index or remove the entry.
  • `uv python install` now names alternative Python executables (PyPy, GraalPy, Pyodide) using their implementation name (e.g., `pypy3.10`) instead of generic names like `python3.10` to prevent CPython conflicts.
  • `uv tool run` and `uv tool install` now respect the global Python version pin set via `uv python pin --global` when no explicit version is requested. Opt out by providing an explicit `--python` flag.
  • Debian Bookworm, Alpine 3.21, and Python 3.8 Docker images are removed. Use `uv:debian` or `uv:trixie` instead of `uv:bookworm`, `uv:alpine3.22` instead of `uv:alpine3.21`, and a newer Python version instead of `uv:python3.8-*`.
  • Pre-built binaries for PPC64 (big endian) are no longer provided. PPC64LE (little endian) builds are unaffected.
  • The `activate.csh` script is no longer generated when using `uv venv --relocatable` because it contained hardcoded paths.
  • When multiple stored credentials match a host URL during authentication (e.g., via `uv auth token`), uv now errors instead of picking the first match. Specify the username using `--username`.
  • Changing the `exclude-newer` setting no longer causes package versions to be upgraded, ignoring the lockfile entirely. Packages are only changed if they fall outside the new `exclude-newer` range. Restore old behavior with `--upgrade` or `--upgrade-package`.
  • `uv format` now uses Ruff 0.15.0, adopting the 2026 style guide, which will change code formatting. Opt out by requesting an older Ruff version (e.g., `uv format --version 0.14.14`).
  • Cargo features for gating test dependencies have been renamed from `pypi` to `test-pypi` for redistributors.

Migration Steps

  1. If you rely on `uv venv` removing existing environments non-interactively, add the `--clear` flag to your command or set the environment variable `UV_VENV_CLEAR=1`.
  2. Review your index configuration and ensure only one source has `default = true`.
  3. Ensure all explicit indexes defined in `[tool.uv.sources]` have a corresponding `name` field.
  4. If you use `uv tool run` or `uv tool install` and need to override the global Python pin, explicitly pass the `--python` flag.
  5. If you use the removed Docker images (`uv:bookworm`, `uv:alpine3.21`, `uv:python3.8-*`), update your base image references.
  6. If you use `uv auth token` or similar commands where multiple credentials match a host, include the required username via `--username`.
  7. If you rely on the old behavior of `exclude-newer` forcing package upgrades, use `--upgrade` or `--upgrade-package` explicitly.
  8. Review code formatting changes introduced by Ruff 0.15.0 if you use `uv format`.

✨ New Features

  • Stabilized `uv python upgrade` command and `uv python install --upgrade` functionality, which now transparently upgrades virtual environments to new Python patch versions.
  • Stabilized automatic upgrading of Python patch versions in virtual environments when a new version is installed.
  • Stabilized `add-bounds` setting and `uv add --bounds` usage (no longer shows experimental warning).
  • Stabilized `uv workspace dir` and `uv workspace list` utilities.

🐛 Bug Fixes

  • Avoided invalidating lockfile versions after an `exclude-newer` change unless explicitly requested.

Affected Symbols