# How to upgrade uv

> [!TIP]
> Try my command line tool `uvx uvhow` for a quick view into your uv install and how to upgrade it. [Learn more.](https://github.com/python-developer-tooling-handbook/uvhow/blob/main/README.md)

Upgrade [uv](https://pydevtools.com/handbook/reference/uv.md) to the latest version using your original installation method.

To upgrade uv, run `uv self update` if you installed it with the standalone installer, the most common method. If you installed uv through a package manager, use that manager's upgrade command instead. Run `uvx uvhow` when you aren't sure which one applies.

| Install method | Upgrade command |
|---|---|
| Standalone installer | `uv self update` |
| Homebrew | `brew upgrade uv` |
| pipx | `pipx upgrade uv` |
| pip | `pip install --upgrade uv` |
| WinGet | `winget upgrade astral-sh.uv` |
| Scoop | `scoop update uv` |
| Cargo | `cargo install --locked uv` |

Package-manager builds can trail the standalone release, so `uv --version` after a package-manager upgrade may still report an older uv than the newest release. If you need releases the day they ship, uninstall the package-manager copy first (`brew uninstall uv`, for example) and then run the standalone installer. Keeping both leaves two binaries on your `PATH` and the upgrade commands stop matching the uv you actually run.

## Upgrade a standalone install

If you installed uv using the standalone installer (curl/powershell), run:

```bash
uv self update
```

## Read the error when `uv self update` refuses

`uv self update` prints one of two errors, and which one you get identifies how uv was installed.

A package manager that compiles uv from source, such as Homebrew, produces a binary with the self-update code left out:

```console
error: uv was installed through an external package manager and cannot update itself.

hint: You installed uv using Homebrew. To update uv, run `brew update && brew upgrade uv`
```

uv names the manager when it can recognize one from the path the binary sits in. When it can't, the second line falls back to `hint: Please use your package manager to update uv`.

A uv installed with pip or pipx keeps the self-update code but refuses to run it:

```console
error: Self-update is only available for uv binaries installed via the standalone installation scripts.
```

When that second error continues with `The current executable is at ... but the standalone installer was used to install uv to ...  Are multiple copies of uv installed?`, a standalone install and a package-manager install are both present and the wrong one comes first on your `PATH`. Run `which -a uv` (`Get-Command -All uv` in PowerShell) to list every copy, then remove the one you don't want or call the one you do want by its full path.

## Upgrade a pipx install

If you installed uv via [pipx](https://pydevtools.com/handbook/reference/pipx.md), upgrade using:

```bash
pipx upgrade uv
```

## Upgrade a pip install

If you installed uv with [pip](https://pydevtools.com/handbook/reference/pip.md), upgrade using:

```bash
pip install --upgrade uv
```

If you installed uv into your user site directory with `pip install --user uv`, upgrade it the same way:

```bash
pip install --upgrade --user uv
```

Run that outside a virtual environment. pip rejects `--user` inside one with `Can not perform a '--user' install. User site-packages are not visible in this virtualenv.`

## Upgrade a Homebrew install

If you installed uv via [Homebrew](https://pydevtools.com/handbook/reference/homebrew.md), upgrade using:

```bash
brew upgrade uv
```

To upgrade all Homebrew packages:

```bash
brew upgrade
```

## Upgrade a Cargo install

If you installed uv via Cargo, reinstall from crates.io to upgrade:

```bash
cargo install --locked uv
```

Cargo replaces the existing binary when the published version is newer. This method builds uv from source, so it needs a compatible Rust toolchain and takes several minutes.

## Upgrade a WinGet install

If you installed uv via WinGet, upgrade using:

```powershell
winget upgrade astral-sh.uv
```

To upgrade all WinGet packages:

```powershell
winget upgrade --all
```

## Upgrade a Scoop install

If you installed uv via Scoop, upgrade using:

```powershell
scoop update uv
```

To update all Scoop packages:

```powershell
scoop update *
```

## Confirm the new binary replaced the old one

After upgrading, check the version:

```bash
uv --version
```

The version line carries the build commit, the build date, and the target triple:

```console
uv 0.12.0 (b88d7c5c4 2026-07-28 aarch64-apple-darwin)
```

Package-manager builds put their own label where the commit hash would go. A Homebrew bottle prints `Homebrew` in that slot, which identifies the install method on its own.

If the version didn't change, the upgrade command doesn't match how uv was installed, or a second copy of uv comes first on your `PATH`. `which -a uv` (`Get-Command -All uv` in PowerShell) lists every copy.

## Keep your managed Python interpreters current too

Upgrading uv doesn't touch the Python versions it manages. To pull the latest patch releases for those, see [how to keep Python up to date with `uv python upgrade`](https://pydevtools.com/handbook/how-to/how-to-keep-python-up-to-date-with-uv-python-upgrade.md).
