- Add
uv sync --script
(#11361) - Allow PEP 508 requirements in tool requests (#11337)
- Allow source distributions to produce wheels with
+local
suffixes (#11429) - Bring parity to
uvx
anduv tool install
requests (#11345) - Use a stable directory for local, remote, and stdin script virtual environments (#11347, #11364)
- Detect infinite recursion in
uv run
(#11386)
The managed Python distributions have been updated, including:
- CPython 3.14.0a5, which includes a new tail calling interpreter for a significant performance improvement
- The bundled OpenSSL version was updated from 3.0.15 to 3.0.16 which fixes a security advisory
See the python-build-standalone
release notes for more details.
- Fix cross-drive script installation (#11167)
- Add indexes in priority order (#11451)
- Allow
--python <dir>
requests to match existing environments ifsys.executable
is the same file (#11290) - Avoid comparing to system site packages in
--dry-run
mode (#11427) - Prefer running executables in the environment with
<name>
over<name>/__main__.py
(#11431) - Retry local clones without hardlinks if they fail (#11421)
- Update alternative-indexes.md to use
UV_INDEX
instead ofUV_EXTRA_INDEX_URL
(#11381) - Update scripts guide to include using package indexes (#11443)
The managed PyPy distributions have been updated for PyPy v7.3.18, which includes:
- PyPy3.10, which updates the standard library from Python 3.10.14 to 3.10.19
- PyPy3.11, which adds beta support for Python 3.11.11
See the PyPy release for more details.
- Add
NO_BINARY
andNO_BINARY_PACKAGE
environment variables (#11399)
- Avoid re-cloning name when populating ambiguous set (#11401)
- Optimize flattening in large workspaces (#11313)
- Allow dynamic packages to be overloaded (#11400)
- Fix credential caching for index roots when URL ends in
simple/
(#11336) - Fix marker merging for requirements.txt for psycopg (#11298)
- Set 777 permissions on locked files (#11328)
- Support extras in
@
requests for tools (#11335) - Upgrade
astral-tokio-tar
to v0.5.1 (#11359) - Avoid missing logging for no-op upgrade events (#11301)
- Use refined specifiers when logging narrowed Python range (#11334)
- Don't use popup-generating
eprintln
in trampoline warnings (#11295) - Patch pkg-config files to be relocatable (#11291)
- Fix a case of duplicate
torch
packages when using conflicting extras (#11323)
- Add docs for
uv tool install --editable
(#11280) - Fix broken anchors in README and docs index (#11338)
- Add
--bare
option touv init
(#11192) - Add support for respecting
VIRTUAL_ENV
in project commands via--active
(#11189) - Allow the project
VIRTUAL_ENV
warning to be silenced with--no-active
(#11251)
The managed Python distributions have been updated, including:
- CPython 3.12.9
- CPython 3.13.2
- pkg-config files are now relocatable
See the python-build-standalone
release notes for more details.
- Always use base Python discovery logic for cached environments (#11254)
- Use a flock to avoid concurrent initialization of project environments (#11259)
- Fix handling of
--all-groups
and--no-default-groups
flags (#11224)
- Minor touchups to the Docker provenance docs (#11252)
- Move content from the
mkdocs.public.yml
into the template (#11246)
- Allow discovering virtual environments from the first interpreter found on the
PATH
(#11218) - Clear ephemeral overlays when running tools (#11141)
- Disable SSL in Git commands for
--allow-insecure-host
(#11210) - Fix hardlinks in tar unpacking (#11221)
- Set base executable when returning virtual environment (#11209)
- Use base Python for cached environments (#11208)
- Add documentation on verifying Docker image attestations (#11140)
- Add
last updated
to documentation (#11164)
- Avoid setting permissions during tar extraction (#11191)
- Remove warnings for missing lower bounds (#11195)
- Update PubGrub to set-based outdated priority tracking (#11169)
- Improve error messages for
uv pip install
with--extra
or--all-extras
and invalid sources (#11193) - Sign Docker images using GitHub attestations (#8685)
- Don't expand self-referential extras in the build backend (#11142)
- Filter discovered Python executables by source before querying (#11143)
- Optimize exclusion computation for markers (#11158)
- Use Astral-maintained
tokio-tar
fork (#11174) - Remove unneeded
.clone()
(#11127)
- Fix relative paths in bytecode compilation (#11177)
- Percent-decode URLs in canonical comparisons (#11088)
- Respect concurrency limits in parallel index fetch (#11182)
- Use wire JSON schema for conflict items (#11196)
- Use explicit
_GLibCVersion
tuple in uv-python crate (#11122)
- Add Git SHA locking behavior to docs (#11125)
- Add best-practice flags to
pip install
example in troubleshooting guide (#11194) - Set
VIRTUAL_ENV
in Jupyter kernels (#11155) - Add instructions for deactivating an environment (#11200)
- Add support for
uvx python
(#11076) - Allow
--no-dev --invert
inuv tree
(#11068) - Update
uv python install --reinstall
to reinstall all previous versions (#11072) - Consistently write log messages with capitalized first word (#11111)
- Suggest
--build-backend
when--backend
is passed touv init
(#10958) - Improve retry trace message (#11108)
- Remove unnecessary UTF-8 conversion in hash parsing (#11110)
- Ignore non-hash fragments in HTML API responses (#11107)
- Avoid resolving symbolic links when querying Python interpreters (#11083)
- Avoid sharing state between universal and non-universal resolves (#11051)
- Error when
--script
is passing a non-PEP 723 script (#11118) - Make metadata deserialization failures non-fatal in the cache (#11105)
- Mark metadata as dynamic when reading from built wheel cache (#11046)
- Propagate credentials for
<index>/simple
to<index>/...
endpoints (#11074) - Fix conflicting extra bug during
uv sync
(#11075)
- Add PyTorch XPU instructions to the PyTorch guide (#11109)
- Add docs for signal handling (#11041)
- Explain build frontend vs. build backend (#11094)
- Fix formatting of
RUST_LOG
documentation (#10053) - Fix typo in
--no-deps
description (#11073) - Reflow CLI documentation comments (#11040)
- Shorten "Using existing Python versions" nav item so it fits on one line (#11077)
- Some minor touch-ups to the Python install guide (#11116)
- Update Dependabot tracking issue link (#11054)
- Update documentation for running in a container (#11052)
- Upgrade PyTorch version in documentation (#11114)
- Use
sys_platform
in lieu ofplatform_system
in PyTorch docs (#11113) - Use positive (rather than negative) markers in PyTorch examples (#11112)
- Fix unnecessary backslashes in brackets (#11059)
- Suggest setting copy link mode in GitLab integration guide (#11067)
- Allow installation of manylinux wheels on loongarch64 (#10927)
- Allow optional
=
for editables inrequirements.txt
(#10954) - Add Windows aarch64 to the release binaries (#10885)
- Use spec-compliant (
128+n
) exit codes foruv run
anduv tool run
on Unix (#10781) - Fix best-interpreter lookups when there is an invalid interpreter in the
PATH
(#11030) - Guard against concurrent cache writes on Windows (#11007)
- Prioritize package preferences with greater package versions (#10963)
- Reject
--editable
flag on non-directory requirements (#10994) - Respect
--no-sources
foruv pip install
workspace discovery (#11003) - Set
JEMALLOC_SYS_WITH_LG_PAGE=16
in ARM Docker builds (#10943) - Update
riscv64
Python downloads to allow install onriscv64gc
(#10937) - Fix file persist retries on Windows (#11008)
- Fix incorrect error message when specifying
tool.uv.sources.(package).workspace
with other options (#11013) - Improve SIGINT handling in
uv run
(#11009)
- Add
SECURITY
policy (#11035) - Add
Requires-Python
upper bound behavior to the docs (#10964) - Add a troubleshooting section and reproducible example guide (#10947)
- Add documentation for
uv add -r
(#10926) - Amend
requires-python
rules in resolver documentation (#10993) - Reference workspaces in
--no-sources
documentation (#10995) - Update documentation for activating virtual environments in different shell (#11000)
- Add Docker SHA pinning tip (#10955)
- Improve determinism of resolution by always setting package priorities (#10853)
- Upgrade to
cargo-dist
0.28.0; improves several installer behaviors (#10884)
- Remove dependencies clone in resolver (#10880)
- Use Hashbrown's raw entry API to reduce hashes and clone in resolver priority determination (#10881)
- Allow fallback to Python download on non-critical discovery errors (#10908)
- Register managed Python version with the Windows Registry (PEP 514) (#10634)
- Sort extras and groups when comparing lockfile requirements (#10856)
- Include
commit_id
andrequested_revision
indirect_url.json
(#10862) - Invalidate lockfile when static versions change (#10858)
- Make GitHub fast path errors non-fatal (#10859)
- Remove warnings for
--frozen
and--locked
inuv run --script
(#10840) - Resolve
find-links
paths relative to the configuration file (#10827) - Respect visitation order for proxy packages (#10833)
- Treat version mismatch errors as non-fatal in fast paths (#10860)
- Mark
--locked
and--upgrade
are conflicting (#10836) - Relax error checking around unconditional enabling of conflicting extras (#10875)
- Error when workspace contains conflicting Python requirements (#10841)
- Improve uvx error message when uv is missing (#9745)
- Include version and contact information in GitHub User Agent (#10785)
- Add fast-path for recursive extras in dynamic validation (#10823)
- Fetch
pyproject.toml
from GitHub API (#10765) - Remove allocation in Git SHA truncation (#10801)
- Skip GitHub fast path when full commit is already known (#10800)
- Add fallback to build backend when
Requires-Dist
mismatches (#10797) - Avoid deserialization error for paths above the root (#10789)
- Avoid respecting preferences from other indexes (#10782)
- Disable the distutils setuptools shim during interpreter query (#10819)
- Omit variant when detecting compatible Python installs (#10722)
- Remove TOCTOU errors in Git clone (#10758)
- Validate metadata under GitHub fast path (#10796)
- Include conflict markers in fork markers (#10818)
- Add tag incompatibility hints to sync failures (#10739)
- Improve log when distutils is missing (#10713)
- Show non-critical Python discovery errors if no other interpreter is found (#10716)
- Use colors for lock errors (#10736)
- Add testing instructions to the AWS Lambda guide (#10805)
- Avoid building dynamic versions when validating lockfile (#10703)
- Add
UV_VENV_SEED
environment variable (#10715)
- Store unsupported tags in wheel filename (#10665)
- Avoid attempting to patch macOS dylib for non-macOS installs (#10721)
- Avoid narrowing
requires-python
marker with disjunctions (#10704) - Respect environment variable credentials for indexes outside root (#10688)
- Respect preferences for explicit index dependencies from
requirements.txt
(#10690) - Sort preferences by environment, then index (#10700)
- Ignore permission errors when looking for user-level configuration file (#10697)
- Add
SyntaxWarning
compatibility note to bytecode compilation docs (#10701) - Add
MACOSX_DEPLOYMENT_TARGET
to the--python-platform
documentation (#10698)
- Avoid failing when deserializing unknown tags (#10655)
- Filter wheels from lockfile based on architecture (#10584)
- Omit dynamic versions from the lockfile (#10622)
- Add support for
pip freeze --path
(#10488) - Reduce verbosity of inline-metadata message when using
uv run <script.py>
(#10588) - Add opt-in Git LFS support (#10335)
- Recommend
--native-tls
on SSL errors (#10605) - Show expected and available ABI tags in resolver errors (#10527)
- Show target Python version in error messages (#10582)
- Add
--output-format=json
support touv python list
(#10596)
The managed Python distributions have been updated, including:
- Python 3.14 support on Windows
- Python 3.14.0a4 support
- 64-bit RISC-V Linux support
- Bundled
libedit
updated from 20210910-3.1 -> 20240808-3.1 - Bundled
tcl/tk
updated from 8.6.12 -> 8.6.14 (for all Python versions on Unix, only for Python 3.14 on Windows)
See the python-build-standalone
release notes for more details.
- Avoid allocating when stripping source distribution extension (#10625)
- Reduce
WheelFilename
to 48 bytes (#10583) - Reduce distribution size to 200 bytes (#10601)
- Remove
import re
from entrypoint wrapper scripts (#10627) - Shrink size of platform tag enum (#10546)
- Use
ArcStr
in verbatim URL (#10600) - Use
memchr
for wheel parsing (#10620)
- Avoid reading symlinks during
uv python install
on Windows (#10639) - Correct Pyston tag format (#10580)
- Provide
pyproject.toml
path for parse errors inuv venv
(#10553) - Don't treat
setuptools
andwheel
as seed packages in uv sync on Python 3.12 (#10572) - Fix git-tag cache-key reader in case of slashes (#10467) (#10500)
- Include build tag in rendered wheel filenames (#10599)
- Patch embedded install path for Python dylib on macOS during
python install
(#10629) - Read cached registry distributions when
--config-settings
are present (#10578) - Show resolver hints for packages with markers (#10607)
- Add meta titles to documents in guides, excluding integration documents (#10539)
- Remove
build-system
from example workspace rot (#10636)
- Make build backend type annotations more generic (#10549)
- Avoid forking for identical markers (#10490)
- Avoid panic in
uv remove
when only comments exist (#10484) - Revert "improve shell compatibility of venv activate scripts (#10397)" (#10497)
This release includes support for generating lockfiles from scripts based on inline metadata, as defined in PEP 723.
By default, scripts remain unlocked, and must be locked explicitly with uv lock --script /path/to/script.py
, which
will generate a lockfile adjacent to the script (e.g., script.py.lock
). Once generated, the lockfile will be
respected (and updated, if necessary) across uv run --script
, uv add --script
, and uv remove --script
invocations.
This release also includes support for uv export --script
and uv tree --script
. Both commands support PEP 723
scripts with and without accompanying lockfiles.
- Add support for locking PEP 723 scripts (#10135)
- Respect PEP 723 script lockfiles in
uv run
(#10136) - Update PEP 723 lockfile in
uv add --script
(#10145) - Update PEP 723 lockfile in
uv remove --script
(#10162) - Add
--script
support touv export
for PEP 723 scripts (#10160) - Add
--script
support touv tree
for PEP 723 scripts (#10159) - Add
ls
alias touv {tool, python, pip} list
(#10240) - Allow reading
--with-requirements
from stdin inuv add
anduv run
(#10447) - Warn-and-ignore for unsupported
requirements.txt
options (#10420)
- Add remaining Python type annotations to build backend (#10434)
- Avoid allocating for names in the PEP 508 parser (#10476)
- Fetch concurrently for non-first-match index strategies (#10432)
- Remove unnecessary
.to_string()
call (#10419) - Respect sentinels in package prioritization (#10443)
- Use
ArcStr
for marker values (#10453) - Use
ArcStr
for package, extra, and group names (#10475) - Use
matches!
rather thancontains
inrequirements.txt
parsing (#10423) - Use faster disjointness check for markers (#10439)
- Pre-compute PEP 508 markers from universal markers (#10472)
- Fix
UV_FIND_LINKS
delimiter to split on commas (#10477) - Improve
uv tool list
output when tool environment is broken (#10409) - Only track markers for compatible versions (#10457)
- Respect
requires-python
when installing tools (#10401) - Visit proxy packages eagerly (#10441)
- Improve shell compatibility of
venv
activate scripts (#10397) - Read publish username from URL (#10469)
- Add Lambda layer instructions to AWS Lambda guide (#10411)
- Add
uv lock --script
to the docs (#10414) - Use Windows-specific instructions in Jupyter guide (#10446)
- Accept full requirements in
uv remove
(#10338)
- Avoid over-counting versions in batch prefetcher (#10350)
- Deactivate tracing for version-choosing (#10351)
- Force a niche into
VersionSmall
(#10385) - Optimize
requirements_for_extra
(#10348) - Re-enable
zlib-ng
on x86 platforms (#10365) - Re-enable zlib-ng on all platforms (except s390x, PowerPC, and FreeBSD) (#10370)
- Remove
[u64; 4]
from small version to moveArc
to full version (#10345) - Shrink
Dist
from 352 to 288 bytes (#10389) - Speed up file pins by removing nested hash map (#10346)
- Buffer file reads in
serde_json::from_reader
(#10341)
- Avoid enforcing project-level required version for
uv self
(#10374) - Fix Ruff linting warnings from generated template files for extension modules (#10371)
- Add AWS Lambda integration guide (#10278)
The managed Python distributions have been updated, including:
- Python 3.14.0a3 support on macOS and Linux
- Performance improvements
- Fixes to SQLite feature detection
See the python-build-standalone
release notes for more details.
- Respect
FORCE_COLOR
environment variable (#10315)
- Avoid generating unused hashes during
uv lock
(#10307) - Visit source distributions before wheels (#10291)
- Avoid downgrading packages when
--upgrade
is provided (#10097) - Extract supported architectures from wheel tags (#10179)
- Redact new index credentials in
uv add
(#10329)
- Clarify
exclude-newer
only allows full timestamps in settings documentation (#9135) - Tweak script
--no-project
comment (#10331) - Update copyright year (#10297)
- Add instructinos for installing with Scoop (#10332)
- Add
--exact
flag touv run
(#10198) - Add
--outdated
support touv pip tree
(#10199) - Add a required version setting to uv (#10248)
- Add loongarch64 to supported Python platform tags (#10223)
- Add manylinux2014 aliases for
--python-platform
(#10217) - Add support for Python interpreters on ARMv5TE platforms (#10234)
- Add support for optional
--description
inuv init
(#10209) - Ignore empty or missing hrefs in Simple HTML (#10276)
- Patch pkgconfig files after Python install (#10189)
- Actually use jemalloc as alternative allocator (#10269)
- Parse URLs lazily in resolver (#10259)
- Use
BTreeMap::range
to avoid iterating over unnecessary versions (#10266)
- Accept directories with space names in
uv init
(#10246) - Avoid forking on version in non-universal resolutions (#10274)
- Avoid stripping query parameters from URLs (#10253)
- Consider workspace dependencies to be 'direct' (#10197)
- Detect cyclic dependencies during builds (#10258)
- Guard against self-deletion in
uv venv
anduv tool
(#10206) - Respect static metadata for already-installed distributions (#10242)
- Avoid enforcing URL check on initial publish (#10182)
- Fix incorrect mismatched constraints reference (#10184)
- Revert "Update
reqwest
(#10178)" (#10187)
- Support
uv export
for non-project workspaces (#10144) - Set glibc versions for standalone installers (#10142)
- Allow environment variables to be included in cache keys (#10170)
- Include extras in
uv-build
Requires-Dist
metadata (#10110) - Use
shutil.which
for the build backend (#10028)
- Always write slash paths to RECORD file (#10164)
- Add support for subdirectories in direct URLs in
uv.lock
(#10068) - Avoid duplicating backslashes in sysconfig parser (#10063)
- Avoid erroring when subdirectories are provided in
uv add
(#10095) - Backtrack to non-local versions when wheels are missing platform support (#10046)
- Fix mirror script to handle newer metadata format (#10050)
- Preserve sort when deciding on requirement placement (#10078)
- Remove redundant alias in
uv init
CLI (#10124) - Respect sources credentials in non-project workspaces (#10125)
- Show non-project dependencies in
uv tree
(#10149) - Strip fragment when storing direct URL (#10093)
- Include hashes for local source archives (#10080)
- Fix invalid syntax in some sources examples (#10127)
- Normalize
platform_system
tosys_platform
(#9949) - Improve retry mechanisms on Windows for
copy_atomic
andwrite_atomic
(#10026) - Add nuance to prefetch logging (#9984)
- Update to
python-build-standalone 20241219
- Build backend: Preserve executable bits for scripts in distributions (#10027)
- Build backend: Handle case where
metadata_directory
already containsdist-info
directory (#10005)
- Batch resolver pre-fetches per fork (#10029)
- Allow
--script
to be provided withuv run -
(#10035) - Allow
uv run
arguments when reading fromstdin
(#10034) - Prefer higher Python lower-bounds when forking (#10007)
- Remove references to deprecated
first-match
(#10036)
- Add
uv python install --preview
to the documentation (#10010) - Fix
uv python install --default
note about multiple requests (#10011) - Fix typo in Caching docs (#10032)
- Remove remaining references to deprecated
first-match
(#10038) - Supplement missing separators for
UV_INSTALL_DIR
directions on Windows (#9507)
- Improve backtracking behavior when packages conflict repeatedly (#9843)
- Patch Python
sysconfig
values such asAR
atar
install time (#9905) - Patch Python
sysconfig
values such asclang
tocc
at install time (#9916) - Skip
--native-tls
inpip compile
header (#9913) - Add resolver error hint for no-binary and no-build failures (#9948)
- Improve build error messages (#9660)
- Reduce redundant Python version incompatibilities in resolver error message (#9957)
- Reduce redundant enumeration of all package versions in some resolver errors (#9885)
- Improve display of ranges when pre-releases are not allowed (#9944)
- Improve error messages for
uv remove
(#9959) - Improve phrasing for single term incompatibilities (#9953)
- Improve styling of
uv remove
dependency hints (#9960) - Omit trailing zeros on Python requirements inferred from versions (#9952)
- Show a concise error message for missing
version
field (#9912) - Use the build options value to improve hints for no wheel / source distribution errors (#9950)
- Allow multiple disjoint URLs in overrides (#9893)
- Include explicit indexes in publish index choice (#9932)
- Fix Python interpreter detection for 32-bit operating systems on 64-bit hosts (#9970)
- Fix typo "operation system" (#9971)
- Clarify uninstallation docs (#9938)
- Add a note to say that dependencies between workspace members are editable (#9363)
- Correctly document default value of
fork-strategy
setting (#9931) - Use double quotes for Windows support in examples (#9946)
- Remove
pypy
from top-level pin example (#9896) - Update references to
python-build-standalone
to reflect the transferred project (#9977) - Use a different Ruff version in documentation (#9943)
- Change example so it works as-is on
powershell
andcmd.exe
(#9903) - Clarify best practice for Python matrix strategy in GitHub Actions (#9454)
- Add documentation for
uv-lock
anduv-export
pre-commit hooks (#9872)
- Build backend: Fix pre-PEP 639 license files (#9965)
- Fork version selection based on
requires-python
requirements (#9827) - Patch
sysconfig
data at install time (#9857) - Remove
-isysroot
when patching sysconfig (#9860)
- Avoid
panic!()
when current directory does not exist (#9876) - Avoid reusing interpreter metadata when running under Rosetta (#9846)
- Avoid trailing slash when deserializing from lockfile (#9848)
- Fix bug in terms when collapsing unavailable versions in resolver errors (#9877)
- Fix suggestion to use
uv help python
on invalid install requests (#9820) - Skip root when assessing prefix viability (#9823)
- Avoid spurious 'Upgraded tool environment' in
uv tool upgrade
(#9870)
- Upgrade minimum Rust version to 1.83 (#9815)
- Document the
--fork-strategy
setting (#9887)
- Build backend: Allow underscores in entrypoints (#9825)
This release does not include the powerpc64le-unknown-linux-musl
target due to a build issue. See #9793 for details. If this change affects you, please file an issue with your use-case.
- Omit empty resolution markers in lockfile (#9738)
- Add
--install-dir
to touv python install
anduninstall
commands (#7920) - Add
--show-urls
and--only-downloads
touv python list
(#8062) - Add
uv python list --all-arches
(#9782) - Add
uv run --gui-script
flag for running Python scripts withpythonw.exe
(#9152) - Allow
--gui-script
on Unix (#9787) - Allow download of Python distribution variants optimized for newer x86_64 microarchitectures (#9781)
- Allow execution of
pyw
files on Unix (#9759) - Allow users to specify URLs in
project.dependencies
andtool.uv.sources
(#9718) - Encode mutually-incompatible pairs of markers (#9444)
- Improve the error message when a Python install request is not valid (#9783)
- Preserve directory-level standalone build symlinks (#9723)
- Add support for
uv publish --index <name>
(#9694) - Reframe
--locked
and--frozen
as--check
operations foruv lock
(#9662) - Rename Python install scratch directory from
.cache
->.temp
(#9756) - Enable
uv tool uninstall uv
on Windows (#8963) - Improve self-dependency hint to make shadowing clear (#9716)
- Refactor unavailable metadata to shrink the resolver (#9769)
- Show 'depends on itself' for proxy packages (#9717)
- Show a dedicated error for missing subdirectories (#9761)
- Show a dedicated hint for missing
git+
prefixes (#9789)
- Eagerly error when parsing
pyproject.toml
requirements (#9704) - Use copy-on-write when normalizing paths (#9710)
- Avoid enforcing non-conflicts in
uv export
(#9751) - Don't drop comments between items in TOML tables (#9784)
- Don't fail with
--no-build
when static metadata is available (#9785) - Don't filter non-patch registry version (#9736)
- Don't read metadata from stale
.egg-info
files (#9760) - Enforce correctness of self-dependencies (#9705)
- Fix projects's typo in resolver error messages (#9708)
- Ignore
.
prefixed directories during managed Python installation discovery (#9786) - Improve handling of invalid virtual environments during interpreter discovery (#8086)
- Normalize relative paths when
--project
is specified (#9709) - Respect self-constraints on recursive extras (#9714)
- Respect user settings for tracing coloring (#9733)
- Retry on tar extraction errors (#9753)
- Add conflict markers to the lock file (#9370)
- De-duplicate resolution markers (#9780)
- Avoid 403 error hint for PyTorch URLs (#9750)
- Avoid treating non-existent
--find-links
as relative URLs (#9720) - Omit Windows Store
python3.13.exe
et al (#9679) - Replace executables with broken symlinks during
uv python install
(#9706)
- Fix build failure links (#9740)
- Ignore dynamic version in source dist (#9549)
- Improve build frontend error handling (#9611)
- Un-hide
uv build --no-build-logs
option (#9642) - Flag version mismatch between sdist and wheel during
uv build
(#9633) - Improve message when updater receipt is for a different uv executable (#9487)
- Add environment variable to disable writing installer metadata files (#8877)
- Add managed downloads for the latest CPython releases:
3.9.21
,3.10.16
,3.11.11
,3.12.8
, and3.13.1
(#9696)
- Build backend: Add hint on import with preview disabled (#9691)
- Build backend: Add direct builds to the resolver and installer (#9621)
- Build backend: Add integration test for scripts (#9635)
- Build backend: Add template to
uv init
(#9661) - Build backend: Add
--list
option (#9610)
- Create missing parent directories for output file of
uv export
/uv pip compile
(#9648) - Fix missing display of non-freethreaded Python 3.13 in
python list
(#9669) - Implement
Ord
andPartialOrd
without origin forRequirement
(#9624) - Include more sources to avoid lowest bound warning (#9644)
- Respect build tag priority in
uv.lock
(#9677)
- Add
build-essentials
note to build failures doc (#9641) - Add entry-point for distroless image in GitLab documentation (#9093)
- Add documentation for
uv python pin
without aREQUEST
argument (#9631) - Add a link to
uv python pin
reference docs (#9630)
- Add
--dry-run
touv pip uninstall
(#9557) - Allow
--constraints
and--overrides
inuv tool install
(#9547) - Display removed Python executables on uninstall (#9459)
- Warn when keyring has no password for
uv publish
(#8827) - Add suggested action when
.python-version
pin is incompatible with the project (#9590) - Improve error messages for mismatches in
tool.uv.sources
(#9482) - Use constraints in trace rather than irrelevant
requires-python
(#9529)
- Add
uv python install --default
(#8650) - Fix Python executable installation when multiple patch versions are requested (#9607)
- Build backend: Revamp
include
/exclude
(#9525) - Build backend: Add fast path (#9556)
- Build backend: Add functions to collect file list (#9602)
- Build backend: Default excludes (#9552)
- Build backend: Refactoring before list (#9558)
- Build backend: Warn when visiting over 10k files (#9523)
- Make
check-url
available in configuration files (#9032)
- Avoid adding non-extra package with extra dependencies (#9540)
- Avoid cloning
String
in marker evaluation (#9598)
uv-pep508
: Add more methods for simplifyingextra
-related expressions (#9469)
- Allow
file:
URLs to include package names (#9493) - Avoid using IDs across PubGrub states (#9538)
- Consistently enforce requested-vs.-built metadata when retrieving wheels (#9484)
- Do not show empty version specifier in
uv tool list
(#9605) - Include Git member information when getting metadata from cache (#9388)
- Include base installation directory in uv run PATH (#9585)
- Insert backslash when appending to system drive (#9488)
- Normalize paths when lowering Git dependencies (#9595)
- Omit origin when comparing requirements (#9570)
- Override
manylinux_compatible
with--python-platform
(#9526) - Pass extra when evaluating lockfile markers (#9539)
- Propagate markers for recursive extras in resolver (#9509)
- Respect path dependencies within Git dependencies (#9594)
- Support recursive extras with marker in
pip compile -r pyproject.toml
(#9535) - Don't emit unpinned warning for proxy packages (#9497)
- Fix
--refresh-package
flag mentioned as--refresh-dependency
(#9486) - Handle Windows AV/EDR file locks during script installations (#9543)
- Re-enable conflicting extra/group tests and fix regression from #9540 (#9582)
- Add missing word to docs for
run.md
(#9527) - Add policies reference section and license document (#9367)
- Fix typo in entry point docs (#9491)
- Fix up version in prior uninstall instructions (#9485)
- Mention
uv pip
behavior in build system note (#9586) - Update build failures document (#9584)
- Correct wording for multiple sources section (#9504)
- Add aliases for build backend requests (#9294)
- Avoid displaying empty paths (#9312)
- Allow constraints in
uv tool upgrade
(#9375) - Remove conflict between
--no-sync
and--frozen
inuv run
(#9400) - Respect dependency sources in overrides and constraints (#9455)
- Show an interpreter-focused message for
--target
and--prefix
(#9373) - Add
--no-extra
flag and setting (#9387) - Add
uv export --prune
(#9389) - Add dedicated error message for musl install attempts (#9430)
- Add various grammar changes to conflict error messages (#9369)
- Annotate default groups in conflict error messages (#9368)
- Report marker diagnostics during parsing, rather than evaluation (#9338)
- Use consistent formatting for build system errors (#9340)
- Use rich diagnostics for build failures (#9335)
- Improve build backend excludes (#9281)
- Include PEP 639
license-files
metadata duringuv publish
(#9442)
- Allow dependency groups to include the containing package (#9385)
- Allow syncing to empty virtual environment directories (#9427)
- Allow system Python discovery with
--target
and--prefix
(#9371) - Don't warn when
--output-file
is empty (#9417) - Fix Python interpreter discovery on non-glibc hosts (#9005)
- Fix
tool.uv.dependency-metadata.[].version
schema (#9468) - Only respect preferences across the same indexes (#9302)
- Re-compile when
--compile
is passed to an install operation (#9378) - Remove
--upgrade
,--no-upgrade
, and--upgrade-package
fromuv tool upgrade
(#9318) - Remove dev dependencies in
--all-groups --no-dev
(#9300) - Surface extras and group conflicts in
uv export
(#9365) - Treat deprecated aliases as equivalent in marker algebra (#9342)
- Treat less compatible tags as lower priority in resolver (#9339)
- Avoid referencing
scikit-build
(instead ofscikit-build-core
) (#9320) - Expand entry points documentation (#9329)
- Fix example
pyproject.toml
in project concept documentation (#9298) - Fix header level of "Conflicting dependencies" page (#9330)
- Touch-up the extension module guide (#9293)
- Update the dependencies documentation (#9359)
- Reference
--no-progress
option in related environment variable (#9357)
- Accept either singular or plural values for CLI requirements (#9196)
- Add
--all-groups
touv sync
,uv run
,uv export
, anduv tree
(#8892) - Add a progress bar to
uv tree --outdated
anduv pip list --outdated
(#9284) - Add retries for Python downloads (#9274)
- Use exponential backoff for publish retries (#9276)
- Add manylinux target triples up to glibc 2.40 (#9234)
- Avoid validating extra and group sources in
build-system.requires
(#9273) - Catch retries with wrapped
reqwest
errors (#9253) - Sort hashes in
uv export
output (#9237) - Strip
--index
and--default-index
from command header (#9288)
- Add breadcrumbs to the documentation (#9242)
- Add minimum version to PyTorch guide (#9247)
- Add support for anchor redirects with client-side js (#9212)
- Improve content on project configuration (#9235)
- Improve the project creation documentation (#9236)
- Move the integration guides into the "Guides" section as a collapsed group (#9245)
- Reorganize the project concept documentation (#9121)
- Use the full screen height for the main content to stabilize the nav (#9153)
- Add dedicated warning for empty stdin (#9256)
This release includes support for conflicting optional dependencies and dependency groups in the uv resolver, including the ability to specify dependency sources (like index assignment) on a per-extra or per-group basis.
For example, you can now select CPU-only vs. GPU-enabled PyTorch builds at runtime by defining conflicting extras in a pyproject.toml
, and assigning different extras to different PyTorch indexes:
[project]
name = "project"
version = "0.1.0"
requires-python = ">=3.12.0"
[project.optional-dependencies]
# Include `torch` whenever `--extra cpu` or `--extra gpu` is provided.
cpu = ["torch>=2.5.1"]
gpu = ["torch>=2.5.1"]
[tool.uv]
# But allow `cpu` and `gpu` to choose conflicting versions of `torch`.
conflicts = [[{ extra = "cpu" }, { extra = "gpu" }]]
[tool.uv.sources]
torch = [
# With `--extra cpu`, pull PyTorch from the CPU-only index.
{ index = "pytorch-cpu", extra = "cpu", marker = "platform_system != 'Darwin'" },
# With `--extra gpu`, pull PyTorch from the GPU-enabled index.
{ index = "pytorch-gpu", extra = "gpu" },
]
[[tool.uv.index]]
name = "pytorch-cpu"
url = "https://download.pytorch.org/whl/cpu"
explicit = true
[[tool.uv.index]]
name = "pytorch-gpu"
url = "https://download.pytorch.org/whl/cu124"
explicit = true
See the PyTorch documentation for more.
- Allow conflicting extras in explicit index assignments (#9160)
- Support overrides and constraints in PEP 723 scripts (#9162)
- Update
uv tool install --force
to imply--reinstall-package <name>
(#9074) - Turn
--verify-hashes
on by default (#9170)
- Enable
zlib-rs
on all platforms (#9202)
- Allow apostrophe in virtual environment name (#8984)
- Automatically retry body errors when processing response (#9213)
- Detect nested workspace inside the current workspace and members with identical names (#9094)
- Only install the specified project with
--frozen --package
in legacy non-[project]
workspaces (#9215) - Respect
[[tool.uv.index]]
in PEP 723 scripts (#9208) - Show derivation markers for resolutions with project name (#9136)
- Sort distributions when computing hash (#9185)
- Include trampolines in source distributions on Windows (#9172)
- Add
--index <name>=<url>
syntax to index documentation (#9139) - Add documentation for using uv with PyTorch (#9210)
- Add a dedicated error for
include = "dev"
withtool.uv.dev-dependencies
(#9173) - Avoid showing disjoint marker error with
true
(#9169) - Improve error message when
git
is not found (#9206) - Include extras and dependency groups in derivation chains (#9113)
- Include version constraints in derivation chains (#9112)
- Hide
--no-system
fromuv pip tree
CLI (#9040) - Allow configuration of Python and PyPy install mirrors in
uv.toml
(#8695) - Allow passing Python download mirrors to
uv python install
(#8695) - Add support for specifying conflicting extras and dependency groups (#8976, #9096)
- Consistent colon usage in build failure errors (#8994)
- Show full derivation chain when encountering build failures (#9108)
- Show link we failed on parsing index pages (#9118)
- Remove duplicate log when searching for interpreters (#9092)
- Update uv development status classifier to "Stable" on PyPI (#8943)
- Use rich diagnostic formatting for early build failures (#9041)
- Use rich diagnostic formatting for install failures (#9043)
- Avoid retraversing filesystem when testing exact glob matches (#9022)
- Allow
--no-build
to validate lock (#9024) - Allow default indexes to be marked as explicit (#8990)
- Avoid creating
.venv
inuv add --frozen
anduv add --no-sync
(#8980) - Avoid duplicating first-entry comments in
uv add
(#9109) - Defer reporting of build failures in resolver (#9098)
- Fix references to
--resolution-strategy
in error message output (#8971) - Ignore virtual environments in parent directories when choosing Python version for new projects (#9075)
- Forward SIGTERM to child processes in
uv run
(#8933) - Prefer Python executable names that match the request over default names (#9066)
- Prefer compatible to incompatible distributions when packages exist on multiple indexes (#8961)
- Publish: Ignore non-matching files (#8986)
- Revert
uv.lock
changes whenuv add
fails (#9030) - Show file extensions on available commands when not
.exe
(#9099) - Sort by name, then specifiers in
uv add
(#9097) - Split after specifiers in
--with
requirements (#9089) - Support multiple extras in universal pip compile output (#8960)
- Build backend: Add tests for source tree -> source dist -> wheel conversions (#9091)
- Build backend: Switch to custom
glob-walkdir
implementation (#9013) - Build backend: Add minimal wheel settings (#9085)
- Add wget instructions for systems without curl (#8630)
- Fix
.env
file example in docs (#9064) - Fix reference to
--resolution
in docs (#8968) - Fix typo in GitLab integration docs (#9047)
- Update format of environment variable reference (#9018)
- Use Python syntax for
value_type
consistently (#9017) - Use
[[index]]
API in configuration example (#9065) - Mention how to use extras (#8972)
- Add some words about specifying conflicting extras/groups (#9120)
- Allow installation of manylinux wheels on
riscv64
(#8934)
- Build source distributions at top-level of cache (#8905)
- Allow non-registry dependencies in
uv pip list --outdated
(#8939) - Compute superset of existing and required hashes when healing cache (#8955)
- Enable uv to replace and delete itself on Windows (#8914)
- Remove source distribution filename from cache (#8907)
- Respect
--index-url
inuv pip list
(#8942) - Respect comma-separated extras in
--with
(#8946)
- Add uninstall note for previous versions (#8937)
- Remove some missed references to
~/.cargo/bin
(#8936) - Split README's install code block into 3 (#8853)
Since the launch of Python version, project, and tool management capabilities back in August, we've seen extraordinary adoption of uv. We've been iterating rapidly: adding new features, fixing bugs, and improving the user experience. Despite moving quickly, stability and compatibility have been a major focus — we've made thirty releases since our last breaking change. Consequently, we've accumulated various changes that improve correctness and user experience, but could break some workflows. This release contains those changes; many have been marked as breaking out of an abundance of caution. We expect most users to be able to upgrade without making changes.
-
Use base executable to set virtualenv Python path (#8481)
Previously, uv canonicalized the path to the Python executable when setting the Python path in created virtual environments. This behavior had several undesirable effects: it would bypass stabilized version directories (as constructed by Homebrew) and it was not consistent with the Python standard library's behavior. Now, uv uses the
sys._base_executable
path. -
Use XDG (i.e.
~/.local/bin
) instead of the Cargo home directory in the installer (#8420)Previously, uv's installer used
$CARGO_HOME
or~/.cargo/bin
for its target install directory. It's been a longstanding complaint that uv uses this directory, as there's no relationship to Cargo. Now, uv will be installed into$XDG_BIN_HOME
,$XDG_DATA_HOME/../bin
, or~/.local/bin
(in that order). Note that$UV_INSTALL_DIR
can always be used to override the target directory. -
Discover and respect
.python-version
files in parent directories (#6370)Previously, uv only read
.python-version
files from the working directory. Now, uv will check parent directories for.python-version
files; however uv will not search for.python-version
files beyond project boundaries. The new behavior is better aligned with that ofpyenv
and Rye. -
Error when disallowed settings are defined in
uv.toml
(#8550)Some settings can only be defined in the
pyproject.toml
. Previously, uv would ignore these settings when present in theuv.toml
. Now, uv will error to avoid confusion about why the settings are not respected. -
Implement PEP 440-compliant local version semantics (#8797)
Previously, uv's implementation of local versions (e.g.
2.0+cpu
) was not compliant with the specification due to the technical complexity of implementing the local version semantics in the PubGrub algorithm. Thanks to the work of @ericmarkmartin, uv now has a spec-compliant implementation. Namely, uv will now allow a request fortorch==2.1.0
to installtorch@2.1.0+cpu
regardless of whethertorch@2.1.0
(without a local tag) actually exists. -
Treat the base Conda environment as a system environment (#7691)
Previously, uv would not distinguish between the base and other Conda environments. Now, uv uses
CONDA_DEFAULT_ENV
and the namesbase
anddefault
to determine if an environment active viaCONDA_PREFIX
is the base environment. If the base environment is active, the--system
flag must be used to mutate it. -
Do not allow pre-releases when the
!=
operator is used (#7974)Previously, uv would use the presence of a pre-release specifier in a version specifier as an opt-in to allow pre-release versions during resolution. The new behavior does not allow pre-releases when an inequals operator is used, e.g.,
!= 2.0a1
. -
Prefer
USERPROFILE
overFOLDERID_Profile
when selecting a home directory on Windows (#8048)This change is a side-effect of switching from the
directories
crate toetcetera
for determining canonical system paths. IfUSERPROFILE
is not set, the behavior will be unchanged. -
Improve interactions between color environment variables and CLI options (#8215)
Previously, uv would respect the
FORCE_COLOR
andNO_COLOR
environment variables over the--color
flag. Now, when the--color
flag is explicitly provided, uv will respect it over the environment variables. -
Make
allow-insecure-host
a global option (#8476)Previously, this option was only available in some parts of uv. Now,
--allow-insecure-host
can be provided to any command. For consistency, theallow-insecure-host
setting has been removed from the[tool.uv.pip]
configuration in favor of[tool.uv]
. -
Only write
.python-version
files duringuv init
for workspace members if the version differs (#8897)Previously, uv would create a
.python-version
file for workspace members duringuv init
. Now, uv will only do so if the version differs from the.python-version
file in the workspace root since uv will respect.python-version
files in parent directories.
- Add
uv tree --outdated
(#8893) - Add armv8l alias for armv7l to support arm 32-bit compatibility mode (#8881)
- Add support for
pip list --outdated
(#8872) - Allow semicolons directly after direct URLs (#8836)
- Enable support for arbitrary git transports (#8769)
- Improve Python discovery source messages (#8890)
- Show dedicated error for trailing
;
on URL and path requirements (#8835) - Add progress bar for
uv cache clean
(#8857) - Warn on failure to query system configuration file (#8829)
- Add support for building basic source distributions with the experimental uv build backend (#8886)
- Respect dynamic version updates in
uv lock
(#8867) - Respect fork markers in
--resolution-mode=lowest-direct
(#8839)
- Add further examples of git+https support (#8841)
- Add installer variables to environment reference (#8874)
- Add note on private classifier (#8783)
- Update pip-and-uv strictness example (#8822)
- Fix
uv python install
docs to use an existing PyPy version (#8845) - Document how to mimic
--verbose
withRUST_LOG
(#8858)