You start a new Python project. Which Python version? pyenv. A clean environment? python -m venv and remember to activate it. Install the packages? pip, which is slow and won't lock anything, so you also learn pip-tools. Run a one-off formatter without polluting the project? pipx. That's five tools and a page of tribal knowledge before you've written a line of code. uv replaces all five with one binary — and makes the slow parts instant.
uv is a Python package and project manager written in Rust by Astral, the team behind the Ruff linter. The pitch in one line: everything you used pip, pip-tools, pipx, virtualenv, and pyenv for, in a single fast command — free and open source.
What it does#
- Installs packages, fast. Astral reports uv resolving and installing 10–100× faster than pip, thanks to a Rust resolver, heavy parallelism, and a global cache that hard-links packages instead of re-downloading them. On a warm cache, installs that take pip seconds take uv milliseconds.
- Manages the whole project.
uv addrecords a dependency and updates a lockfile.uv runguarantees the environment matches the lockfile before your code runs — no more forgetting topip installafter a pull. - Installs Python itself.
uv python install 3.13fetches and manages interpreter versions, so pyenv drops out of your setup. - Runs tools ephemerally.
uvx ruff checkruns a CLI tool in a throwaway isolated environment — uv's take on pipx — cached so the second run is instant.
Who it's for#
Anyone who ships Python and is tired of environment friction: a founder standing up a FastAPI service and wanting CI to install the exact same versions as their laptop; a data team that needs reproducible notebooks; a builder who just wants git clone && uv run to work. If your relationship with Python packaging is mostly waiting and occasionally cursing, you are the target user. It pairs naturally with the reproducibility mindset — the same reason temperature-0 determinism is worth caring about applies to your dependency tree.
How to start — one command#
Install uv (standalone installer, or pipx install uv / brew install uv), then:
$ uv init myapp && cd myapp # scaffold a project (pyproject.toml + more)
$ uv add fastapi uvicorn # add deps, resolve, and write uv.lock
$ uv run uvicorn main:app # run inside the correct env — auto-created
No activate, no separate venv step, no pip install -r dance. uv sync recreates the exact environment from uv.lock on any machine, which is what makes builds reproducible across your laptop and CI without hand-pinning.
Want a single-file script with its own dependencies? uv supports PEP 723 inline metadata — declare deps in a comment block at the top of a .py file and uv run script.py builds a temporary environment for it on the fly.
What it costs#
Nothing. uv is open source under the MIT and Apache-2.0 licenses — free for personal and commercial use, no seats, no license key. Astral, the company, is building toward paid infrastructure products down the road, but the uv CLI you install today has no cost attached and no feature gates.
The honest catch#
uv is young and moving fast, and a fast-moving tool occasionally changes behavior between versions — pin the uv version in CI if you need long-term stability. Its resolver is stricter than pip's, so a messy legacy project may surface real dependency conflicts pip was quietly ignoring; that's usually uv telling the truth, but it can mean a migration afternoon. And a handful of exotic packaging setups (obscure build backends, deeply custom setup.py logic) still fit pip's world better. For the overwhelming majority of projects, though, uv is the closest thing Python packaging has had to "it just works" — and it's the first thing worth installing in a fresh environment, right alongside the version-control tools you actually enjoy using.



