kmail.at
← learning

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.

2026-08-13 · 14 min read

$ uv

What 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.0

uv 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
  200

uv 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.12

uv 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.03s

uv 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

  1. 1Scaffold and resolve in one step: `uv init && uv add requests`
  2. 2Run inside the project env without activating it: `uv run python script.py`
  3. 3Install Python itself, no pyenv: `uv python install 3.12`
  4. 4Add a CLI tool safely: `uv tool install ruff`
  5. 5Try it on one existing project first with the drop-in `uv pip` commands

Related commands

← all learning