Agent Skills: Stop Stuffing Workflows Into Your Rules File
Salatiel Lima | Apr 29, 2026
Listen to this article
Package management in Python has long been dominated by tools like pip and virtualenv, often supported by auxiliary utilities for dependency locking and environment management. With growing project complexity and demands for faster CI/CD workflows, the Python ecosystem is evolving.
One of the newest entrants is uv, a Rust-based, all-in-one package and project manager designed for speed and unification of traditional tools.
This article explains what UV is, how it differs from and improves on pip, and provides a step-by-step guide to adopting it in real Python projects. You’ll also find a sample pyproject.toml with commentary on dev dependencies for common workflows like testing and quality checks.
Python tooling historically has used a mix of utilities:
Each utility addresses a subset of project setup and dependency management, but also introduces friction in configuration and performance. UV aims to unify these responsibilities under a single interface, with performance and usability improvements out of the box.
At its core, UV is:

Because uv is written in Rust and handles multiple downloads and resolutions in parallel while using a global cache, installation workflows are significantly faster than standard pip operations.
Benchmarks report up to 10× faster installations compared to pip even without cache, and up to 100× faster when the global cache is warm, which is the most common scenario in day-to-day development, since dependencies rarely change between runs.
With UV, you don’t need to coordinate multiple CLI tools for environment setup, dependencies, and Python version control. A single interface simplifies both local development and CI/CD scripts.
Unlike relying solely on a plain requirements.txt, uv produces a lockfile that records precise versions and metadata. This ensures consistent installs across machines and builds.
You can install UV using one of the following methods. Standalone installers are recommended for full functionality.
macOS / Linux:
Windows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"Code language: JavaScript (javascript)
Alternatively, install via pip or pipx:
pip install uv
# or
pipx install uvCode language: PHP (php)
Once installed, confirm the version:
uv --version
At this point, you can start using UV in your Python projects.
Create a new project and initialize it with uv. This sets up a directory with basic config:
mkdir myproject && cd myproject
uv init
This creates:
To install runtime dependencies:
UV add requests Flask
For development dependencies (e.g., for testing):
uv add --dev pytest pytest-cov
uv separates dev dependencies under the dev section in pyproject.toml, similar to other modern package managers.
To install packages based on your lockfile:
uv sync
This ensures reproducible installs every time, unlike ad-hoc installs with pip install.
To run Python with the managed environment:
uv run python main.pyCode language: CSS (css)
You can also run tools directly:
uv run pytest
Below is an annotated sample configuration:
[project]
name = "myproject"
version = "0.1.0"
description = "Example project using uv"
authors = ["Your Name <you@example.com>"]
dependencies = [
"requests>=2.28.0",
"flask>=2.2.0",
]
[dependency-groups]
dev = [
"pytest>=7.0.0",
"pytest-cov",
"ruff",
"black",
]
[tool.uv]
python = ">=3.10"Code language: JavaScript (javascript)
Explanation:
This structure ensures a clean separation between primary and dev dependencies while maintaining reproducibility via the lockfile.
Once dependencies are installed, you can integrate standard workflows:
Linting:
uv run ruff .
Formatting:
uv run black .
Running tests:
uv run pytest
These commands run within the uv-managed environment, eliminating the need for separate virtualenv activation steps.
In many modern development contexts, UV can streamline workflows without sacrificing compatibility with PyPI and requirements formats.
UV is an emerging Python package and project manager that unifies multiple tools into a single interface while delivering performance improvements and simplified workflows. It is both a drop-in replacement for pip workflows and a more capable project manager with lockfiles, environment control, and dev dependencies built in.
By adopting UV, teams can reduce tooling complexity and speed up local development and CI/CD pipelines. The integration with a pyproject.toml-centric workflow also aligns with modern Python packaging standards.

uv is a Rust-based, all-in-one Python package and project manager designed for speed and unification of traditional tools. It serves as a drop-in replacement for pip (fully compatible with PyPI and requirements.txt), a virtual environment manager, a dependency resolver and lockfile generator, a project scaffolding tool, and optionally a Python version installer.
Because uv is written in Rust and handles multiple downloads and resolutions in parallel while using a global cache, benchmarks report up to 10× faster installations compared to pip even without cache, and up to 100× faster when the global cache is warm.
uv can be installed using standalone installers (recommended for full functionality) on macOS/Linux or Windows via PowerShell with the command: powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex". Alternatively, it can be installed via pip or pipx using 'pip install uv' or 'pipx install uv'. You can confirm the installation with 'uv --version'.
To install runtime dependencies, use 'uv add requests Flask'. For development dependencies, use 'uv add --dev pytest pytest-cov'. uv separates dev dependencies under the dev section in pyproject.toml.
pip still makes sense for existing production systems that assume pip as part of the system Python, Docker images where only pip is installed by default and a minimal footprint is needed, and when maximum compatibility with older Python workflows is required.
Marcelo Bittencourt is a Software Engineer in Cheesecake Labs. Throughout his career, he has integrated AI into products, streamlined development workflows, and modernized legacy platforms, while also contributing to frontend initiatives using Angular, React, and Next.js.