uv is fantastic, but its package management UX is a mess
Astral’s uv has taken the Python world by storm, and for good reason. It is blisteringly fast, handles Python versions with ease, and replaces a half-dozen tools with a single binary. I’ve written multiple articles about it before.
Getting started with a new Python project using uv and adding your first dependencies is very easy. But once you move past the initial setup and into the maintenance phase of a project, i.e. checking for outdated packages and performing routine upgrades, the CLI starts to feel surprisingly clunky compared to its peers like pnpm or Poetry.
Finding outdated packages
In my JavaScript projects, if I want to see what needs an update, I run:
$ pnpm outdated
This gives a clean, concise list of outdated packages, their current version, the latest version, and the version allowed by your constraints.
In uv, there is no uv outdated . Instead, you have to memorize the following mouthful:
$ uv tree --outdated --depth 1
The output is also a problem. It doesn’t just show you what is outdated; it shows you your entire top-level dependency tree, with a small annotation next to the ones that have updates available. If you have 50 dependencies and only two are outdated, you still have to scan a 50-line list.
... continue reading