Poetry is Dead to Me: Why I Switched to uv
4 mins read

Poetry is Dead to Me: Why I Switched to uv

Actually, I should clarify – I held on for as long as I could. Really, I did.

I was the guy in the team chat defending Poetry1 back in 2023. I loved the lockfiles. I loved the deterministic builds. I loved feeling superior to the poor souls still manually editing requirements.txt files like it was 2015. But, well, that’s not entirely accurate – looking at my terminal this morning—February 23, 2026—I realized I haven’t typed poetry add in six months.

The shift happened gradually, then all at once. You know how it goes. First, you try a new tool on a side project because you’re bored. Then you use it on a small work script. Then, suddenly, waiting 45 seconds for dependency resolution feels like a personal insult.

And I saw a stat recently that really drove this home: uv2 has officially overtaken Poetry for Wagtail installations. That’s huge. The Wagtail community is usually pretty conservative (in a good way)—they like stability. If they are moving en masse, the war is over.

The Speed Is Actually Addictive

Let’s be real. The main reason we’re all here is the speed. I know benchmarks can be fake, so I ran my own yesterday on a messy Django 5.2 project I maintain. It has about 140 dependencies if you count the transitive ones.

Here’s what happened on my M3 Pro MacBook:

  • Poetry (1.8.5): 38.2 seconds to resolve and install (fresh env).
  • uv (0.5.4): 0.8 seconds.

I literally thought it failed. I checked the site-packages folder because I didn’t believe it had actually downloaded anything. It had. It’s cached, obviously, but even the cold start on our CI pipeline dropped from 2 minutes to roughly 14 seconds. When you’re deploying ten times a day, that adds up.

It’s Not Just a Pip Replacement Anymore

Python programming code - Python Programming | Boost Skills From Basics to Advanced
Python programming code – Python Programming | Boost Skills From Basics to Advanced

When uv2 first dropped a couple of years ago, it was just “fast pip.” Cool, but I didn’t need to change my whole workflow for it. Now? It’s managing everything.

I finally deleted pyenv last week. That felt weirdly emotional, but — you know what? — why keep it? Uv2 manages Python versions better than pyenv ever did. It doesn’t need to compile them from source half the time, and it links them directly to the project.

Here is my actual workflow now when I start a new microservice:

# Install a specific python version and create venv in one go
uv venv --python 3.13.2

# Activate it (standard stuff)
source .venv/bin/activate

# Install dependencies from pyproject.toml
uv pip install -r pyproject.toml

No waiting for Python to compile. No “shims” breaking my path. It just works.

The “Wagtail Effect”

Back to that Wagtail stat. Why does it matter? Because CMS projects are dependency nightmares. You have the CMS, the Django core, the image processing libraries (Pillow is always fun), the database drivers, and fifty other plugins.

Poetry1 used to choke on these dependency graphs. I remember spending an entire afternoon in late 2024 trying to upgrade a project where Poetry just spun its wheels, consuming 8GB of RAM, before crashing with a solver error.

Uv2 uses a different resolver strategy (PubGrub, written in Rust) that probably cuts through these knots instantly. I tested this on a legacy Wagtail 6.2 site we’re still maintaining. The uv pip compile command generated a lockfile in seconds where pip-tools used to take a solid minute.

The One Thing That Still Annoys Me

It’s not all perfect. I’m not going to sit here and tell you it is.

My biggest gripe right now is how it handles certain private feeds. We have an internal PyPI server that requires specific auth headers. And, well, that’s not entirely accurate – with pip, I had a messy global config. With Poetry1, I had it in the pyproject.toml (which was bad security practice, I know).

With uv2, I had to fight with environment variables for an hour before I got it to talk to our Artifactory instance. It works, but the error messages were… cryptic. “401 Unauthorized” doesn’t tell me which credential it tried to use.

Moving Off Poetry (Practical Tips)

If you’re still on Poetry1 and thinking about jumping ship, don’t overthink it. You don’t even need to fully commit right away. You can use uv2 to install from a poetry.lock file, which is a hilarious power move.

# This actually works
uv pip install --system -r <(uv pip compile pyproject.toml --emit-index-url)

But really, you should just switch to standard pyproject.toml metadata. Poetry1‘s proprietary dependency declaration was always a bit of a lock-in trap.

I converted our main repo last Tuesday. Here is the snippet from the pyproject.toml that replaced the Poetry section. It’s standard PEP 6213, which means if uv

Leave a Reply

Your email address will not be published. Required fields are marked *