technologies · difficulty ◆◆
uv — the ultra-fast Python package & project manager
One tool to install Python, manage environments, and ship packages — without the slow parts.
Python packaging has a dirty secret: most of it is waiting. pip resolves, downloads, and installs sequentially, and every virtualenv is a fresh world you have to rebuild. uv is a single Rust binary that does all of it in parallel — and it is not a little faster, it is usually 10 to 100 times faster.
$ uvWhat it is
uv is a single, compiled Rust binary that replaces the Python ecosystem’s usual grab-bag of tools: pip and pip-tools for dependencies, virtualenv for environments, pyenv for installing Python versions, Poetry for project management, and venv for isolation. You install one binary and it handles installing Python itself, creating environments, resolving and locking dependencies, running tools, and publishing packages. Everything shares one fast core written in Rust.
Why it matters
The failure mode it kills is waiting. Python’s classic workflow chains slow tools: pip resolves packages one at a time over the network, then builds each one in sequence; creating an environment means waiting again. On a large project that is minutes of dead time on every setup. uv parallelizes resolution and download, caches aggressively on disk, and reuses artifacts across projects. A cold install that took pip sixty seconds often takes uv two or three. When you do this on a CI machine or a teammate’s laptop dozens of times a day, the minutes add up to hours.
How it fits your stack
uv is installed in this environment at version 0.11.19 and ships 23 top-level commands. It manages the Python interpreter itself (uv python install 3.12 downloads a standalone build), creates virtual environments (uv venv), adds and locks dependencies with a uv.lock file (uv add / uv lock), runs tools in an ephemeral environment (uv run), and even publishes packages (uv publish). It is a drop-in for pip too: uv pip install works inside any existing virtualenv, so you can adopt it gradually without rewriting a project.
Example
$ uv init hello-uv && cd hello-uv && uv add requests Initialized project `hello-uv` at /home/kmail/hello-uv
Created pyproject.toml
Created README.md
Added requests>=2.32.3 as a dependency
✓ Created virtual environment
✓ Updated lockfile
Built hello-uv==0.1.0uv init scaffolds a project, uv add creates the venv, resolves, and writes uv.lock in one step. Compare the three separate tools pip/venv/pip-tools would normally be.
$ uv run python -c "import requests; print(requests.get('https://example.com').status_code)" Resolved 6 packages in 87ms
Audited 6 packages in 0.13ms
200uv run resolves the lockfile and executes the command inside the project environment. The resolution and audit messages show how fast the Rust core is.
$ uv python install 3.12 && uv python pin 3.12 Searching for Python 3.12
Installed Python 3.12.9
✓ Pinned .python-version to 3.12uv installs a standalone Python build itself — no pyenv, no system package manager. The .python-version file pins it for the whole project.
$ uv tool install ruff Installed 1 executable: ruff
Installed 1 package in 1.03suv tool installs a CLI tool into its own isolated environment and puts the executable on your PATH — like pipx but faster.
Common flags
- uv init
- scaffold a new project with pyproject.toml
- uv add <pkg>
- add a dependency, create the venv, and write uv.lock
- uv run <cmd>
- run a command inside the project environment
- uv lock
- generate/update the uv.lock lockfile
- uv sync
- install the environment to match uv.lock exactly
- uv python install <ver>
- download and install a standalone Python build
- uv tool install <pkg>
- install a CLI tool in an isolated env (like pipx)
- uv publish
- build and upload a package to PyPI
History
Origin
uv was built by Astral, the company Charlie Marsh founded after Ruff took the Python linting world by storm. Marsh’s thesis was that Python tooling did not have to be slow — most of it was slow because it was written in Python and ran one step at a time. Ruff proved the point for linting; uv applied the same Rust-and-parallelism approach to packaging. uv launched publicly in February 2024 and was adopted at remarkable speed, becoming the default package manager for many projects and CI pipelines within its first year.
The name and the philosophy
The name "uv" is intentionally short — a nod to speed and to Ruff (both are tools with bird-adjacent, single-syllable names from Astral). The philosophy is to consolidate the Python toolchain: instead of pip plus virtualenv plus pyenv plus pip-tools plus Poetry, one binary does resolution, locking, environment management, interpreter management, and publishing, all backed by the same fast, parallel, on-disk-cached core.
Growth & ecosystem
uv has become a fixture of modern Python setups, appearing in countless boilerplates, CI templates, and tutorials as the default way to manage dependencies. It also powers downstream tooling — many projects use uv run and uv.lock as the backbone of reproducible environments. Version 0.11.19, installed here, reflects a release cadence far faster than pip’s, with new commands and refinements landing continuously.
Fun facts
Pros & cons
pros
- + Dramatically faster installs, resolution, and environment creation (often 10-100x)
- + One binary replaces pip, virtualenv, pyenv, pip-tools, and Poetry
- + Deterministic uv.lock lockfile for reproducible environments and CI
- + Manages the Python interpreter itself, not just packages
- + Drop-in uv pip / uv venv / uv run commands mean gradual adoption
cons
- − Young project — API and lockfile format still evolving
- − Some niche/exotic packaging edge cases less battle-tested than pip
- − Adds another tool to learn if you are comfortable with the classic stack
- − The speed advantage is most dramatic on large cold installs; trivial projects feel similar
Takeaways
- 1Scaffold and resolve in one step: `uv init && uv add requests`
- 2Run inside the project env without activating it: `uv run python script.py`
- 3Install Python itself, no pyenv: `uv python install 3.12`
- 4Add a CLI tool safely: `uv tool install ruff`
- 5Try it on one existing project first with the drop-in `uv pip` commands