Skip to content

Pack HTTP cache policy flags and optional integers - #22135

Merged
charliermarsh merged 1 commit into
charlie/0.13-windows-wheel-cache-lock-keyfrom
charlie/0.13-compact-http-cache-policy
Oct 1, 2026
Merged

charliermarsh merged 1 commit into
charlie/0.13-windows-wheel-cache-lock-keyfrom
charlie/0.13-compact-http-cache-policy

Conversation

@charliermarsh

Copy link
Copy Markdown
Member

Reapplies #22078 for 0.13.

We store the same HTTP cache information in fewer bytes, without changing cache freshness or revalidation behavior.

  • Booleans become bits. Ten fields like no_cache, no_store, and immutable each occupied a byte. We pack them into bits of one integer.
  • Optional numbers share their presence flags. Each archived Option<u64> occupies 16 bytes: the number, an indicator of whether it exists, and alignment padding. We store the numbers together and use one bit per number to indicate whether it exists.

For example, max_age = None and max_age = Some(0) both store the number 0, but their presence bits differ. Getters reconstruct the normal Option<u64>.

We apply this to cache-control directives and response timestamps. The fixed archived policy shrinks from 320 to 200 bytes. We use bitflags for typed flag operations and retain endian-aware integers in the archived representation.

The cache bucket bumps cover the new representation.

We store the same HTTP cache information in fewer bytes, without
changing cache freshness or revalidation behavior.

- **Booleans become bits.** Ten fields like `no_cache`, `no_store`, and
`immutable` each occupied a byte. We pack them into bits of one integer.
- **Optional numbers share their presence flags.** Each archived
`Option<u64>` occupies 16 bytes: the number, an indicator of whether it
exists, and alignment padding. We store the numbers together and use one
bit per number to indicate whether it exists.

For example, `max_age = None` and `max_age = Some(0)` both store the
number `0`, but their presence bits differ. Getters reconstruct the
normal `Option<u64>`.

We apply this to cache-control directives and response timestamps. The
fixed archived policy shrinks from **320 to 200 bytes**. We use
`bitflags` for typed flag operations and retain endian-aware integers in
the archived representation.

The cache bucket bumps cover the new representation.

(cherry picked from commit f4f42c3)
@charliermarsh
charliermarsh added this pull request to stack #22137 October 1, 2026 16:40
@charliermarsh
charliermarsh merged commit 26eec53 into release/0.13.0 Oct 1, 2026
85 of 86 checks passed
@charliermarsh
charliermarsh deleted the charlie/0.13-compact-http-cache-policy branch October 1, 2026 16:49
@codspeed

codspeed Bot commented Oct 1, 2026

Copy link
Copy Markdown

Merging this PR will improve performance by 5.64%

⚡ 1 improved benchmark
✅ 52 untouched benchmarks
⏩ 47 skipped benchmarks1

Performance Changes

Mode Benchmark BASE HEAD Efficiency
⚡ WallTime run_python_version_synthetic_workspace 272.7 ms 258.2 ms +5.64%

Tip

Curious why performance improved? Comment @codspeedbot explain why performance improved on this PR, or directly use the CodSpeed MCP with your agent.


Comparing charlie/0.13-compact-http-cache-policy (42761b2) with main (e71ab8f)

Open in CodSpeed

Footnotes

  1. 47 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩

zanieb pushed a commit that referenced this pull request Oct 7, 2026
Reapplies #22078 for 0.13.

We store the same HTTP cache information in fewer bytes, without
changing cache freshness or revalidation behavior.

- **Booleans become bits.** Ten fields like `no_cache`, `no_store`, and
`immutable` each occupied a byte. We pack them into bits of one integer.
- **Optional numbers share their presence flags.** Each archived
`Option<u64>` occupies 16 bytes: the number, an indicator of whether it
exists, and alignment padding. We store the numbers together and use one
bit per number to indicate whether it exists.

For example, `max_age = None` and `max_age = Some(0)` both store the
number `0`, but their presence bits differ. Getters reconstruct the
normal `Option<u64>`.

We apply this to cache-control directives and response timestamps. The
fixed archived policy shrinks from **320 to 200 bytes**. We use
`bitflags` for typed flag operations and retain endian-aware integers in
the archived representation.

The cache bucket bumps cover the new representation.
zanieb pushed a commit that referenced this pull request Oct 9, 2026
Reapplies #22078 for 0.13.

We store the same HTTP cache information in fewer bytes, without
changing cache freshness or revalidation behavior.

- **Booleans become bits.** Ten fields like `no_cache`, `no_store`, and
`immutable` each occupied a byte. We pack them into bits of one integer.
- **Optional numbers share their presence flags.** Each archived
`Option<u64>` occupies 16 bytes: the number, an indicator of whether it
exists, and alignment padding. We store the numbers together and use one
bit per number to indicate whether it exists.

For example, `max_age = None` and `max_age = Some(0)` both store the
number `0`, but their presence bits differ. Getters reconstruct the
normal `Option<u64>`.

We apply this to cache-control directives and response timestamps. The
fixed archived policy shrinks from **320 to 200 bytes**. We use
`bitflags` for typed flag operations and retain endian-aware integers in
the archived representation.

The cache bucket bumps cover the new representation.
astral-automations-bot Bot pushed a commit to astral-sh/uv-dev that referenced this pull request Oct 10, 2026
Reapplies astral-sh#22078 for 0.13.

We store the same HTTP cache information in fewer bytes, without
changing cache freshness or revalidation behavior.

- **Booleans become bits.** Ten fields like `no_cache`, `no_store`, and
`immutable` each occupied a byte. We pack them into bits of one integer.
- **Optional numbers share their presence flags.** Each archived
`Option<u64>` occupies 16 bytes: the number, an indicator of whether it
exists, and alignment padding. We store the numbers together and use one
bit per number to indicate whether it exists.

For example, `max_age = None` and `max_age = Some(0)` both store the
number `0`, but their presence bits differ. Getters reconstruct the
normal `Option<u64>`.

We apply this to cache-control directives and response timestamps. The
fixed archived policy shrinks from **320 to 200 bytes**. We use
`bitflags` for typed flag operations and retain endian-aware integers in
the archived representation.

