astral-sh/uv
Lore
A narrative history of the uv codebase. The numbers come from git log on the main branch up
to commit 4d4f345cfe0309561bbe115e8e3677c502f6a67b on 2026-04-30. Where exact dates are hard
to pin down, the month of the earliest relevant commit is used.
Eras
The "Puffin" prototype (Oct 2023)
uv started life under a different name: Puffin. The earliest commits — going back to
Oct 2023 — bring up the basic crates with the prefix puffin-* and lift parts of existing
Astral / community work in-tree:
- "Use local versions of PEP 440 and PEP 508 crates" (Oct 2023, #32) imported the
pep440-rsandpep508-rscrates that became today'suv-pep440anduv-pep508. - "Use local copy of
install-wheel-rs" (Oct 2023, #34) folded in the wheel installer that is nowuv-install-wheel. - "Use local copy of
gourgeist" (Oct 2023, #62) brought in the venv creator that becameuv-virtualenv. - "Add an HTTP cache (and
--no-cacheargument)" (#14), "Add Python interpreter detection" (#11), and "Add support for wheel tag parsing" (#15) appeared in the same week.
The early focus was a pip-compile / pip-sync clone — "Rename commands to pip-sync and
pip-compile" landed in Oct 2023 (#123). The product mental model was "a faster pip-tools,"
not yet a project manager.
The Rename to uv (Feb 2024)
On Feb 2024 the project was renamed to its current name in #1302 "Rename to uv", with
follow-up "Clean up the Puffin CLI" (#755, Jan 2024). The first public release tags
(0.0.5, then the 0.1.x line) appeared shortly after. From this point on, both the binary and
the crate prefix used the uv name.
Windows support (Jan–Mar 2024)
Initial Windows support landed in #940 ("Initial windows support", Jan 2024), with follow-on
work to handle the Windows installer shims (#2284), the Windows Store (#2122), and shebang
quoting on Unix to cope with mixed environments (#2097). The crates/uv-trampoline/ crate —
a separate, nightly-only no_std crate that builds a tiny Windows launcher binary — appears in
this era and is still excluded from the main workspace today.
Universal resolution and the lockfile (Apr–Jun 2024)
uv's defining technical contribution arrived in this era: a single, universal lockfile that resolves for every supported platform and Python version at once.
- Apr 2024 — "uv-resolver: add initial version of universal lock file format" (#3314).
- May 2024 — "uv-resolver: make MarkerEnvironment optional" (the resolver stops needing a single concrete environment).
- Jun 2024 — universal resolution becomes the default for
uv lock(#3969). Subsequent commits in the same month make the resolver respectRequires-Python(#3998), only fork when markers are disjoint (#4135), and useRequires-Pythonto filter dependencies in universal mode.
Workspaces and the project manager (Apr–Jul 2024)
The crates/uv-workspace crate landed in Apr 2024 (#3007 "Add uv-workspace crate with
settings discovery and deserialization"). Over the following months uv evolved from a pip
replacement into a full project manager:
uv add/uv remove/uv lock/uv sync/uv runfor project workflows.pyproject.tomlparsing, mutation, and workspace member discovery.- The
[tool.uv]configuration surface (now ~157 KB of options incrates/uv/src/settings.rs).
A name pivot also happened here: Jul 2024 "Change 'toolchain' to 'python'" (#4735) renamed
what had been called the "toolchain" subsystem (managed Python interpreters) to today's
uv python.
Tools (Jun 2024)
uv tool install arrived in Jun 2024 (#4492), creating per-tool environments under
tool-dir. A few weeks later (#4560) the design pivoted from a single shared tools.toml to
per-tool receipt files (uv-receipt.toml), the model still in use. The uvx alias for
uv tool run follows the same internal flow.
Build backend (Sep–Oct 2024)
uv ships its own PEP 517 backend in addition to its frontend. The
uv-build-backend crate first appears in Oct 2024 with
"Metadata transformation for the build backend" (#7781), giving uv the ability to produce wheels
and sdists for pure-Python projects without invoking an external build tool.
Publish and trusted publishing (Sep 2024 →)
uv publish shipped its first version in Sep 2024 ("Add uv publish: Basic upload with
username/password or keyring", #7475). Trusted publishing (OIDC-based, no long-lived API tokens)
followed in uv-publish/src/trusted_publishing/, with the
GitHub Actions and pyx flavors maintained side by side.
Continuous polish (2025–2026)
The codebase has been under heavy, continuous development since 2025. The 2026 commit pattern
shows the project still adding new commands and capabilities (Wine integration tests, an
uv audit workflow, Python upgrades, alternative download mirrors, dependency-group lock
extensions) at a rate of ~200 commits/month with roughly a quarter of those attributed to
Renovate-style dependency bumps.
Longest-standing features
These pieces have survived the most refactors and remain core to uv today.
| Subsystem | First introduced | Notes |
|---|---|---|
| PEP 440 / PEP 508 parsing | Oct 2023 | Imported as pep440-rs / pep508-rs, renamed to uv-pep440 / uv-pep508, still the foundation for versions/markers everywhere. |
| Wheel installation | Oct 2023 | Originally install-wheel-rs; today crates/uv-install-wheel/. The Layout and LinkMode types still anchor crates/uv-installer/. |
| Virtualenv creation | Oct 2023 | The gourgeist import; today crates/uv-virtualenv/src/virtualenv.rs. |
| HTTP cache | Oct 2023 | "Add an HTTP cache (and --no-cache argument)"; today the layered design in uv-cache + uv-client::cached_client. |
pip interface |
Oct 2023 | The pip-tools-style commands were the original product; today uv pip {compile,sync,install,uninstall,freeze,list,show,tree,check}. |
| PubGrub-based resolver | Late 2023 | Vendored as astral-pubgrub. The resolver has grown forks, conflict markers, exclude-newer, and pre-release modes around it. |
Deprecated and removed features
puffin— the original project name, retired in Feb 2024.- The "toolchain" naming — superseded by
pythonin Jul 2024 (#4735). - Shared
tools.toml— replaced with per-tool receipt files in Jun 2024 (#4560). - Single-environment resolution as default — universal resolution became the
uv lockdefault in Jun 2024. - Bundled
nanoiddependency — removed in Apr 2026 (#19201) once uv's needs could be served by an in-tree implementation. --native-tlsflag andUV_NATIVE_TLSenvironment variable — marked deprecated in Apr 2026 (#18705). Native TLS support remains for now but is no longer the recommended path.
Major rewrites
| When | What changed |
|---|---|
| Feb 2024 | Project rename and CLI cleanup (puffin → uv, #1302, #755) |
| Apr–Jun 2024 | Resolver became a universal solver; uv-resolver/src/lock/ was added and now hosts a 273 KB mod.rs describing the lockfile format |
| Apr 2024 | Project workspace concept added via uv-workspace, opening the door to project commands |
| Jun 2024 | uv tool redesigned around per-tool receipts |
| Jul 2024 | The "toolchain" subsystem renamed to python, with continued growth into managed downloads and a 175 KB discovery.rs |
| 2025 | Steady restructuring of the resolver into separate resolver/, lock/, pubgrub/ modules; the addition of crates/uv-flags, crates/uv-preview, and crates/uv-keyring |
Growth trajectory
uv started as a small set of imported crates in October 2023 and has grown to a workspace of ~70 crates with ~474k lines of Rust across 9000+ commits from 544 distinct authors. Astral has tagged 272 releases in roughly 30 months, averaging about a release per week. Activity in the last 90 days totals 709 commits, of which roughly a quarter are bot- attributed dependency bumps and the remainder human authored.
The dominant authors over the project's lifetime are the Astral core team (Charlie Marsh, Zanie Blue, konsti / Konstantin Schütze, Andrew Gallant, samypr100, William Woodruff), with Renovate handling the long tail of dependency upgrades.
See also
- By the numbers for the current snapshot.
- Fun facts for trivia, including the Puffin / uv naming origin.
- Architecture for the present-day shape these eras produced.
Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.