Uv is fantastic, but its package management UX is a mess

Python’s favorite speed machine is getting roasted for making simple updates feel weird

TLDR: uv is winning fans for speed but catching heat because routine updates feel clunky and can be risky by default. In the comments, critics called the article overblown, defenders said the weird choices are unavoidable, and even a uv developer admitted some of the complaints were fair.

Astral’s uv is still being treated like a superstar in the Python world: it’s fast, it’s tidy, and fans love that one tool can replace a small pile of older ones. But the mood in the comments around this critique was less “cancelled” and more “we love you, but please fix this chaos.” The article argues that once the honeymoon phase ends and you try to do boring maintenance tasks—like checking what needs updating—uv suddenly feels awkward, with long commands and risky default update behavior that could pull in major breaking changes.

That set off a lively comment-section brawl. One camp said the headline was way too dramatic, with one reader basically rolling their eyes and saying this is not “a mess,” it’s just a couple of quality-of-life tweaks. Another camp said the scary-looking version rules are intentional, because Python works differently than JavaScript and can’t safely copy the same update style. Translation for non-coders: some people think uv’s odd behavior is a design compromise, not a blunder.

Then came the deliciously awkward twist: a uv developer dropped into the thread and admitted a lot of the feedback was actually useful—even while lightly dragging the article for being clickbait. That only fueled the popcorn energy. Other users chimed in with their own “I fought uv today” stories, turning the whole discussion into a classic tech drama: beloved tool, annoyed fans, defensive experts, and just enough self-awareness to keep it funny.

Key Points

  • The article says uv is fast, handles Python versions well, and simplifies initial project setup with a single binary.
  • It argues that checking outdated packages in uv is less convenient because the workflow relies on `uv tree --outdated --depth 1` rather than a dedicated `uv outdated` command.
  • The article states that uv defaults to dependency constraints without upper bounds, using `pydantic>=2.13.4` as an example.
  • It says `uv lock --upgrade` upgrades the lockfile and can pull in the latest versions of all dependencies, including nested ones.
  • The article notes that uv has recently introduced a `--bounds` option for `uv add` as a potential improvement.

Hottest takes

“better title: ‘QOL changes i wish UV had’” — arpadav
“there is just no better solution here” — the_mitsuhiko
“useful feedback, even if phrased in a clickbait style” — woodruffw
Made with <3 by @siedrix and @shesho from CDMX. Powered by Forge&Hive.