The cache bucket bumps cover the new representation.
luketainton pushed a commit to luketainton/luke_rsu that referenced this pull request Oct 10, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [ghcr.io/astral-sh/uv](https://github.com/astral-sh/uv) | stage | minor | `0.12.23` → `0.13.0` |

---

### Release Notes

<details>
<summary>astral-sh/uv (ghcr.io/astral-sh/uv)</summary>

### [`v0.13.0`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0130)

[Compare Source](astral-sh/uv@0.12.24...0.13.0)

Released on 2026-10-09.

uv 0.13.0 makes Python 3.15 the default stable Python version. We've also included several breaking changes to improve correctness, performance, and compatibility, described below.

**We expect most users to be able to upgrade without making changes.**

While not a breaking change, this release also updates the format of many of uv's cache entries to improve performance. **uv may download or rebuild dependencies after upgrading**, because some cached entries from earlier versions cannot be reused. Multiple versions of uv can still safely share the same cache directory.

There are no breaking changes to the configuration of the [uv build backend](https://docs.astral.sh/uv/concepts/build-backend/). If your `[build-system]` table includes an upper bound on `uv_build`, update it to allow `uv_build` 0.13, e.g., `uv_build>=0.13.0,<0.14`.

##### Breaking changes

- **Use Python 3.15 as the default stable version**

  The default stable Python version has changed from 3.14 to 3.15. This affects Python downloads when no version is requested or pinned, e.g., when running `uv python install`.

  uv continues to use compatible Python installations that are already present. For example, `uv venv` can still use an installed Python 3.14. If no suitable interpreter is installed and automatic downloads are enabled, commands such as `uv venv` and `uvx python` can now download Python 3.15.

  You can opt out of this behavior by requesting Python 3.14 explicitly, e.g., `uv venv --python 3.14`. For projects, use `uv python pin 3.14` to record the version in `.python-version`.

- **Honor `--require-hashes` in included constraints files** ([#&#8203;22275](astral-sh/uv#22275))

  Previously, uv ignored `--require-hashes` in constraints files included with `-c` from a requirements file. Now, uv honors the directive and requires hashes for all requirements in the installation. Installs that previously succeeded can now fail if a requirement is missing a hash.

  You cannot opt out while the directive is present. Add the missing hashes to your requirements, or remove the `--require-hashes` directive from the included constraints file if hash checking is not intended.

- **Prefer native Python on Windows ARM64** ([#&#8203;22100](astral-sh/uv#22100))

  Previously, ARM64 builds of uv preferred emulated `x86_64` Python installations because native wheel support was limited. Now, uv prefers native ARM64 (`aarch64`) interpreters across Python versions.

  This follows similar changes in [CPython](https://discuss.python.org/t/python-on-windows-arm64/104524), the official Windows [Python install manager](https://discuss.python.org/t/python-install-manager-26-4/108846), and GitHub's [actions/setup-python](https://github.com/actions/setup-python#supported-architectures).

  When a native interpreter is unavailable, uv continues to fall back to `x86_64`, then 32-bit `x86`.

  You can opt out of this behavior by setting `UV_PYTHON_ARCH=x86_64` or requesting an explicit architecture, e.g., `cpython-3.14-windows-x86_64`. If you are using `setup-uv`, you can set [`python-arch: x86_64`](https://github.com/astral-sh/setup-uv#python-architecture) instead.

- **Reject editable requirements in included constraints files** ([#&#8203;22282](astral-sh/uv#22282))

  Previously, uv silently ignored editable (`-e`) requirements in constraints files included with `-c` from a requirements file. Now, uv rejects these requirements with an error, matching [pip's behavior](https://pip.pypa.io/en/stable/user_guide/#constraints-files).

  You cannot opt out of this behavior. Move editable requirements to a requirements file passed with `-r`, or pass them directly with `--editable`, instead of including them in a constraints file.

- **Omit the distutils startup patch on Python 3.10 and later** ([#&#8203;22096](astral-sh/uv#22096))

  Previously, uv installed `_virtualenv.py` and `_virtualenv.pth` into every new virtual environment to prevent distutils configuration from changing installation paths. Now, like [`virtualenv` 21.6.0](https://github.com/pypa/virtualenv/releases/tag/21.6.0), uv omits these files on Python 3.10 and later, which already ignore the affected configuration keys. This reduces Python startup overhead. Python 3.9 and earlier retain the patch.

  You cannot opt out of this behavior. Existing virtual environments are not modified automatically. Recreate an environment with Python 3.10 or later to remove the patch.

  This stabilizes the `no-distutils-patch` preview feature.

- **Treat requirement-file option values as single paths** ([#&#8203;22290](astral-sh/uv#22290))

  Previously, uv split values passed to `--constraint`, `--override`, `--exclude`, and `--build-constraint` on spaces, even when quoted. Now, each value is treated as a single path, allowing file paths containing spaces.

  You cannot opt out of this behavior. Repeat the option to provide multiple files. For example, replace `-c "a.txt b.txt"` with `-c a.txt -c b.txt`.

  Space-separated lists in `UV_CONSTRAINT`, `UV_OVERRIDE`, `UV_EXCLUDE`, and `UV_BUILD_CONSTRAINT` remain supported.

- **Use `tar-codec` for tar archives by default** ([#&#8203;22094](astral-sh/uv#22094))

  Previously, uv used `astral-tokio-tar` to extract tar archives, build source distributions with `uv_build`, and read their metadata for `uv publish`. Now, uv uses `tar-codec`, which applies stricter validation when reading archives.

  uv may now reject archives containing hard links or unsupported tar extensions that previous versions accepted. Source distributions created by `uv_build` can also have different archive bytes and hashes.

  You can opt out of this behavior by setting `UV_LEGACY_TAR_BACKEND=1`.

  This stabilizes the `tar-codec` preview feature.

- **Reject `uv build --clear` output directories that contain a build source**
  ([#&#8203;22276](astral-sh/uv#22276))

  Previously, `uv build --clear` could delete a project or input source distribution when the
  output directory contained the source. Now, uv rejects these output directories, including
  equivalent paths reached through symlinks, before clearing any build output.

  Select an output directory that does not contain any build sources, or omit `--clear`.

##### Python

- Add CPython 3.15.0 ([#&#8203;22400](astral-sh/uv#22400))

##### Preview features

- Require hashes for build dependencies, including transitive dependencies, with `--require-build-hashes` ([#&#8203;21411](astral-sh/uv#21411))

##### Performance

- Speed up revalidation of cached HTTP responses by avoiding rewrites of unchanged payloads ([#&#8203;22130](astral-sh/uv#22130))
- Reduce allocations when reading cached HTTP responses ([#&#8203;22136](astral-sh/uv#22136))
- Reduce cache storage for HTTP policies and package records ([#&#8203;22135](astral-sh/uv#22135), [#&#8203;22133](astral-sh/uv#22133))
- Reduce allocations for cached source distribution revisions ([#&#8203;22131](astral-sh/uv#22131))

##### Bug fixes

- Fix incorrect dependency resolution when reusing source metadata with different build settings ([#&#8203;22404](astral-sh/uv#22404))
- Avoid overlong wheel cache lock filenames on Windows ([#&#8203;22134](astral-sh/uv#22134))

### [`v0.12.24`](https://github.com/astral-sh/uv/releases/tag/0.12.24)

[Compare Source](astral-sh/uv@0.12.23...0.12.24)

#### Release Notes

Released on 2026-10-08.

##### Enhancements

- Remove orphaned temporary build environments with `uv cache prune` ([#&#8203;22171](astral-sh/uv#22171))
- Accept PEP 508 marker operators directly before grouped expressions ([#&#8203;22309](astral-sh/uv#22309))
- Reject malformed requirements-file options instead of partially parsing or ignoring them ([#&#8203;22317](astral-sh/uv#22317))
- Show underlying filesystem and registry errors when managed Python uninstallation fails ([#&#8203;22362](astral-sh/uv#22362))
- Identify the invalid source URL in Python mirror errors ([#&#8203;22364](astral-sh/uv#22364))

##### Preview features

- Display preferred advisory IDs in `uv audit` reports, prioritizing PYSEC, GHSA, then CVE identifiers ([#&#8203;22292](astral-sh/uv#22292))

##### Configuration

- Support custom installation mirrors for GraalPy ([#&#8203;22269](astral-sh/uv#22269))
- Support custom installation mirrors for Pyodide ([#&#8203;22271](astral-sh/uv#22271))
- Allow `UV_NO_CACHE=false` to override `no-cache = true` in configuration ([#&#8203;22324](astral-sh/uv#22324))
- Report more precise error locations for invalid trusted-host ports and preview-feature list entries ([#&#8203;22144](astral-sh/uv#22144))

##### Performance

- Speed up later commands after creating an environment by warming its interpreter cache ([#&#8203;21304](astral-sh/uv#21304))
- Reduce code-signature verification work for ARM64 macOS releases with 16 KiB signature pages ([#&#8203;22246](astral-sh/uv#22246))
- Enforce resource limits when parsing package indexes and `--find-links` pages with `astral-html` ([#&#8203;22203](astral-sh/uv#22203))
- Reduce standalone `uv-build` executable size by 7.5% by omitting unused Zstandard support ([#&#8203;22242](astral-sh/uv#22242))
- Reduce uv's binary size by about 232 KB by simplifying configuration deserialization ([#&#8203;22144](astral-sh/uv#22144))
- Reduce Python download error formatting code size by sharing its formatter ([#&#8203;22141](astral-sh/uv#22141))

##### Bug fixes

- Verify supplied hashes even when hash presence is disabled with `--no-require-hashes` or `require-hashes = false` ([#&#8203;22369](astral-sh/uv#22369))
- Honor exact managed Python patch pins when creating script environments instead of following patch upgrades ([#&#8203;22360](astral-sh/uv#22360))
- Prevent dependency overrides and constraints from activating optional dependencies when their extras are not selected ([#&#8203;22237](astral-sh/uv#22237))
- Exclude optional dependencies from exports when their extras are activated only in incompatible environments ([#&#8203;22234](astral-sh/uv#22234))
- Give explicit `uv publish --trusted-publishing` values precedence over configuration ([#&#8203;22279](astral-sh/uv#22279))
- Allow `UV_OFFLINE=false` to override `offline = true` in configuration ([#&#8203;22283](astral-sh/uv#22283))
- Allow `UV_SYSTEM_CERTS=false` to override `system-certs = true` in configuration ([#&#8203;22291](astral-sh/uv#22291))
- Allow `uv auth login` over IPv6 loopback addresses ([#&#8203;22306](astral-sh/uv#22306))
- Resolve GitHub dependencies whose Git references contain `#` or `%` characters ([#&#8203;22281](astral-sh/uv#22281))
- Recognize existing Pyodide interpreters as satisfying Pyodide Python requests ([#&#8203;22322](astral-sh/uv#22322))
- Preserve JSON output from `uv version` and `uv self version` with a single `--quiet` flag ([#&#8203;22280](astral-sh/uv#22280))
- Preserve trailing spaces and tabs in passwords returned by subprocess keyrings ([#&#8203;22284](astral-sh/uv#22284))
- Restore wheel incompatibility hints when `WHEEL` metadata contains multiple expanded `Tag:` rows ([#&#8203;22235](astral-sh/uv#22235))
- Preserve Windows wheel-script rename errors unless a cross-drive copy fallback applies ([#&#8203;22302](astral-sh/uv#22302))
- Prevent workspace-cache assertion failures after modifying a project at the workspace root ([#&#8203;22236](astral-sh/uv#22236))
- Hide the ignored `--keyring-provider` option from `uv auth` help ([#&#8203;19520](astral-sh/uv#19520))
- Report HTTP client setup failures directly when resolving unnamed `uv tool` requirements ([#&#8203;22320](astral-sh/uv#22320))

##### Documentation

- Update Docker and AWS Lambda examples to cache dependency layers using frozen lockfiles without project manifests ([#&#8203;22172](astral-sh/uv#22172))
- Fix stale links and descriptions in Rust crate documentation ([#&#8203;22311](astral-sh/uv#22311), [#&#8203;22361](astral-sh/uv#22361))
- Fix a typo in the `required-environments` documentation ([#&#8203;22238](astral-sh/uv#22238))

#### Install uv 0.12.24

##### Install prebuilt binaries via shell script

```sh
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-installer.sh | sh
```

##### Install prebuilt binaries via powershell script

```sh
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-installer.ps1 | iex"
```

#### Download uv 0.12.24

| File                                                                                                                                                | Platform                     | Checksum                                                                                                                   |
| --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| [uv-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-apple-darwin.tar.gz)                     | Apple Silicon macOS          | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-apple-darwin.tar.gz.sha256)           |
| [uv-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-apple-darwin.tar.gz)                       | Intel macOS                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-apple-darwin.tar.gz.sha256)            |
| [uv-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-pc-windows-msvc.zip)                     | ARM64 Windows                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-pc-windows-msvc.zip.sha256)           |
| [uv-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-pc-windows-msvc.zip)                           | x86 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-pc-windows-msvc.zip.sha256)              |
| [uv-x86_64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-pc-windows-msvc.zip)                       | x64 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-pc-windows-msvc.zip.sha256)            |
| [uv-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-unknown-linux-gnu.tar.gz)           | ARM64 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-unknown-linux-gnu.tar.gz.sha256)      |
| [uv-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-unknown-linux-gnu.tar.gz)                 | x86 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-unknown-linux-gnu.tar.gz.sha256)         |
| [uv-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-powerpc64le-unknown-linux-gnu.tar.gz)   | PPC64LE Linux                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-powerpc64le-unknown-linux-gnu.tar.gz.sha256)  |
| [uv-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-riscv64gc-unknown-linux-gnu.tar.gz)       | RISCV Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-riscv64gc-unknown-linux-gnu.tar.gz.sha256)    |
| [uv-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-s390x-unknown-linux-gnu.tar.gz)               | S390x Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-s390x-unknown-linux-gnu.tar.gz.sha256)        |
| [uv-x86_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-unknown-linux-gnu.tar.gz)             | x64 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-unknown-linux-gnu.tar.gz.sha256)       |
| [uv-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-armv7-unknown-linux-gnueabihf.tar.gz)   | ARMv7 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-armv7-unknown-linux-gnueabihf.tar.gz.sha256)  |
| [uv-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-unknown-linux-musl.tar.gz)         | ARM64 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-unknown-linux-musl.tar.gz.sha256)     |
| [uv-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-unknown-linux-musl.tar.gz)               | x86 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-unknown-linux-musl.tar.gz.sha256)        |
| [uv-riscv64gc-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-riscv64gc-unknown-linux-musl.tar.gz)     | RISCV MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-riscv64gc-unknown-linux-musl.tar.gz.sha256)   |
| [uv-x86_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-unknown-linux-musl.tar.gz)           | x64 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-unknown-linux-musl.tar.gz.sha256)      |
| [uv-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-arm-unknown-linux-musleabihf.tar.gz)     | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-arm-unknown-linux-musleabihf.tar.gz.sha256)   |
| [uv-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-armv7-unknown-linux-musleabihf.tar.gz.sha256) |

#### Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify):

```sh
gh attestation verify <file-path of downloaded artifact> --repo astral-sh/uv
```

You can also download the attestation from [GitHub](https://github.com/astral-sh/uv/attestations) and verify against that directly:

```sh
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>
```

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNDguMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE0OS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJ0eXBlL2RlcGVuZGVuY2llcyJdfQ==-->

Reviewed-on: https://git.tainton.uk/repos/rsu/pulls/56
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
luketainton pushed a commit to luketainton/repos_labmcp that referenced this pull request Oct 10, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [ghcr.io/astral-sh/uv](https://github.com/astral-sh/uv) | final | minor | `0.12.23` → `0.13.0` |

---

### Release Notes

<details>
<summary>astral-sh/uv (ghcr.io/astral-sh/uv)</summary>

### [`v0.13.0`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0130)

[Compare Source](astral-sh/uv@0.12.24...0.13.0)

Released on 2026-10-09.

uv 0.13.0 makes Python 3.15 the default stable Python version. We've also included several breaking changes to improve correctness, performance, and compatibility, described below.

**We expect most users to be able to upgrade without making changes.**

While not a breaking change, this release also updates the format of many of uv's cache entries to improve performance. **uv may download or rebuild dependencies after upgrading**, because some cached entries from earlier versions cannot be reused. Multiple versions of uv can still safely share the same cache directory.

There are no breaking changes to the configuration of the [uv build backend](https://docs.astral.sh/uv/concepts/build-backend/). If your `[build-system]` table includes an upper bound on `uv_build`, update it to allow `uv_build` 0.13, e.g., `uv_build>=0.13.0,<0.14`.

##### Breaking changes

- **Use Python 3.15 as the default stable version**

  The default stable Python version has changed from 3.14 to 3.15. This affects Python downloads when no version is requested or pinned, e.g., when running `uv python install`.

  uv continues to use compatible Python installations that are already present. For example, `uv venv` can still use an installed Python 3.14. If no suitable interpreter is installed and automatic downloads are enabled, commands such as `uv venv` and `uvx python` can now download Python 3.15.

  You can opt out of this behavior by requesting Python 3.14 explicitly, e.g., `uv venv --python 3.14`. For projects, use `uv python pin 3.14` to record the version in `.python-version`.

- **Honor `--require-hashes` in included constraints files** ([#&#8203;22275](astral-sh/uv#22275))

  Previously, uv ignored `--require-hashes` in constraints files included with `-c` from a requirements file. Now, uv honors the directive and requires hashes for all requirements in the installation. Installs that previously succeeded can now fail if a requirement is missing a hash.

  You cannot opt out while the directive is present. Add the missing hashes to your requirements, or remove the `--require-hashes` directive from the included constraints file if hash checking is not intended.

- **Prefer native Python on Windows ARM64** ([#&#8203;22100](astral-sh/uv#22100))

  Previously, ARM64 builds of uv preferred emulated `x86_64` Python installations because native wheel support was limited. Now, uv prefers native ARM64 (`aarch64`) interpreters across Python versions.

  This follows similar changes in [CPython](https://discuss.python.org/t/python-on-windows-arm64/104524), the official Windows [Python install manager](https://discuss.python.org/t/python-install-manager-26-4/108846), and GitHub's [actions/setup-python](https://github.com/actions/setup-python#supported-architectures).

  When a native interpreter is unavailable, uv continues to fall back to `x86_64`, then 32-bit `x86`.

  You can opt out of this behavior by setting `UV_PYTHON_ARCH=x86_64` or requesting an explicit architecture, e.g., `cpython-3.14-windows-x86_64`. If you are using `setup-uv`, you can set [`python-arch: x86_64`](https://github.com/astral-sh/setup-uv#python-architecture) instead.

- **Reject editable requirements in included constraints files** ([#&#8203;22282](astral-sh/uv#22282))

  Previously, uv silently ignored editable (`-e`) requirements in constraints files included with `-c` from a requirements file. Now, uv rejects these requirements with an error, matching [pip's behavior](https://pip.pypa.io/en/stable/user_guide/#constraints-files).

  You cannot opt out of this behavior. Move editable requirements to a requirements file passed with `-r`, or pass them directly with `--editable`, instead of including them in a constraints file.

- **Omit the distutils startup patch on Python 3.10 and later** ([#&#8203;22096](astral-sh/uv#22096))

  Previously, uv installed `_virtualenv.py` and `_virtualenv.pth` into every new virtual environment to prevent distutils configuration from changing installation paths. Now, like [`virtualenv` 21.6.0](https://github.com/pypa/virtualenv/releases/tag/21.6.0), uv omits these files on Python 3.10 and later, which already ignore the affected configuration keys. This reduces Python startup overhead. Python 3.9 and earlier retain the patch.

  You cannot opt out of this behavior. Existing virtual environments are not modified automatically. Recreate an environment with Python 3.10 or later to remove the patch.

  This stabilizes the `no-distutils-patch` preview feature.

- **Treat requirement-file option values as single paths** ([#&#8203;22290](astral-sh/uv#22290))

  Previously, uv split values passed to `--constraint`, `--override`, `--exclude`, and `--build-constraint` on spaces, even when quoted. Now, each value is treated as a single path, allowing file paths containing spaces.

  You cannot opt out of this behavior. Repeat the option to provide multiple files. For example, replace `-c "a.txt b.txt"` with `-c a.txt -c b.txt`.

  Space-separated lists in `UV_CONSTRAINT`, `UV_OVERRIDE`, `UV_EXCLUDE`, and `UV_BUILD_CONSTRAINT` remain supported.

- **Use `tar-codec` for tar archives by default** ([#&#8203;22094](astral-sh/uv#22094))

  Previously, uv used `astral-tokio-tar` to extract tar archives, build source distributions with `uv_build`, and read their metadata for `uv publish`. Now, uv uses `tar-codec`, which applies stricter validation when reading archives.

  uv may now reject archives containing hard links or unsupported tar extensions that previous versions accepted. Source distributions created by `uv_build` can also have different archive bytes and hashes.

  You can opt out of this behavior by setting `UV_LEGACY_TAR_BACKEND=1`.

  This stabilizes the `tar-codec` preview feature.

- **Reject `uv build --clear` output directories that contain a build source**
  ([#&#8203;22276](astral-sh/uv#22276))

  Previously, `uv build --clear` could delete a project or input source distribution when the
  output directory contained the source. Now, uv rejects these output directories, including
  equivalent paths reached through symlinks, before clearing any build output.

  Select an output directory that does not contain any build sources, or omit `--clear`.

##### Python

- Add CPython 3.15.0 ([#&#8203;22400](astral-sh/uv#22400))

##### Preview features

- Require hashes for build dependencies, including transitive dependencies, with `--require-build-hashes` ([#&#8203;21411](astral-sh/uv#21411))

##### Performance

- Speed up revalidation of cached HTTP responses by avoiding rewrites of unchanged payloads ([#&#8203;22130](astral-sh/uv#22130))
- Reduce allocations when reading cached HTTP responses ([#&#8203;22136](astral-sh/uv#22136))
- Reduce cache storage for HTTP policies and package records ([#&#8203;22135](astral-sh/uv#22135), [#&#8203;22133](astral-sh/uv#22133))
- Reduce allocations for cached source distribution revisions ([#&#8203;22131](astral-sh/uv#22131))

##### Bug fixes

- Fix incorrect dependency resolution when reusing source metadata with different build settings ([#&#8203;22404](astral-sh/uv#22404))
- Avoid overlong wheel cache lock filenames on Windows ([#&#8203;22134](astral-sh/uv#22134))

### [`v0.12.24`](https://github.com/astral-sh/uv/releases/tag/0.12.24)

[Compare Source](astral-sh/uv@0.12.23...0.12.24)

#### Release Notes

Released on 2026-10-08.

##### Enhancements

- Remove orphaned temporary build environments with `uv cache prune` ([#&#8203;22171](astral-sh/uv#22171))
- Accept PEP 508 marker operators directly before grouped expressions ([#&#8203;22309](astral-sh/uv#22309))
- Reject malformed requirements-file options instead of partially parsing or ignoring them ([#&#8203;22317](astral-sh/uv#22317))
- Show underlying filesystem and registry errors when managed Python uninstallation fails ([#&#8203;22362](astral-sh/uv#22362))
- Identify the invalid source URL in Python mirror errors ([#&#8203;22364](astral-sh/uv#22364))

##### Preview features

- Display preferred advisory IDs in `uv audit` reports, prioritizing PYSEC, GHSA, then CVE identifiers ([#&#8203;22292](astral-sh/uv#22292))

##### Configuration

- Support custom installation mirrors for GraalPy ([#&#8203;22269](astral-sh/uv#22269))
- Support custom installation mirrors for Pyodide ([#&#8203;22271](astral-sh/uv#22271))
- Allow `UV_NO_CACHE=false` to override `no-cache = true` in configuration ([#&#8203;22324](astral-sh/uv#22324))
- Report more precise error locations for invalid trusted-host ports and preview-feature list entries ([#&#8203;22144](astral-sh/uv#22144))

##### Performance

- Speed up later commands after creating an environment by warming its interpreter cache ([#&#8203;21304](astral-sh/uv#21304))
- Reduce code-signature verification work for ARM64 macOS releases with 16 KiB signature pages ([#&#8203;22246](astral-sh/uv#22246))
- Enforce resource limits when parsing package indexes and `--find-links` pages with `astral-html` ([#&#8203;22203](astral-sh/uv#22203))
- Reduce standalone `uv-build` executable size by 7.5% by omitting unused Zstandard support ([#&#8203;22242](astral-sh/uv#22242))
- Reduce uv's binary size by about 232 KB by simplifying configuration deserialization ([#&#8203;22144](astral-sh/uv#22144))
- Reduce Python download error formatting code size by sharing its formatter ([#&#8203;22141](astral-sh/uv#22141))

##### Bug fixes

- Verify supplied hashes even when hash presence is disabled with `--no-require-hashes` or `require-hashes = false` ([#&#8203;22369](astral-sh/uv#22369))
- Honor exact managed Python patch pins when creating script environments instead of following patch upgrades ([#&#8203;22360](astral-sh/uv#22360))
- Prevent dependency overrides and constraints from activating optional dependencies when their extras are not selected ([#&#8203;22237](astral-sh/uv#22237))
- Exclude optional dependencies from exports when their extras are activated only in incompatible environments ([#&#8203;22234](astral-sh/uv#22234))
- Give explicit `uv publish --trusted-publishing` values precedence over configuration ([#&#8203;22279](astral-sh/uv#22279))
- Allow `UV_OFFLINE=false` to override `offline = true` in configuration ([#&#8203;22283](astral-sh/uv#22283))
- Allow `UV_SYSTEM_CERTS=false` to override `system-certs = true` in configuration ([#&#8203;22291](astral-sh/uv#22291))
- Allow `uv auth login` over IPv6 loopback addresses ([#&#8203;22306](astral-sh/uv#22306))
- Resolve GitHub dependencies whose Git references contain `#` or `%` characters ([#&#8203;22281](astral-sh/uv#22281))
- Recognize existing Pyodide interpreters as satisfying Pyodide Python requests ([#&#8203;22322](astral-sh/uv#22322))
- Preserve JSON output from `uv version` and `uv self version` with a single `--quiet` flag ([#&#8203;22280](astral-sh/uv#22280))
- Preserve trailing spaces and tabs in passwords returned by subprocess keyrings ([#&#8203;22284](astral-sh/uv#22284))
- Restore wheel incompatibility hints when `WHEEL` metadata contains multiple expanded `Tag:` rows ([#&#8203;22235](astral-sh/uv#22235))
- Preserve Windows wheel-script rename errors unless a cross-drive copy fallback applies ([#&#8203;22302](astral-sh/uv#22302))
- Prevent workspace-cache assertion failures after modifying a project at the workspace root ([#&#8203;22236](astral-sh/uv#22236))
- Hide the ignored `--keyring-provider` option from `uv auth` help ([#&#8203;19520](astral-sh/uv#19520))
- Report HTTP client setup failures directly when resolving unnamed `uv tool` requirements ([#&#8203;22320](astral-sh/uv#22320))

##### Documentation

- Update Docker and AWS Lambda examples to cache dependency layers using frozen lockfiles without project manifests ([#&#8203;22172](astral-sh/uv#22172))
- Fix stale links and descriptions in Rust crate documentation ([#&#8203;22311](astral-sh/uv#22311), [#&#8203;22361](astral-sh/uv#22361))
- Fix a typo in the `required-environments` documentation ([#&#8203;22238](astral-sh/uv#22238))

#### Install uv 0.12.24

##### Install prebuilt binaries via shell script

```sh
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-installer.sh | sh
```

##### Install prebuilt binaries via powershell script

```sh
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-installer.ps1 | iex"
```

#### Download uv 0.12.24

| File                                                                                                                                                | Platform                     | Checksum                                                                                                                   |
| --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| [uv-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-apple-darwin.tar.gz)                     | Apple Silicon macOS          | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-apple-darwin.tar.gz.sha256)           |
| [uv-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-apple-darwin.tar.gz)                       | Intel macOS                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-apple-darwin.tar.gz.sha256)            |
| [uv-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-pc-windows-msvc.zip)                     | ARM64 Windows                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-pc-windows-msvc.zip.sha256)           |
| [uv-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-pc-windows-msvc.zip)                           | x86 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-pc-windows-msvc.zip.sha256)              |
| [uv-x86_64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-pc-windows-msvc.zip)                       | x64 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-pc-windows-msvc.zip.sha256)            |
| [uv-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-unknown-linux-gnu.tar.gz)           | ARM64 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-unknown-linux-gnu.tar.gz.sha256)      |
| [uv-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-unknown-linux-gnu.tar.gz)                 | x86 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-unknown-linux-gnu.tar.gz.sha256)         |
| [uv-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-powerpc64le-unknown-linux-gnu.tar.gz)   | PPC64LE Linux                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-powerpc64le-unknown-linux-gnu.tar.gz.sha256)  |
| [uv-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-riscv64gc-unknown-linux-gnu.tar.gz)       | RISCV Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-riscv64gc-unknown-linux-gnu.tar.gz.sha256)    |
| [uv-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-s390x-unknown-linux-gnu.tar.gz)               | S390x Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-s390x-unknown-linux-gnu.tar.gz.sha256)        |
| [uv-x86_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-unknown-linux-gnu.tar.gz)             | x64 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-unknown-linux-gnu.tar.gz.sha256)       |
| [uv-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-armv7-unknown-linux-gnueabihf.tar.gz)   | ARMv7 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-armv7-unknown-linux-gnueabihf.tar.gz.sha256)  |
| [uv-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-unknown-linux-musl.tar.gz)         | ARM64 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-unknown-linux-musl.tar.gz.sha256)     |
| [uv-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-unknown-linux-musl.tar.gz)               | x86 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-unknown-linux-musl.tar.gz.sha256)        |
| [uv-riscv64gc-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-riscv64gc-unknown-linux-musl.tar.gz)     | RISCV MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-riscv64gc-unknown-linux-musl.tar.gz.sha256)   |
| [uv-x86_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-unknown-linux-musl.tar.gz)           | x64 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-unknown-linux-musl.tar.gz.sha256)      |
| [uv-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-arm-unknown-linux-musleabihf.tar.gz)     | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-arm-unknown-linux-musleabihf.tar.gz.sha256)   |
| [uv-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-armv7-unknown-linux-musleabihf.tar.gz.sha256) |

#### Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify):

```sh
gh attestation verify <file-path of downloaded artifact> --repo astral-sh/uv
```

You can also download the attestation from [GitHub](https://github.com/astral-sh/uv/attestations) and verify against that directly:

```sh
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>
```

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNDguMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE0OS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJ0eXBlL2RlcGVuZGVuY2llcyJdfQ==-->

Reviewed-on: https://git.tainton.uk/repos/labmcp/pulls/72
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
hbjydev pushed a commit to hbjydev/phoebe that referenced this pull request Oct 13, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [uv](https://github.com/astral-sh/uv) | tools | minor | `0.12.19` → `0.13.0` |

---

### Release Notes

<details>
<summary>astral-sh/uv (uv)</summary>

### [`v0.13.0`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0130)

[Compare Source](https://github.com/astral-sh/uv/compare/0.12.24...0.13.0)

Released on 2026-10-09.

uv 0.13.0 makes Python 3.15 the default stable Python version. We've also included several breaking changes to improve correctness, performance, and compatibility, described below.

**We expect most users to be able to upgrade without making changes.**

While not a breaking change, this release also updates the format of many of uv's cache entries to improve performance. **uv may download or rebuild dependencies after upgrading**, because some cached entries from earlier versions cannot be reused. Multiple versions of uv can still safely share the same cache directory.

There are no breaking changes to the configuration of the [uv build backend](https://docs.astral.sh/uv/concepts/build-backend/). If your `[build-system]` table includes an upper bound on `uv_build`, update it to allow `uv_build` 0.13, e.g., `uv_build>=0.13.0,<0.14`.

##### Breaking changes

- **Use Python 3.15 as the default stable version**

  The default stable Python version has changed from 3.14 to 3.15. This affects Python downloads when no version is requested or pinned, e.g., when running `uv python install`.

  uv continues to use compatible Python installations that are already present. For example, `uv venv` can still use an installed Python 3.14. If no suitable interpreter is installed and automatic downloads are enabled, commands such as `uv venv` and `uvx python` can now download Python 3.15.

  You can opt out of this behavior by requesting Python 3.14 explicitly, e.g., `uv venv --python 3.14`. For projects, use `uv python pin 3.14` to record the version in `.python-version`.

- **Honor `--require-hashes` in included constraints files** ([#&#8203;22275](https://github.com/astral-sh/uv/pull/22275))

  Previously, uv ignored `--require-hashes` in constraints files included with `-c` from a requirements file. Now, uv honors the directive and requires hashes for all requirements in the installation. Installs that previously succeeded can now fail if a requirement is missing a hash.

  You cannot opt out while the directive is present. Add the missing hashes to your requirements, or remove the `--require-hashes` directive from the included constraints file if hash checking is not intended.

- **Prefer native Python on Windows ARM64** ([#&#8203;22100](https://github.com/astral-sh/uv/pull/22100))

  Previously, ARM64 builds of uv preferred emulated `x86_64` Python installations because native wheel support was limited. Now, uv prefers native ARM64 (`aarch64`) interpreters across Python versions.

  This follows similar changes in [CPython](https://discuss.python.org/t/python-on-windows-arm64/104524), the official Windows [Python install manager](https://discuss.python.org/t/python-install-manager-26-4/108846), and GitHub's [actions/setup-python](https://github.com/actions/setup-python#supported-architectures).

  When a native interpreter is unavailable, uv continues to fall back to `x86_64`, then 32-bit `x86`.

  You can opt out of this behavior by setting `UV_PYTHON_ARCH=x86_64` or requesting an explicit architecture, e.g., `cpython-3.14-windows-x86_64`. If you are using `setup-uv`, you can set [`python-arch: x86_64`](https://github.com/astral-sh/setup-uv#python-architecture) instead.

- **Reject editable requirements in included constraints files** ([#&#8203;22282](https://github.com/astral-sh/uv/pull/22282))

  Previously, uv silently ignored editable (`-e`) requirements in constraints files included with `-c` from a requirements file. Now, uv rejects these requirements with an error, matching [pip's behavior](https://pip.pypa.io/en/stable/user_guide/#constraints-files).

  You cannot opt out of this behavior. Move editable requirements to a requirements file passed with `-r`, or pass them directly with `--editable`, instead of including them in a constraints file.

- **Omit the distutils startup patch on Python 3.10 and later** ([#&#8203;22096](https://github.com/astral-sh/uv/pull/22096))

  Previously, uv installed `_virtualenv.py` and `_virtualenv.pth` into every new virtual environment to prevent distutils configuration from changing installation paths. Now, like [`virtualenv` 21.6.0](https://github.com/pypa/virtualenv/releases/tag/21.6.0), uv omits these files on Python 3.10 and later, which already ignore the affected configuration keys. This reduces Python startup overhead. Python 3.9 and earlier retain the patch.

  You cannot opt out of this behavior. Existing virtual environments are not modified automatically. Recreate an environment with Python 3.10 or later to remove the patch.

  This stabilizes the `no-distutils-patch` preview feature.

- **Treat requirement-file option values as single paths** ([#&#8203;22290](https://github.com/astral-sh/uv/pull/22290))

  Previously, uv split values passed to `--constraint`, `--override`, `--exclude`, and `--build-constraint` on spaces, even when quoted. Now, each value is treated as a single path, allowing file paths containing spaces.

  You cannot opt out of this behavior. Repeat the option to provide multiple files. For example, replace `-c "a.txt b.txt"` with `-c a.txt -c b.txt`.

  Space-separated lists in `UV_CONSTRAINT`, `UV_OVERRIDE`, `UV_EXCLUDE`, and `UV_BUILD_CONSTRAINT` remain supported.

- **Use `tar-codec` for tar archives by default** ([#&#8203;22094](https://github.com/astral-sh/uv/pull/22094))

  Previously, uv used `astral-tokio-tar` to extract tar archives, build source distributions with `uv_build`, and read their metadata for `uv publish`. Now, uv uses `tar-codec`, which applies stricter validation when reading archives.

  uv may now reject archives containing hard links or unsupported tar extensions that previous versions accepted. Source distributions created by `uv_build` can also have different archive bytes and hashes.

  You can opt out of this behavior by setting `UV_LEGACY_TAR_BACKEND=1`.

  This stabilizes the `tar-codec` preview feature.

- **Reject `uv build --clear` output directories that contain a build source**
  ([#&#8203;22276](https://github.com/astral-sh/uv/pull/22276))

  Previously, `uv build --clear` could delete a project or input source distribution when the
  output directory contained the source. Now, uv rejects these output directories, including
  equivalent paths reached through symlinks, before clearing any build output.

  Select an output directory that does not contain any build sources, or omit `--clear`.

##### Python

- Add CPython 3.15.0 ([#&#8203;22400](https://github.com/astral-sh/uv/pull/22400))

##### Preview features

- Require hashes for build dependencies, including transitive dependencies, with `--require-build-hashes` ([#&#8203;21411](https://github.com/astral-sh/uv/pull/21411))

##### Performance

- Speed up revalidation of cached HTTP responses by avoiding rewrites of unchanged payloads ([#&#8203;22130](https://github.com/astral-sh/uv/pull/22130))
- Reduce allocations when reading cached HTTP responses ([#&#8203;22136](https://github.com/astral-sh/uv/pull/22136))
- Reduce cache storage for HTTP policies and package records ([#&#8203;22135](https://github.com/astral-sh/uv/pull/22135), [#&#8203;22133](https://github.com/astral-sh/uv/pull/22133))
- Reduce allocations for cached source distribution revisions ([#&#8203;22131](https://github.com/astral-sh/uv/pull/22131))

##### Bug fixes

- Fix incorrect dependency resolution when reusing source metadata with different build settings ([#&#8203;22404](https://github.com/astral-sh/uv/pull/22404))
- Avoid overlong wheel cache lock filenames on Windows ([#&#8203;22134](https://github.com/astral-sh/uv/pull/22134))

### [`v0.12.24`](https://github.com/astral-sh/uv/releases/tag/0.12.24)

[Compare Source](https://github.com/astral-sh/uv/compare/0.12.23...0.12.24)

#### Release Notes

Released on 2026-10-08.

##### Enhancements

- Remove orphaned temporary build environments with `uv cache prune` ([#&#8203;22171](https://github.com/astral-sh/uv/pull/22171))
- Accept PEP 508 marker operators directly before grouped expressions ([#&#8203;22309](https://github.com/astral-sh/uv/pull/22309))
- Reject malformed requirements-file options instead of partially parsing or ignoring them ([#&#8203;22317](https://github.com/astral-sh/uv/pull/22317))
- Show underlying filesystem and registry errors when managed Python uninstallation fails ([#&#8203;22362](https://github.com/astral-sh/uv/pull/22362))
- Identify the invalid source URL in Python mirror errors ([#&#8203;22364](https://github.com/astral-sh/uv/pull/22364))

##### Preview features

- Display preferred advisory IDs in `uv audit` reports, prioritizing PYSEC, GHSA, then CVE identifiers ([#&#8203;22292](https://github.com/astral-sh/uv/pull/22292))

##### Configuration

- Support custom installation mirrors for GraalPy ([#&#8203;22269](https://github.com/astral-sh/uv/pull/22269))
- Support custom installation mirrors for Pyodide ([#&#8203;22271](https://github.com/astral-sh/uv/pull/22271))
- Allow `UV_NO_CACHE=false` to override `no-cache = true` in configuration ([#&#8203;22324](https://github.com/astral-sh/uv/pull/22324))
- Report more precise error locations for invalid trusted-host ports and preview-feature list entries ([#&#8203;22144](https://github.com/astral-sh/uv/pull/22144))

##### Performance

- Speed up later commands after creating an environment by warming its interpreter cache ([#&#8203;21304](https://github.com/astral-sh/uv/pull/21304))
- Reduce code-signature verification work for ARM64 macOS releases with 16 KiB signature pages ([#&#8203;22246](https://github.com/astral-sh/uv/pull/22246))
- Enforce resource limits when parsing package indexes and `--find-links` pages with `astral-html` ([#&#8203;22203](https://github.com/astral-sh/uv/pull/22203))
- Reduce standalone `uv-build` executable size by 7.5% by omitting unused Zstandard support ([#&#8203;22242](https://github.com/astral-sh/uv/pull/22242))
- Reduce uv's binary size by about 232 KB by simplifying configuration deserialization ([#&#8203;22144](https://github.com/astral-sh/uv/pull/22144))
- Reduce Python download error formatting code size by sharing its formatter ([#&#8203;22141](https://github.com/astral-sh/uv/pull/22141))

##### Bug fixes

- Verify supplied hashes even when hash presence is disabled with `--no-require-hashes` or `require-hashes = false` ([#&#8203;22369](https://github.com/astral-sh/uv/pull/22369))
- Honor exact managed Python patch pins when creating script environments instead of following patch upgrades ([#&#8203;22360](https://github.com/astral-sh/uv/pull/22360))
- Prevent dependency overrides and constraints from activating optional dependencies when their extras are not selected ([#&#8203;22237](https://github.com/astral-sh/uv/pull/22237))
- Exclude optional dependencies from exports when their extras are activated only in incompatible environments ([#&#8203;22234](https://github.com/astral-sh/uv/pull/22234))
- Give explicit `uv publish --trusted-publishing` values precedence over configuration ([#&#8203;22279](https://github.com/astral-sh/uv/pull/22279))
- Allow `UV_OFFLINE=false` to override `offline = true` in configuration ([#&#8203;22283](https://github.com/astral-sh/uv/pull/22283))
- Allow `UV_SYSTEM_CERTS=false` to override `system-certs = true` in configuration ([#&#8203;22291](https://github.com/astral-sh/uv/pull/22291))
- Allow `uv auth login` over IPv6 loopback addresses ([#&#8203;22306](https://github.com/astral-sh/uv/pull/22306))
- Resolve GitHub dependencies whose Git references contain `#` or `%` characters ([#&#8203;22281](https://github.com/astral-sh/uv/pull/22281))
- Recognize existing Pyodide interpreters as satisfying Pyodide Python requests ([#&#8203;22322](https://github.com/astral-sh/uv/pull/22322))
- Preserve JSON output from `uv version` and `uv self version` with a single `--quiet` flag ([#&#8203;22280](https://github.com/astral-sh/uv/pull/22280))
- Preserve trailing spaces and tabs in passwords returned by subprocess keyrings ([#&#8203;22284](https://github.com/astral-sh/uv/pull/22284))
- Restore wheel incompatibility hints when `WHEEL` metadata contains multiple expanded `Tag:` rows ([#&#8203;22235](https://github.com/astral-sh/uv/pull/22235))
- Preserve Windows wheel-script rename errors unless a cross-drive copy fallback applies ([#&#8203;22302](https://github.com/astral-sh/uv/pull/22302))
- Prevent workspace-cache assertion failures after modifying a project at the workspace root ([#&#8203;22236](https://github.com/astral-sh/uv/pull/22236))
- Hide the ignored `--keyring-provider` option from `uv auth` help ([#&#8203;19520](https://github.com/astral-sh/uv/pull/19520))
- Report HTTP client setup failures directly when resolving unnamed `uv tool` requirements ([#&#8203;22320](https://github.com/astral-sh/uv/pull/22320))

##### Documentation

- Update Docker and AWS Lambda examples to cache dependency layers using frozen lockfiles without project manifests ([#&#8203;22172](https://github.com/astral-sh/uv/pull/22172))
- Fix stale links and descriptions in Rust crate documentation ([#&#8203;22311](https://github.com/astral-sh/uv/pull/22311), [#&#8203;22361](https://github.com/astral-sh/uv/pull/22361))
- Fix a typo in the `required-environments` documentation ([#&#8203;22238](https://github.com/astral-sh/uv/pull/22238))

#### Install uv 0.12.24

##### Install prebuilt binaries via shell script

```sh
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-installer.sh | sh
```

##### Install prebuilt binaries via powershell script

```sh
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-installer.ps1 | iex"
```

#### Download uv 0.12.24

| File                                                                                                                                                | Platform                     | Checksum                                                                                                                   |
| --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| [uv-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-apple-darwin.tar.gz)                     | Apple Silicon macOS          | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-apple-darwin.tar.gz.sha256)           |
| [uv-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-apple-darwin.tar.gz)                       | Intel macOS                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-apple-darwin.tar.gz.sha256)            |
| [uv-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-pc-windows-msvc.zip)                     | ARM64 Windows                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-pc-windows-msvc.zip.sha256)           |
| [uv-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-pc-windows-msvc.zip)                           | x86 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-pc-windows-msvc.zip.sha256)              |
| [uv-x86_64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-pc-windows-msvc.zip)                       | x64 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-pc-windows-msvc.zip.sha256)            |
| [uv-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-unknown-linux-gnu.tar.gz)           | ARM64 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-unknown-linux-gnu.tar.gz.sha256)      |
| [uv-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-unknown-linux-gnu.tar.gz)                 | x86 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-unknown-linux-gnu.tar.gz.sha256)         |
| [uv-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-powerpc64le-unknown-linux-gnu.tar.gz)   | PPC64LE Linux                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-powerpc64le-unknown-linux-gnu.tar.gz.sha256)  |
| [uv-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-riscv64gc-unknown-linux-gnu.tar.gz)       | RISCV Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-riscv64gc-unknown-linux-gnu.tar.gz.sha256)    |
| [uv-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-s390x-unknown-linux-gnu.tar.gz)               | S390x Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-s390x-unknown-linux-gnu.tar.gz.sha256)        |
| [uv-x86_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-unknown-linux-gnu.tar.gz)             | x64 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-unknown-linux-gnu.tar.gz.sha256)       |
| [uv-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-armv7-unknown-linux-gnueabihf.tar.gz)   | ARMv7 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-armv7-unknown-linux-gnueabihf.tar.gz.sha256)  |
| [uv-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-unknown-linux-musl.tar.gz)         | ARM64 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-aarch64-unknown-linux-musl.tar.gz.sha256)     |
| [uv-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-unknown-linux-musl.tar.gz)               | x86 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-i686-unknown-linux-musl.tar.gz.sha256)        |
| [uv-riscv64gc-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-riscv64gc-unknown-linux-musl.tar.gz)     | RISCV MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-riscv64gc-unknown-linux-musl.tar.gz.sha256)   |
| [uv-x86_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-unknown-linux-musl.tar.gz)           | x64 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-x86_64-unknown-linux-musl.tar.gz.sha256)      |
| [uv-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-arm-unknown-linux-musleabihf.tar.gz)     | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-arm-unknown-linux-musleabihf.tar.gz.sha256)   |
| [uv-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.24/uv-armv7-unknown-linux-musleabihf.tar.gz.sha256) |

#### Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify):

```sh
gh attestation verify <file-path of downloaded artifact> --repo astral-sh/uv
```

You can also download the attestation from [GitHub](https://github.com/astral-sh/uv/attestations) and verify against that directly:

```sh
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>
```

### [`v0.12.23`](https://github.com/astral-sh/uv/releases/tag/0.12.23)

[Compare Source](https://github.com/astral-sh/uv/compare/0.12.22...0.12.23)

#### Release Notes

Released on 2026-10-03.

##### Python

- Add CPython 3.15.0rc3 ([#&#8203;22164](https://github.com/astral-sh/uv/pull/22164))

##### Preview features

- Sync from `uv.lock` without a workspace manifest using `uv sync --frozen` with `frozen-lockfile` ([#&#8203;22018](https://github.com/astral-sh/uv/pull/22018))
- Export from `uv.lock` without a workspace manifest using `uv export --frozen` with `frozen-lockfile` ([#&#8203;22007](https://github.com/astral-sh/uv/pull/22007))
- Inspect dependency trees from `uv.lock` without a workspace manifest using `uv tree --frozen` with `frozen-lockfile` ([#&#8203;22016](https://github.com/astral-sh/uv/pull/22016))
- Inspect workspace metadata and optionally sync its environment from `uv.lock` without a workspace manifest using `uv workspace metadata --frozen` with `frozen-lockfile` ([#&#8203;22017](https://github.com/astral-sh/uv/pull/22017), [#&#8203;22018](https://github.com/astral-sh/uv/pull/22018))

##### Bug fixes

- Reject alternate sources for workspace members across conflicting dependency selections, avoiding lockfiles that cannot be installed ([#&#8203;22153](https://github.com/astral-sh/uv/pull/22153))
- Allow x86-64 Python interpreters running under emulation on Windows ARM64 to install compatible `win_amd64` wheels instead of building from source ([#&#8203;22099](https://github.com/astral-sh/uv/pull/22099))

#### Install uv 0.12.23

##### Install prebuilt binaries via shell script

```sh
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-installer.sh | sh
```

##### Install prebuilt binaries via powershell script

```sh
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-installer.ps1 | iex"
```

#### Download uv 0.12.23

| File                                                                                                                                                | Platform                     | Checksum                                                                                                                   |
| --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| [uv-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-aarch64-apple-darwin.tar.gz)                     | Apple Silicon macOS          | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-aarch64-apple-darwin.tar.gz.sha256)           |
| [uv-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-x86_64-apple-darwin.tar.gz)                       | Intel macOS                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-x86_64-apple-darwin.tar.gz.sha256)            |
| [uv-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-aarch64-pc-windows-msvc.zip)                     | ARM64 Windows                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-aarch64-pc-windows-msvc.zip.sha256)           |
| [uv-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-i686-pc-windows-msvc.zip)                           | x86 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-i686-pc-windows-msvc.zip.sha256)              |
| [uv-x86_64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-x86_64-pc-windows-msvc.zip)                       | x64 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-x86_64-pc-windows-msvc.zip.sha256)            |
| [uv-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-aarch64-unknown-linux-gnu.tar.gz)           | ARM64 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-aarch64-unknown-linux-gnu.tar.gz.sha256)      |
| [uv-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-i686-unknown-linux-gnu.tar.gz)                 | x86 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-i686-unknown-linux-gnu.tar.gz.sha256)         |
| [uv-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-powerpc64le-unknown-linux-gnu.tar.gz)   | PPC64LE Linux                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-powerpc64le-unknown-linux-gnu.tar.gz.sha256)  |
| [uv-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-riscv64gc-unknown-linux-gnu.tar.gz)       | RISCV Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-riscv64gc-unknown-linux-gnu.tar.gz.sha256)    |
| [uv-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-s390x-unknown-linux-gnu.tar.gz)               | S390x Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-s390x-unknown-linux-gnu.tar.gz.sha256)        |
| [uv-x86_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-x86_64-unknown-linux-gnu.tar.gz)             | x64 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-x86_64-unknown-linux-gnu.tar.gz.sha256)       |
| [uv-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-armv7-unknown-linux-gnueabihf.tar.gz)   | ARMv7 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-armv7-unknown-linux-gnueabihf.tar.gz.sha256)  |
| [uv-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-aarch64-unknown-linux-musl.tar.gz)         | ARM64 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-aarch64-unknown-linux-musl.tar.gz.sha256)     |
| [uv-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-i686-unknown-linux-musl.tar.gz)               | x86 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-i686-unknown-linux-musl.tar.gz.sha256)        |
| [uv-riscv64gc-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-riscv64gc-unknown-linux-musl.tar.gz)     | RISCV MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-riscv64gc-unknown-linux-musl.tar.gz.sha256)   |
| [uv-x86_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-x86_64-unknown-linux-musl.tar.gz)           | x64 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-x86_64-unknown-linux-musl.tar.gz.sha256)      |
| [uv-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-arm-unknown-linux-musleabihf.tar.gz)     | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-arm-unknown-linux-musleabihf.tar.gz.sha256)   |
| [uv-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.23/uv-armv7-unknown-linux-musleabihf.tar.gz.sha256) |

#### Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify):

```sh
gh attestation verify <file-path of downloaded artifact> --repo astral-sh/uv
```

You can also download the attestation from [GitHub](https://github.com/astral-sh/uv/attestations) and verify against that directly:

```sh
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>
```

### [`v0.12.22`](https://github.com/astral-sh/uv/releases/tag/0.12.22)

[Compare Source](https://github.com/astral-sh/uv/compare/0.12.21...0.12.22)

#### Release Notes

Released on 2026-10-01.

##### Python

- Add CPython 3.10.22, 3.11.17, 3.12.15, 3.13.16, and 3.14.8 ([#&#8203;22147](https://github.com/astral-sh/uv/pull/22147))

##### Enhancements

- Accept uppercase release suffixes in wheel platform tags ([#&#8203;22113](https://github.com/astral-sh/uv/pull/22113))
- Record workspace-member default groups in lockfiles ([#&#8203;22010](https://github.com/astral-sh/uv/pull/22010), [#&#8203;22103](https://github.com/astral-sh/uv/pull/22103))
- Record workspace-member dependency-group Python requirements in lockfiles ([#&#8203;22044](https://github.com/astral-sh/uv/pull/22044), [#&#8203;22103](https://github.com/astral-sh/uv/pull/22103))
- Record default groups for non-project workspace roots in lockfiles ([#&#8203;22104](https://github.com/astral-sh/uv/pull/22104))
- Record dependency-group Python requirements for non-project workspace roots in lockfiles ([#&#8203;22104](https://github.com/astral-sh/uv/pull/22104))
- Format URLs and paths consistently in CLI messages ([#&#8203;21937](https://github.com/astral-sh/uv/pull/21937))
- Hide the unsupported `--offline` option from `uv publish` help ([#&#8203;22124](https://github.com/astral-sh/uv/pull/22124))

##### Preview features

- Honor `--no-default-groups` in `uv audit` ([#&#8203;22090](https://github.com/astral-sh/uv/pull/22090))
- Report a clear error when `uv audit` or `uv tool audit` runs offline and hide the unsupported option from help ([#&#8203;22114](https://github.com/astral-sh/uv/pull/22114))

##### Configuration

- Add `UV_PYTHON_ARCH` to select an interpreter architecture independently of its Python version ([#&#8203;22098](https://github.com/astral-sh/uv/pull/22098))

##### Performance

- Reduce uv's binary size by compressing embedded Python download metadata ([#&#8203;22126](https://github.com/astral-sh/uv/pull/22126))

##### Bug fixes

- Verify unchanged requirements against existing lockfile hashes when relocking ([#&#8203;22083](https://github.com/astral-sh/uv/pull/22083))
- Honor dependency-group Python requirements at non-project workspace roots ([#&#8203;22101](https://github.com/astral-sh/uv/pull/22101))
- Use each selected workspace member's recorded default groups during frozen sync ([#&#8203;22015](https://github.com/astral-sh/uv/pull/22015))
- Avoid false entry-point warnings for required workspace members ([#&#8203;22112](https://github.com/astral-sh/uv/pull/22112))

##### Other changes

- Raise the minimum supported Rust version for building uv to 1.97 and update the toolchain to Rust 1.99 ([#&#8203;22121](https://github.com/astral-sh/uv/pull/22121))

#### Install uv 0.12.22

##### Install prebuilt binaries via shell script

```sh
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-installer.sh | sh
```

##### Install prebuilt binaries via powershell script

```sh
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-installer.ps1 | iex"
```

#### Download uv 0.12.22

| File                                                                                                                                                | Platform                     | Checksum                                                                                                                   |
| --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| [uv-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-aarch64-apple-darwin.tar.gz)                     | Apple Silicon macOS          | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-aarch64-apple-darwin.tar.gz.sha256)           |
| [uv-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-x86_64-apple-darwin.tar.gz)                       | Intel macOS                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-x86_64-apple-darwin.tar.gz.sha256)            |
| [uv-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-aarch64-pc-windows-msvc.zip)                     | ARM64 Windows                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-aarch64-pc-windows-msvc.zip.sha256)           |
| [uv-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-i686-pc-windows-msvc.zip)                           | x86 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-i686-pc-windows-msvc.zip.sha256)              |
| [uv-x86_64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-x86_64-pc-windows-msvc.zip)                       | x64 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-x86_64-pc-windows-msvc.zip.sha256)            |
| [uv-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-aarch64-unknown-linux-gnu.tar.gz)           | ARM64 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-aarch64-unknown-linux-gnu.tar.gz.sha256)      |
| [uv-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-i686-unknown-linux-gnu.tar.gz)                 | x86 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-i686-unknown-linux-gnu.tar.gz.sha256)         |
| [uv-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-powerpc64le-unknown-linux-gnu.tar.gz)   | PPC64LE Linux                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-powerpc64le-unknown-linux-gnu.tar.gz.sha256)  |
| [uv-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-riscv64gc-unknown-linux-gnu.tar.gz)       | RISCV Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-riscv64gc-unknown-linux-gnu.tar.gz.sha256)    |
| [uv-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-s390x-unknown-linux-gnu.tar.gz)               | S390x Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-s390x-unknown-linux-gnu.tar.gz.sha256)        |
| [uv-x86_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-x86_64-unknown-linux-gnu.tar.gz)             | x64 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-x86_64-unknown-linux-gnu.tar.gz.sha256)       |
| [uv-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-armv7-unknown-linux-gnueabihf.tar.gz)   | ARMv7 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-armv7-unknown-linux-gnueabihf.tar.gz.sha256)  |
| [uv-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-aarch64-unknown-linux-musl.tar.gz)         | ARM64 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-aarch64-unknown-linux-musl.tar.gz.sha256)     |
| [uv-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-i686-unknown-linux-musl.tar.gz)               | x86 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-i686-unknown-linux-musl.tar.gz.sha256)        |
| [uv-riscv64gc-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-riscv64gc-unknown-linux-musl.tar.gz)     | RISCV MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-riscv64gc-unknown-linux-musl.tar.gz.sha256)   |
| [uv-x86_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-x86_64-unknown-linux-musl.tar.gz)           | x64 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-x86_64-unknown-linux-musl.tar.gz.sha256)      |
| [uv-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-arm-unknown-linux-musleabihf.tar.gz)     | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-arm-unknown-linux-musleabihf.tar.gz.sha256)   |
| [uv-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.22/uv-armv7-unknown-linux-musleabihf.tar.gz.sha256) |

#### Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify):

```sh
gh attestation verify <file-path of downloaded artifact> --repo astral-sh/uv
```

You can also download the attestation from [GitHub](https://github.com/astral-sh/uv/attestations) and verify against that directly:

```sh
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>
```

### [`v0.12.21`](https://github.com/astral-sh/uv/releases/tag/0.12.21)

[Compare Source](https://github.com/astral-sh/uv/compare/0.12.20...0.12.21)

#### Release Notes

Released on 2026-09-29.

##### Python

- Update CPython to use OpenSSL 3.5.9 ([#&#8203;22076](https://github.com/astral-sh/uv/pull/22076))

##### Enhancements

- Omit empty `[manifest]` tables from lockfiles that contain only manifest subtables ([#&#8203;22070](https://github.com/astral-sh/uv/pull/22070))

##### Preview features

- Omit redundant runtime constraints from `uv.lock`, including those involving pre-releases, with the `resolution-inputs` preview feature ([#&#8203;22004](https://github.com/astral-sh/uv/pull/22004), [#&#8203;22068](https://github.com/astral-sh/uv/pull/22068))

##### Bug fixes

- Prevent `uv python pin --rm` from removing a global `.python-versions` file without `--global` ([#&#8203;21992](https://github.com/astral-sh/uv/pull/21992))
- Fix installed-package checks incorrectly reporting post-releases as incompatible with exclusive lower bounds on pre-releases ([#&#8203;22049](https://github.com/astral-sh/uv/pull/22049))

#### Install uv 0.12.21

##### Install prebuilt binaries via shell script

```sh
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-installer.sh | sh
```

##### Install prebuilt binaries via powershell script

```sh
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-installer.ps1 | iex"
```

#### Download uv 0.12.21

| File                                                                                                                                                | Platform                     | Checksum                                                                                                                   |
| --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| [uv-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-aarch64-apple-darwin.tar.gz)                     | Apple Silicon macOS          | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-aarch64-apple-darwin.tar.gz.sha256)           |
| [uv-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-x86_64-apple-darwin.tar.gz)                       | Intel macOS                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-x86_64-apple-darwin.tar.gz.sha256)            |
| [uv-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-aarch64-pc-windows-msvc.zip)                     | ARM64 Windows                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-aarch64-pc-windows-msvc.zip.sha256)           |
| [uv-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-i686-pc-windows-msvc.zip)                           | x86 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-i686-pc-windows-msvc.zip.sha256)              |
| [uv-x86_64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-x86_64-pc-windows-msvc.zip)                       | x64 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-x86_64-pc-windows-msvc.zip.sha256)            |
| [uv-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-aarch64-unknown-linux-gnu.tar.gz)           | ARM64 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-aarch64-unknown-linux-gnu.tar.gz.sha256)      |
| [uv-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-i686-unknown-linux-gnu.tar.gz)                 | x86 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-i686-unknown-linux-gnu.tar.gz.sha256)         |
| [uv-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-powerpc64le-unknown-linux-gnu.tar.gz)   | PPC64LE Linux                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-powerpc64le-unknown-linux-gnu.tar.gz.sha256)  |
| [uv-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-riscv64gc-unknown-linux-gnu.tar.gz)       | RISCV Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-riscv64gc-unknown-linux-gnu.tar.gz.sha256)    |
| [uv-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-s390x-unknown-linux-gnu.tar.gz)               | S390x Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-s390x-unknown-linux-gnu.tar.gz.sha256)        |
| [uv-x86_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-x86_64-unknown-linux-gnu.tar.gz)             | x64 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-x86_64-unknown-linux-gnu.tar.gz.sha256)       |
| [uv-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-armv7-unknown-linux-gnueabihf.tar.gz)   | ARMv7 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-armv7-unknown-linux-gnueabihf.tar.gz.sha256)  |
| [uv-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-aarch64-unknown-linux-musl.tar.gz)         | ARM64 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-aarch64-unknown-linux-musl.tar.gz.sha256)     |
| [uv-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-i686-unknown-linux-musl.tar.gz)               | x86 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-i686-unknown-linux-musl.tar.gz.sha256)        |
| [uv-riscv64gc-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-riscv64gc-unknown-linux-musl.tar.gz)     | RISCV MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-riscv64gc-unknown-linux-musl.tar.gz.sha256)   |
| [uv-x86_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-x86_64-unknown-linux-musl.tar.gz)           | x64 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-x86_64-unknown-linux-musl.tar.gz.sha256)      |
| [uv-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-arm-unknown-linux-musleabihf.tar.gz)     | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-arm-unknown-linux-musleabihf.tar.gz.sha256)   |
| [uv-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.21/uv-armv7-unknown-linux-musleabihf.tar.gz.sha256) |

#### Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify):

```sh
gh attestation verify <file-path of downloaded artifact> --repo astral-sh/uv
```

You can also download the attestation from [GitHub](https://github.com/astral-sh/uv/attestations) and verify against that directly:

```sh
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>
```

### [`v0.12.20`](https://github.com/astral-sh/uv/releases/tag/0.12.20)

[Compare Source](https://github.com/astral-sh/uv/compare/0.12.19...0.12.20)

#### Release Notes

Released on 2026-09-28.

##### Enhancements

- Reuse lockfiles when dependency declarations are semantically equivalent ([#&#8203;21951](https://github.com/astral-sh/uv/pull/21951))
- Preserve second-line encoding declarations when installing wheel scripts with CRLF shebangs ([#&#8203;21990](https://github.com/astral-sh/uv/pull/21990))

##### Preview features

- Write normalized requirement declarations with the `lockfile-normalization` preview feature ([#&#8203;21951](https://github.com/astral-sh/uv/pull/21951))
- Honor synthetic default groups when installing or syncing from `pylock.toml` ([#&#8203;22003](https://github.com/astral-sh/uv/pull/22003))
- Resolve local paths in exported `pylock.toml` files relative to the output file ([#&#8203;22042](https://github.com/astral-sh/uv/pull/22042))
- Install each package only once when repeated `tool-install-locks` requirements resolve to the same package ([#&#8203;22000](https://github.com/astral-sh/uv/pull/22000))
- Reuse `lock-without-metadata` lockfiles for conflicting groups with distinct base and extra requirement specifiers ([#&#8203;22055](https://github.com/astral-sh/uv/pull/22055))
- Use consistent root-package paths in `uv workspace metadata` and `uv tree --format json` output ([#&#8203;22050](https://github.com/astral-sh/uv/pull/22050))

##### Configuration

- Continue searching `XDG_CONFIG_DIRS` after empty entries ([#&#8203;21987](https://github.com/astral-sh/uv/pull/21987))

##### Performance

- Restore the previous HTTP cache-write scheduling while investigating severe cache-revalidation stalls on ext4 filesystems ([#&#8203;22051](https://github.com/astral-sh/uv/pull/22051))

##### Bug fixes

- Apply hash constraints to every repeated requirement under `--require-hashes` and `--verify-hashes` ([#&#8203;21996](https://github.com/astral-sh/uv/pull/21996))
- Allow metadata builds for first-party workspace projects under `--no-build` ([#&#8203;21988](https://github.com/astral-sh/uv/pull/21988))
- Honor project exclusion flags with `--all-packages`, including `--no-install-project` and `--no-emit-project` ([#&#8203;21994](https://github.com/astral-sh/uv/pull/21994))
- Restore `pyproject.toml` if `uv upgrade` fails or is interrupted ([#&#8203;21983](https://github.com/astral-sh/uv/pull/21983))
- Generate working Nushell activation scripts for relocatable virtual environments ([#&#8203;21979](https://github.com/astral-sh/uv/pull/21979))
- Prevent commands from running and changing state after displaying `--show-settings` ([#&#8203;21989](https://github.com/astral-sh/uv/pull/21989))
- Treat UTF-16 requirements files containing only a byte-order mark as empty ([#&#8203;21991](https://github.com/astral-sh/uv/pull/21991))
- Ignore unrecognized managed-Python implementation directories during `uv python list` and `uv python upgrade` instead of panicking ([#&#8203;22033](https://github.com/astral-sh/uv/pull/22033))
- Avoid panics and incorrect rewriting when managed Python sysconfig paths merely start with `/install` ([#&#8203;22036](https://github.com/astral-sh/uv/pull/22036))
- Report whitespace-only non-ASCII requirements as invalid instead of panicking ([#&#8203;22035](https://github.com/astral-sh/uv/pull/22035))
- Avoid a resolver panic when trace logging an always-false constraint ([#&#8203;22034](https://github.com/astral-sh/uv/pull/22034))

#### Install uv 0.12.20

##### Install prebuilt binaries via shell script

```sh
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-installer.sh | sh
```

##### Install prebuilt binaries via powershell script

```sh
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-installer.ps1 | iex"
```

#### Download uv 0.12.20

| File                                                                                                                                                | Platform                     | Checksum                                                                                                                   |
| --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| [uv-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-aarch64-apple-darwin.tar.gz)                     | Apple Silicon macOS          | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-aarch64-apple-darwin.tar.gz.sha256)           |
| [uv-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-x86_64-apple-darwin.tar.gz)                       | Intel macOS                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-x86_64-apple-darwin.tar.gz.sha256)            |
| [uv-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-aarch64-pc-windows-msvc.zip)                     | ARM64 Windows                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-aarch64-pc-windows-msvc.zip.sha256)           |
| [uv-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-i686-pc-windows-msvc.zip)                           | x86 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-i686-pc-windows-msvc.zip.sha256)              |
| [uv-x86_64-pc-windows-msvc.zip](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-x86_64-pc-windows-msvc.zip)                       | x64 Windows                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-x86_64-pc-windows-msvc.zip.sha256)            |
| [uv-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-aarch64-unknown-linux-gnu.tar.gz)           | ARM64 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-aarch64-unknown-linux-gnu.tar.gz.sha256)      |
| [uv-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-i686-unknown-linux-gnu.tar.gz)                 | x86 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-i686-unknown-linux-gnu.tar.gz.sha256)         |
| [uv-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-powerpc64le-unknown-linux-gnu.tar.gz)   | PPC64LE Linux                | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-powerpc64le-unknown-linux-gnu.tar.gz.sha256)  |
| [uv-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-riscv64gc-unknown-linux-gnu.tar.gz)       | RISCV Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-riscv64gc-unknown-linux-gnu.tar.gz.sha256)    |
| [uv-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-s390x-unknown-linux-gnu.tar.gz)               | S390x Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-s390x-unknown-linux-gnu.tar.gz.sha256)        |
| [uv-x86_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-x86_64-unknown-linux-gnu.tar.gz)             | x64 Linux                    | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-x86_64-unknown-linux-gnu.tar.gz.sha256)       |
| [uv-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-armv7-unknown-linux-gnueabihf.tar.gz)   | ARMv7 Linux                  | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-armv7-unknown-linux-gnueabihf.tar.gz.sha256)  |
| [uv-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-aarch64-unknown-linux-musl.tar.gz)         | ARM64 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-aarch64-unknown-linux-musl.tar.gz.sha256)     |
| [uv-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-i686-unknown-linux-musl.tar.gz)               | x86 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-i686-unknown-linux-musl.tar.gz.sha256)        |
| [uv-riscv64gc-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-riscv64gc-unknown-linux-musl.tar.gz)     | RISCV MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-riscv64gc-unknown-linux-musl.tar.gz.sha256)   |
| [uv-x86_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-x86_64-unknown-linux-musl.tar.gz)           | x64 MUSL Linux               | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-x86_64-unknown-linux-musl.tar.gz.sha256)      |
| [uv-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-arm-unknown-linux-musleabihf.tar.gz)     | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-arm-unknown-linux-musleabihf.tar.gz.sha256)   |
| [uv-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux             | [checksum](https://releases.astral.sh/github/uv/releases/download/0.12.20/uv-armv7-unknown-linux-musleabihf.tar.gz.sha256) |

#### Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify):

```sh
gh attestation verify <file-path of downloaded artifact> --repo astral-sh/uv
```

You can also download the attestation from [GitHub](https://github.com/astral-sh/uv/attestations) and verify against that directly:

```sh
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>
```

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/London)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMzMuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE1NS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9naXRodWItcmVsZWFzZSIsInR5cGUvbWlub3IiXX0=-->

Reviewed-on: https://git.hayden.moe/hayden/phoebe/pulls/834

This branch was successfully deployed

1 active deployment
automations — 42761b28 Deployed Oct 1, 2026 by charliermarsh via review / security review #48839
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant