- Add support for
.env
and custom env files inuv run
(#8811) - Add support for
--all-packages
inuv run
,uv sync
, anduv export
(#8742, #8741, #8739) - Allow use of
--frozen
with--all-packages
inuv sync
anduv export
(#8760) - Show full error chain on tool upgrade failures (#8753)
- Add
--check-url
touv publish
to check for existing distributions during upload (#8531) - Suggest using
--check-url
when--skip-existing
is used (#8803)
- Allow incompatible
requires-python
for source distributions with static metadata (#8768) - Allow managed downloads with
--python-preference system
(#8808) - Avoid error for
--group
defined in non-root workspace member (#8734) - Avoid showing dependency group annotations on workspace members in tree (#8730)
- Do not error when the Python bin directory is missing on
uv python uninstall
(#8725) - Include member groups when locking workspace (#8736)
- Fix bug where
python_version < '0'
could appear in a final resolution (#8759) - Sanitize filenames during zip extraction (#8732)
- Switch to RFC 9110 compatible format for exclude newer requests (#8752)
- Add support for installing versioned Python executables on Windows (#8663)
- Improve interactions with existing Python executables during install (#8733)
- Fix environment variable name in providing credentials section (#8740)
- Fix
add httpx
example with real git branch (#8756) - Fix indentation in
projects.md
(#8772) - Fix link to publish guide in
README
(#8720) - Generate environment variables documentation from code (#8493)
- Improve and fix some documents (#8749)
- Improve environment variables document (#8777)
- Sort errors during display in
uv python install
(#8684) - Update resolver to use disjointness checks instead of marker equality (#8661)
- Add
riscv64
to supported Python platform tags (#8660)
- Fix hard and soft float libc detection for managed Python distributions on ARM (#8498)
- Handle cycles in
uv pip tree
(#8689) - Respect dependency group markers in
uv export
(#8659) - Support transitive dependencies in Git workspaces (#8665)
- Use portable paths for subdirectories in lock URLs (#8707)
- Update
uv init --virtual
to imply--no-package
(#8595)
- Install versioned Python executables into the bin directory during
uv python install
(Unix only) (#8458)
- Clarify relationship between specifiers and
requires-python
range (#8688) - Fix broken link in docs (#8552)
- Fix outdated documentation on
Requires-Python
(#8679) - Add Google Artifact Registry index authentication guide (#8579)
- Add support for requesting free-threaded builds via
+freethreaded
(#8645) - Improve trusted publishing error messages (#8633)
- Remove unneeded
return
from Maturin project template (#8604) - Skip Python interpreter discovery for
uv export
(#8638) - Hint about missing trusted publishing permission (#8632)
- Add environment variable to disable progress output (#8600)
- Fork when minimum Python version increases (#8628)
- Ignore empty groups when validating lock (#8598)
- Remove duplicate word in error message (#8589)
- Support cyclic dependencies in
uv tree
(#8564) - Update
uv init
to imply--package
when using--build-backend
(#8593) - Restore use of
dev-dependencies
andrequires-dev
for lockfile compatibility (#8599)
- Clarify
requires-python
requirement for dependencies (#8619) - Update CLI documentation for
--cache-dir
(#8627)
This release includes support for the [dependency-groups]
table as recently standardized in PEP 735. The table allows for declaration of optional dependency groups that are not published as part of the package metadata, unlike [project.optional-dependencies]
. There are new --group
, --only-group
, and --no-group
options throughout the uv interface.
Previously, uv used a single tool.uv.dev-dependencies
list for declaration of development dependencies. Now, uv supports declaring development dependencies in a standardized format and allows splitting development dependencies into multiple groups.
For compatibility, and to simplify usage for people that do not need multiple groups, uv special-cases the group named dev
. The dev
group is equivalent to tool.uv.dev-dependencies
. The contents of tool.uv.dev-dependencies
will merged into the dev
group in uv's resolver. The --dev
, --only-dev
, and --no-dev
flags remain as aliases for the corresponding --group
options. Support for tool.uv.dev-dependencies
remains in this release, but will display warnings in a future release.
uv syncs the dev
group by default — this matches the existing behavior for tool.uv.dev-dependencies
. The default groups can be changed with the tool.uv.default-groups
setting.
Thank you to Stephen Rosen who authored PEP 735.
- Support for PEP 735 (#8272)
- Add support for
--dry-run
mode inuv lock
(#7783) - Don't allow non-string email in authors (#8520)
- Enforce lockfile schema versions (#8509)
- Always attach URL to network errors (#8444)
- Fix dangling non-platform dependencies in
uv tree
(#8532) - Prefer
lto
overdebug
free-threaded managed Python builds (#8515)
- Add
tool.uv.sources
to the "Settings" reference (#8543) - Add reference to
uv build
anduv publish
in the landing pages (#8542) - Avoid duplicate
[tool.uv]
header in TOML examples (#8545) - Document
.netrc
environment variable and path (#8511) - Fix
.netrc
typo in authentication docs (#8521) - Fix heading level of "Script support" on docs landing page (#8544)
- Move the installation configuration docs to a separate page (#8546)
- Update docs for
--publish-url
to avoid duplication. (#8561) - Fix typo (#8554)
- Fix typo in description of
--strict
flag (#8513)
- Allow static dependency metadata entries for direct URL requirements (#7846)
- Use reinstall report formatting for
uv python install --reinstall
(#8487) - Add support for system-level
uv.toml
configuration (#7851)
- Apply
requires-python
narrowing with upper bounds (#8403) - Avoid rewriting
[[tool.uv.index]]
entries when credentials are provided (#8502) - Fix
uv add
comment handling for empty arrays (#8504) - Replace dashes with underscores in index credential variables (#8452)
- Respect
--allow-insecure-host
inuv publish
(#8440) - Allow arbitrary
--package
includes inuv tree
(#8507) - Remove existing Python install after successful download in
uv python install
(#8485)
- Add docs example for URLs with
[tool.uv.dependency-metadata]
(#8484) - Add help page for build failures (#8286)
- Fix
cache-keys
typo intags = true
(#8422) - Add documentation examples for manual branch, rev, and tag Git dependencies (#8497)
- Improve error message for cache info serialization (#8500)
- Suggest
--from
command when executable is available foruvx
(#8473) - Support
--with-editable
inuv tool install
(#8472)
- Add support for
uv pip show --files
(#8369) - Don't prefetch unreachable packages (#8246)
- Remove
tool.uv.sources
table if it is empty (#8365) - Modify cache versioning to support backwards compatibility (#8386)
- Add support for
UV_FROZEN
andUV_LOCKED
(#8340)
- Allow dashes and underscores in custom index names (#8339)
- Avoid panic when Git dependencies are included in fork markers (#8388)
- Check existing source by normalized name before
uv add
anduv remove
(#8359) - Fix bug where username from authentication cache could be ignored (#8345)
- Fix to respect comments positioning in pyproject.toml on change (#8384)
- Redact index sources in
uv.lock
(#8333) - Use correct indentation when project table contains open bracket comment (#8387)
- Only remove a source from
[tool.uv.sources]
if it is no long being referenced (#8366) - Modify
uv pip list
anduv tree
to print to stdout regardless of--quiet
flag (#8392)
- Improve help message for missing
self update
invocations (#8337) - Log
.netrc
parsing errors (#8364) - Remove trailing newlines in error messages (#8322)
- Use a dedicated message for incompatible Python versions in wheel ABI tags (#8363)
- Remove commands available in the top-level from the suggested subcommand error (#8316)
- Run release builds for
macos-x86_64
onmacos-14
runners (#8327)
- Fix Python executable name in Windows free-threaded Python distributions (#8310)
- Redact index credentials from lockfile sources (#8307)
- Respect
UV_INDEX_
rather thanUV_HTTP_BASIC_
as documented (#8306) - Improve sources deserialization errors (#8308)
- Correct pytorch-to-torch reference in docs (#8291)
This release introduces a revamped system for defining package indexes, as an alternative to the existing pip-style
--index-url
and --extra-index-url
configuration options.
You can now define named indexes in your pyproject.toml
file using the [[tool.uv.index]]
table:
[[tool.uv.index]]
name = "pytorch"
url = "https://download.pytorch.org/whl/cpu"
Packages can be pinned to a specific index via tool.uv.sources
, to ensure that a given package is installed from the
correct index. For example, to ensure that torch
is always installed from the pytorch
index:
[tool.uv.sources]
torch = { index = "pytorch" }
[[tool.uv.index]]
name = "pytorch"
url = "https://download.pytorch.org/whl/cpu"
Indexes can also be marked as explicit = true
to prevent packages from being installed from that index
unless explicitly pinned. For example, to ensure that torch
is installed from the pytorch
index, but all other
packages are installed from the default index:
[tool.uv.sources]
torch = { index = "pytorch" }
[[tool.uv.index]]
name = "pytorch"
url = "https://download.pytorch.org/whl/cpu"
explicit = true
To define an additional index outside a pyproject.toml
file, use the --index
command-line argument
(or the UV_INDEX
environment variable); to replace the default index (PyPI), use the --default-index
command-line
argument (or UV_DEFAULT_INDEX
).
These changes are entirely backwards-compatible with the deprecated --index-url
and --extra-index-url
options,
which continue to work as before.
See the Index documentation for more.
- Add index URLs when provided via
uv add --index
or--default-index
(#7746) - Add support for named and explicit indexes (#7481)
- Add templates for popular build backends (#7857)
- Allow multiple pinned indexes in
tool.uv.sources
(#7769) - Allow users to incorporate Git tags into dynamic cache keys (#8259)
- Pin named indexes in
uv add
(#7747) - Respect named
--index
and--default-index
values intool.uv.sources
(#7910) - Update to latest PubGrub version (#8245)
- Enable environment variable authentication for named indexes (#7741)
- Avoid showing lower-bound warning outside of explicit lock and sync (#8234)
- Improve logging during lock errors (#8258)
- Improve styling of
requires-python
warnings (#8240) - Show hint in resolution failure on
Forbidden
(403
) orUnauthorized
(401
) (#8264) - Update to latest
cargo-dist
version (includes new installer features) (#8270) - Warn when patch version in
requires-python
is implicitly0
(#7959) - Add more context on client errors during range requests (#8285)
- Avoid writing duplicate index URLs with
--emit-index-url
(#8226) - Fix error leading to out-of-bound panic in
uv-pep508
(#8282) - Fix managed distributions of free-threaded Python on Windows (#8268)
- Fix selection of free-threaded interpreters during default Python discovery (#8239)
- Ignore sources in build requirements for non-source trees (#8235)
- Invalid cache when adding lower bound to lockfile (#8230)
- Respect index priority when storing credentials (#8256)
- Respect relative paths in
uv build
sources (#8237) - Narrow what the pip3. logic drops from entry points. (#8273)
- Add some additional notes to
--index-url
docs (#8267) - Add upgrade note to README (#7937)
- Remove note that "only a single source may be defined for each dependency" (#8243)
- Respect
[tool.uv.sources]
in build requirements (#7172)
- Add a dedicated
uv publish
error message for missing usernames (#8045) - Support interactive input in
uv publish
(#8158) - Use raw filenames in
uv publish
(#8204)
- Reuse the result of
which git
(#8224)
- Avoid environment check optimization for
uv pip install --exact
(#8219) - Do not use free-threaded interpreters without a free-threaded request (#8191)
- Don't recommend
--prerelease=allow
during build requirement resolution errors (#8192) - Prefer optimized builds for free-threaded Python downloads (#8196)
- Retain old
python-build-standalone
releases (#8216) - Run
uv build
builds in the source distribution bucket (#8220)
- Add support for managed installations of free-threaded Python (#8100)
- Add note about
uvx
touv tool run
short help (#7695) - Enable HTTP/2 requests (#8049)
- Support
uv tree --no-dev
(#8109) - Support PEP 723 metadata with
uv run -
(#8111) - Support
pip install --exact
(#8044) - Support
uv export --no-header
(#8096) - Add Python 3.13 images to Docker publish (#8105)
- Support remote (
https://
) scripts inuv run
(#6375) - Allow comma value-delimited arguments in
uv run --with
(#7909)
- Support wildcards in
UV_INSECURE_HOST
(#8052)
- Use shared index when fetching metadata in lock satisfaction routine (#8147)
- Add prerelease compatibility check to
uv python
CLI (#8020) - Avoid deleting a project environment directory if we cannot tell if a
pyvenv.cfg
file exists (#8012) - Avoid excluding valid wheels for exact
requires-python
bounds (#8140) - Bump
netrc
crate to latest commit (#8021) - Fix
uv python pin 3.13t
failure when parsing version for project requires check (#8056) - Fix handling of != intersections in
requires-python
(#7897) - Remove the newly created tool environment if sync failed (#8038)
- Respect dynamic extras in
uv lock
anduv sync
(#8091) - Treat resolver failures as fatal in lockfile validation (#8083)
- Use
git config --get
for author information for improved backwards compatibility (#8101) - Use comma-separated values for
UV_FIND_LINKS
(#8061) - Use shared resolver state between add and lock to avoid double Git update (#8146)
- Make
--relocatable
entrypoints robust to symlinking (#8079) - Improve compatibility with VSCode PS1 prompt (#8006)
- Fix "Stream did not contain valid UTF-8" failures in Windows (#8120)
- Use
--with-requirements
inuvx
error hint (#8112)
- Include
uvx
installation in Docker examples (#8179) - Make the instructions for the Windows standalone installer consistent across README and documentation (#8125)
- Update pip compatibility guide to note transitive URL dependency support (#8081)
- Document
--reinstall
with--exclude-newer
to ensure downgrades (#6721)
- Add managed downloads for CPython 3.13.0 (final) (#8010)
- Python 3.13 is the default version for
uv python install
(#8010) - Hint at wrong endpoint in
uv publish
failures (#7872) - List available scripts when a command is not specified for
uv run
(#7687) - Fill in
authors
field duringuv init
(#7756)
- Add managed downloads for CPython 3.13.0rc3 and 3.12.7 (#7880)
- Display the target virtual environment path if non-default (#7850)
- Preserve case-insensitive sorts in
uv add
(#7864) - Respect project upper bounds when filtering wheels on
requires-python
(#7904) - Add
--script
touv run
to treat an input as PEP 723 regardless of extension (#7739) - Improve legibility of build failure errors (#7854)
- Show interpreter source during Python discovery query errors (#7928)
- Add
UV_FIND_LINKS
environment variable for--find-links
(#7912) - Ignore empty string values for
UV_PYTHON
environment variable (#7878)
- Allow
py3x-none
tags in newer than Python 3.x (#7867) - Allow self-dependencies in the
dev
section (#7943) - Always ignore
cp2
wheels in resolution (#7902) - Clear the publish progress bar on retry (#7921)
- Fix parsing of
gnueabi
libc variants in Python version requests (#7975) - Simplify supported environments when comparing to lockfile (#7894)
- Trim commits when reading from Git refs (#7922)
- Use a higher HTTP read timeout when publishing packages (#7923)
- Remove the first empty line for
uv tree --package foo
(#7885)
- Add 3.13 support to the platform reference (#7971)
- Clarify project environment creation (#7941)
- Fix code block title in Gitlab integration docs (#7861)
- Fix project guide section on adding a Git dependency (#7916)
- Fix uninstallation command for Windows (#7944)
- Clearly specify the minimum supported Windows Server version (#7946)
- Allow multiple source entries for each package in
tool.uv.sources
(#7745) - Add
.gitignore
file touv build
output directory (#7835) - Disable jemalloc on FreeBSD (#7780)
- Respect
PAGER
env var when paging inuv help
command (#5511) - Support
uv run -m foo
to run a module (#7754) - Use a top-level output directory for
uv build
in workspaces (#7813) - Update
uv init --package
command to match project name (#7670) - Add a custom suggestion for
uv add dotenv
(#7799) - Add detailed errors for
tool.uv.sources
deserialization failures (#7823) - Improve error message copy for failed builds (#7849)
- Use
serde-untagged
to improve some untagged enum error messages (#7822) - Use build failure hints for
dotenv
errors, rather than inuv add
(#7825)
- Add
UV_NO_SYNC
environment variable (#7752)
- Accept
git+
prefix intool.uv.sources
(#7847) - Allow spaces in path requirements (#7767)
- Avoid reusing cached downloaded binaries with
--no-binary
(#7772) - Correctly trims values during wheel WHEEL file parsing (#7770)
- Fix
uv tree --invert
for platform dependencies (#7808) - Fix encoding mismatch between python child process and uv (#7757)
- Reject self-dependencies in
uv add
(#7766) - Respect
tool.uv.environments
for legacy virtual workspace roots (#7824) - Retain empty extras on workspace members (#7762)
- Use file stem when parsing cached wheel names (#7773)
- Make
FlatDistributions
public (#7833)
- Fix table of contents sizing (#7751)
- GitLab Integration documentation (#6857)
- Update documentation to setup-uv@v3 (#7807)
- Use
uv publish
instead of twine in docs (#7837) - Fix typo in
projects.md
(#7784)
- Add
uv build --all
to build all packages in a workspace (#7724) - Add support for
uv init --script
(#7565) - Add support for upgrading build environment for installed tools (
uv tool upgrade --python
) (#7605) - Initialize a Git repository in
uv init
(#5476) - Respect
--quiet
flag inuv build
(#7674) - Add context message before listing available tools in
uvx
(#7641)
- Don't create Python bytecode files during interpreter discovery (#7707)
- Escape glob patterns in workspace member discovery (#7709)
- Avoid prefetching source distributions with unbounded lower-bound ranges (#7683)
- Add
uv build
anduv publish
to features overview (#7716) - Add documentation on cache versioning (#7693)
- Spell out the names of the Docker images for easier copy-paste (#7706)
- Document uv-with-Jupyter workflows (#7625)
- Note that
uv lock --upgrade-package
retains locked versions (#7694)
- Add
uv publish
(#7475) - Add a
--project
argument to run a command from a project directory (#7603) - Display Python implementation when creating environments (#7652)
- Implement trusted publishing for
uv publish
(#7548) - Respect lockfile preferences for
--with
requirements (#7627) - Unhide the
--directory
option (#7653) - Allow requesting free-threaded Python interpreters (#7431)
- Show a dedicated PubGrub hint for
--unsafe-best-match
(#7645) - Add resolver error checking for conflicting distributions (#7595)
- Avoid adding double-newlines for CRLF (#7640)
- Avoid retaining forks when
requires-python
range changes (#7624) - Determine if pre-release Python downloads should be allowed using the version specifiers (#7638)
- Fix
link-mode=clone
for directories on Linux (#7620) - Improve Python executable name discovery when using alternative implementations (#7649)
- Require opt-in to use alternative Python implementations (#7650)
- Use the first pre-release discovered when only pre-release Python versions are available (#7666)
- Document environment variable that disables printing of virtual environment name in prompt (#7648)
- Remove double whitespaces from the code (#7623)
- Use anchorlinks rather than permalinks (#7626)
- Add build backend scaffolding (#7662)
- Revert "Treat invalid platform as more compatible than invalid Python (#7556)" (#7608)
- Add the execution policy to powershell installs for single versions (#7602)
- Move uvx shell completion to
uvx --generate-shell-completion
(#7511)
- Adjust messaging for frozen hint on resolution failure during
uv add
(#7597) - Provide resolution hints in case of possible local name conflicts (#7505)
- Improve Docker image release tagging order and display on
ghcr.io
(#7568) - Improve deserialization error messages (#7598)
- Allow system environments during project environment validity check (#7585)
- Avoid validating workspace members when
--no-sources
is provided (#7599) - Fix handling of
sys.base_prefix
collision in interpreter identity check during tool installs (#7596) - Make
uv cache prune
robust to unreadable rkyv entries (#7561) - Revert "Remove duplicate warning for settings discovery errors (#7384)" (#7594)
- Fix
-
to_
in packaged applications document (#7571)
- Add
socks
support (#7503) - Avoid warning about bad Python interpreter links for empty project environment directories (#7527)
- Improve invalid environment warning messages (#7544)
- Use more verbose spelling of "virtualenv" during creation (#7523)
- Do not use a user-facing warning for "Waiting to acquire lock..." message (#7502)
- Use a single buffer for hints on resolver errors (#7497)
- Allow Python pre-releases to be used if they are first on the
PATH
(#7470) - Avoid deleting the project environment directory if it is not a virtual environment (#7522)
- Do not error if the
CACHEDIR.TAG
file exists but cannot be written to (#7550) - Treat invalid platform as more compatible than invalid Python (#7556)
- Use portable paths when serializing sources (#7504)
- Compute resolver hints using the final reduced derivation tree (#7546)
- Bump the wheel and sdist cache versions (#7560)
- Heal cache entries with missing source distributions (#7559)
- Bump minimum supported Rust version from 1.80 -> 1.81
- Add
UV_LINK_MODE
to Docker caching example (#7510) - Clarify behavior of of overrides in CLI reference (#7537)
- Allow users to provide pre-defined metadata for resolution (#7442)
- Invalidate existing tool environments on Python interpreter mismatch (#7451)
- Avoid fatal error when searching for egg-info with missing directory (#7498)
- Add note on cache growth for self-hosted GitHub runners (#5757)
- Add
--no-editable
support touv sync
anduv export
(#7371) - Add support for
--only-dev
touv sync
anduv export
(#7367) - Add support for remaining pip-supported file extensions (#7387)
- Generate shell completion for
uvx
(#7388) - Include
uv export
command inrequirements.txt
output (#7374) - Prune unzipped source distributions in
uv cache prune --ci
(#7446) - Warn when trying to
uv sync
a package without build configuration (#7420) - Support requests for pre-releases in the
--python
option (#7335)
- Avoid erroneous version warning for
.dist-info
directories (#7444) - Avoid removing seed packages for
uv venv --seed
environments (#7410) - Avoid unnecessary progress bar initializations (#7412)
- Error when
tool.uv.sources
contains duplicate package names (#7383) - Include
--branch
et al when resolving unnamed URLs inuv add
(#7447) - Include
dev-dependencies
in--no-sources
invocations (#7408) - Include the parent interpreter in Python discovery when
--system
is used (#7440) - Respect
--no-sources
in PEP 723 scripts (#7409) - Respect
pyproject.toml
credentials from user-provided requirements (#7474) - Use consistent PyPI cache bucket (#7443)
- Use unambiguous relative paths in
uv export
(#7378)
- Add documentation on platform-specific dependencies (#7411)
- Add documentation for passing installer options on Linux (#6839)
- Separate project data from configuration settings (#7053)
- Hint at missing
project.name
(#6803) - Surface dedicated
project.name
error for workspaces (#7399) - Remove duplicate warning for settings discovery errors (#7384)
- Allow
uv tool upgrade --all
to continue on individual upgrade failure (#7333) - Support globs as cache keys in
tool.uv.cache-keys
(#7268) - Add Python package (
__main__.py
) support touv run
(#7281) - Add zip application support to
uv run
(#7289) - Add
--token
option toself update
command (#7279)
- Use
globwalk
forcache-keys
matching (#7337)
- Always treat archive-like requirements as local files (#7364)
- Apply
--no-install
options when constructing resolution (#7277) - Avoid clobbering existing
py.typed
files contents inuv init
(#7338) - Avoid enforcing platform compatibility when validating lockfile (#7305)
- Avoid installing transitive dev dependencies (#7318)
- Avoid selecting prerelease Python installations without opt-in (#7300)
- Fix PPC64 page size in binary builds. (#7298)
- Include pre-release Python versions in
uv python list
(#7290) - Make version ID optional for source builds (#7362)
- Support relative paths in
uv add --script
(#7301)
- Fix documentation typos for
uv build --build-constraint
flag (#7330) - Fix grammatical error in CLI docs (#7353)
- Add dedicated lock errors for wheel-only distributions (#7307)
- Avoid treating
.whl
sources as source distributions (#7303) - Clarify Python requirement source for script incompatibilities (#7339)
- Add support for managed Python 3.13 (#7263)
- Upgrade managed CPython versions to latest patch releases (#7263)
- Allow setting a target version for
uv self update
(#7252) - Create
py.typed
files duringuv init --lib
(#7232) - Add a dedicated error for packages that fail due to
distutils
deprecation (#7239) - Improve error message when requested Python version is unsupported (#7269)
- Add
uv run --no-sync
(#7192
- Avoid updating
pyproject.toml
offsets on non-add edits (#7262) - Invalidate cache when
--config-settings
change (#7139) - Remove workspace root for single-member workspace with
uv export
(#7254)
- Add support for dynamic cache keys (#7136)
- Allow
.dist-info
names with dashes for post releases (#7208) - Use type hints in code from
uv init
(#7225) - Treat
.tgz
the same as.tar.gz
(#7201) - Direct users towards
uv venv
to create a virtual environment (#7188) - Improve error message for uv init already init-ed (#7198)
- Avoid batch prefetching for un-optimized registries (#7226)
- Avoid iteration for singleton selections (#7195)
- Avoid extra newlines in debug logging for source builds (#7174)
- Prune unreachable packages from
--universal
output (#7209) - Respect exclusion when collecting workspace members (#7175)
- Use path file instead of
sitecustomize.py
(#7161) - Replace incorrect
--source
and--binary
flags with correct--sdist
and--wheel
flags inuv build
(#7156)
- Add
--no-emit-project
and friends touv export
(#7110) - Add
--output-file
touv export
(#7109) - Prune unused source distributions from the cache in
uv cache prune
(#7112) - Take intersection of constraint and requirements hashes (#7108)
- Skip metadata fetch for
--no-deps
andpip sync
(#7127)
- Avoid panicking when encountering an invalid Python version during
uv python list
(#7131) - Write trailing newline to
.python-version
files (#7140)
- Accept
--build-constraint
inuv build
(#7085) - Add
--require-hashes
and--verify-hashes
touv build
(#7094) - Add
--show-version-specifiers
touv tool list
(#7050) - Respect hashes in constraints files (#7093)
- Upgrade installer scripts (#7092)
- Allow specifying multiple packages in
uv tool upgrade
anduninstall
(#7037) - Sort by implementation in
uv python list
(#6918)
- Invalidate lockfile when member versions change (#7102)
- Strip fragments from direct source URLs in lockfile (#7061)
- Support
--no-build
and--no-binary
inuv sync
et al (#7100) - Use distribution hash over registry hash (#7060)
- Fix inverted log message (#7063)
- Adjust Docker
ENTRYPOINT
andCMD
for inherited images (#7054)
- Add winget to installers (#7088)
- Document how to disable path modifications during install (#7090)
- Document how to manually update locked package version (#7083)
- Document official
setup-uv
action (#7056) - Update docs on
.python-version
file (#7051)
- Implement
uv build
(#6895) - Add
--package
support touv build
(#6990) - Prune unreachable packages from lockfile (#6959)
- Prune unreachable wheels from lockfile (#6961)
- Show build output by default in
uv build
(#6912) - Support
uv build --wheel
from source distributions (#6898) - Use the root project name for the project virtual environment prompt (#7021)
- Fix handling of inline optional dependencies in
uv add
(#7023) - Reflect exit code in
uv tool run
anduv run
(#6994) - Revert
pyproject.toml
modifications on Ctrl-C (#7024) - Rollback
pyproject.toml
changes on all errors (#7022) - Use correct ordering semantics for narrowing upper-bounded Python requirements (#7031)
- Fix segfault in Windows trampolines (#6955)
- Remove unused
__future__.annotations
import in_virtualenv.py
(#6996)
- Add documentation for
uv build
(#6991) - Add note to
extra
andall-extras
inuv sync
help (#7013) - Add project docs for
project.scripts
(#7010) - Fix available Docker image tag rendering and shorten list (#7017)
- Touchup to the project environment config section (#7038)
- Clarify precedence of
uv.toml
(#6986) - Fix available Docker tags for
-slim
variants (#7041)
- Allow customizing the project environment path with
UV_PROJECT_ENVIRONMENT
(#6834) - Warn when
VIRTUAL_ENV
is set but will not be respected in project commands (#6864) - Add
--no-hashes
touv export
(#6954) - Make HTTP headers title case for backward compatibility (#6887)
- Pin
.python-version
inuv init
(#6869) - Support
file://
URLs forUV_PYTHON_INSTALL_MIRROR
(#6950) - Introduce more docker tags for uv (#6053)
- Avoid canonicalizing the cache directory (#6949)
- Show all PyPy versions in
uv python list --all-versions
(#6917) - Avoid incorrect
requires-python
marker simplifications (#6268)
- Add documentation for
UV_PROJECT_ENVIRONMENT
(#6987) - Add optional dependencies section to the lockfile document (#6982)
- Document use of the
file://
scheme in Python installation mirrors (#6984) - Fix outdated references to the help menu documentation in the first steps page (#6980)
- Show env option in CLI reference documentation (#6863)
- Add bind mount example to
docker.md
(#6921)
- Show build backend output when
--verbose
is provided (#6903) - Allow
uv sync --frozen --package
without copying memberpyproject.toml
(#6943)
- Avoid panic with missing temporary directory (#6929)
- Avoid updating incorrect dependencies for sorted
uv add
(#6939) - Use lower-bound semantics for all Python compatibility comparisons (#6882)
- Fix
is_disjoint
check for supported environments (#6902) - Remove dangling archives in
uv cache clean ${package}
(#6915) - Error when discovered Python is incompatible with
--isolated
workspace (#6885) - Warn when discovered Python is incompatible with PEP 723 script (#6884)
- Add
uv export --format requirements-txt
(#6778) - Allow
@
references inuv tool install --from
(#6842) - Normalize version specifiers by sorting (#6333)
- Respect the user's upper-bound in
requires-python
(#6824) - Use Windows registry to discover Python on Windows directly (#6761)
- Hint at
--no-workspace
inuv init
failures (#6815) - Update to last PyPy releases (#6784)
- Avoid deadlocks when multiple uv processes lock resources (#6790)
- Expand tildes when matching against
PATH
(#6829) - Fix
uv init --no-project
alias (#6837) - Ignore pre-release segments when discovering via
requires-python
(#6813) - Support inline optional tables in
uv add
anduv remove
(#6787) - Update default
hello.py
to passruff format
(#6811) - Avoid stripping root for user path display (#6865)
- Error when user-provided environments are disjoint with Python (#6841)
- Retain alphabetical sorting for
pyproject.toml
inuv add
operations (#6388)))
- Add a link to the multiple index docs in the alternative index guide (#6826)
- Add docs for inline exclude newer in PEP 723 scripts (#6831)
- Enumerate available Docker tags (#6768)
- Omit
[pip]
section from configuration file docs (#6814) - Update
project.urls
inpyproject.toml
(#6844) - Add docs for AWS CodeArtifact usage (#6816)
This release adds first-class support for Python projects that are not designed as Python packages (e.g., web applications, data science projects, etc.).
In doing so, it includes some breaking changes around uv's handling of projects. Previously, uv required that all projects could be built into distributable Python packages, and installed them into the virtual environment. Projects created by uv init
always included a [build-system]
definition and existing projects that did not define a [build-system]
would use the legacy setuptools build backend by default.
Most users are not developing libraries that need to be packaged and published to PyPI. Instead, they're building applications using web frameworks, or running collections of Python scripts in the project's root directory. In these cases, requiring a [build-system]
was confusing and error-prone. In this release, uv changes the default behavior to orient around these common use cases.
In summary, the major changes are:
- uv no longer attempts to package and install projects that do not define a
[build-system]
.- While the project itself will not be installed into the virtual environment, its dependencies will still be included.
- The previous behavior can be recovered by setting
package = true
in the[tool.uv]
section of yourpyproject.toml
.
uv init
no longer creates asrc/
directory or defines a[build-system]
by default.- The previous behavior can be recovered with
uv init --lib
oruv init --app --package
.
- The previous behavior can be recovered with
- uv allows and recommends including
[project]
definitions in virtual workspace roots.- Previously, the uv required the
[project]
section to be omitted.
- Previously, the uv required the
- uv allows disabling packaging of projects, even if they define a
[build-system]
, by settingpackage = false
in the[tool.uv]
section of yourpyproject.toml
.
See the latest documentation on build systems in projects for more details.
- Add first-class support for non-packaged projects (#6585)
- Add
--app
and--lib
options touv init
(#6689) - Use
virtual
source label in lockfile for non-packaged dependencies (#6728) - Read hash from URL fragment if
--hashes
are omitted (#6731) - Support
{package}@{version}
inuv tool install
(#6762) - Publish additional Docker tags without patch version (#6734)
- Accept either strings or structs for hosts (#6763)
- Avoid including non-excluded members in parent workspaces (#6735)
- Avoid reading stale
.egg-info
from mutable sources (#6714) - Avoid writing invalid PEP 723 scripts on
tool.uv.sources
(#6706) - Compare virtual members when invalidating lockfile (#6754)
- Do not require workspace members to sync with
--frozen
(#6737) - Implement deserialization for trusted host (#6716)
- Avoid showing duplicate paths in
uv python list
(#6740) - Raise an error for unclosed script tags in PEP 723 scripts (#6704)
- Add dependabot and renovate documentation page (#6236)
- Bind to the host to allow connections in FastAPI Docker example (#6753)
- Fix some broken links (#6705)
- Update FastAPI guide for virtual projects and use
uv init
to create thepyproject.toml
(#6752) - Update project documentation for the application / library concepts (#6718)
- Update workspace documentation to remove legacy virtual projects (#6720)