PDM is a solid Python package manager — but in 2026 many solo devs and small teams prefer uv (from Astral, the Ruff team) for dependency work and just for project commands. Together they replace slow installs, opaque script config, and “why does CI differ from my laptop?” moments.
This guide explains concrete advantages over PDM, how to migrate, and patterns that work on Windows, Linux, and CI.
Quick verdict: when uv + just beats PDM
| Need | PDM | uv + just |
|---|---|---|
| Install speed on fresh clone | Good | Often 5–20× faster (Rust resolver + cache) |
| Lockfile in git | pdm.lock |
uv.lock (same idea, fast refresh) |
| Running project scripts | [tool.pdm.scripts] in TOML |
justfile — readable, composable |
| Monorepo / workspace | Supported | [tool.uv.workspace] — first-class |
| Drop-in pip compatibility | Via PDM | uv pip + standard pyproject.toml |
| Onboarding new contributors | Read PDM docs + scripts table | uv sync + just --list |
If PDM already works and your team is happy, don’t migrate for hype. Switch when install time, CI minutes, or script sprawl actually hurt you.
Why developers leave PDM for uv
1. Speed where it matters
Every pdm install on a cold CI runner or a new laptop costs time. uv resolves and installs with a Rust core and aggressive caching. For medium projects the difference is often seconds vs minutes — meaningful when you run CI on every push.
2. One mental model with the wider ecosystem
uv speaks standard PEP 621 pyproject.toml. You are not locked into PDM-specific plugin quirks. Tools, tutorials, and hires who know pip / venv / pyproject map cleanly to uv.
3. Lockfile you commit — without friction
Like PDM, uv uses a committed lockfile (uv.lock) so everyone gets the same dependency graph. Regenerating locks after a dependency bump is fast enough that people actually do it before opening a PR.
4. Workspaces for monorepos
Multi-package repos (app + library + agent subproject) fit [tool.uv.workspace]:
[tool.uv.workspace]
members = ["Micronation"]
One uv sync at the root installs the workspace — similar goal to PDM’s monorepo support, but uv’s CLI is tuned for this workflow and pairs well with a single root justfile.
5. Less hidden state
PDM users sometimes fight .pdm-python paths or interpreter drift. uv’s default is a project-local .venv you recreate with uv sync. Fewer “works on my machine” interpreter surprises.
Why add just on top (instead of PDM scripts alone)
PDM can define scripts in pyproject.toml. That works for three commands — it gets cramped when you have build, deploy, lint, agent dashboards, and SEO pipelines.
just gives you:
- A
justfileanyone can read without parsing nested TOML - Parameters (
just task "my title") and defaults - Documentation via
just --list— great for open-source READMEs - Composition — recipes call other recipes (
seo-deploy→ build → Cloudflare)
Example from a real multi-tool repo:
seo-build-all:
uv sync
uv run python dev-seo/build.py
seo-deploy project='the-thread':
powershell -File scripts/seo_deploy.ps1 -Project {{project}}
Developers run just seo-build-all, not a long shell one-liner they paste from Slack.
PDM vs uv + just: side-by-side commands
| Task | PDM | uv + just |
|---|---|---|
| Install deps | pdm install |
uv sync |
| Add package | pdm add requests |
uv add requests |
| Run script | pdm run pytest |
uv run pytest or just test |
| List commands | Read pyproject.toml |
just --list |
| CI install | pip install pdm && pdm install |
curl/install uv && uv sync |
Migration from PDM (practical checklist)
- Install uv — https://docs.astral.sh/uv/ (standalone installer; no Python required first).
- Install just — https://github.com/casey/just (single binary).
- Export dependencies from PDM’s lock or
pyproject.toml— usually[project.dependencies]already exists. - Run
uv lockthenuv syncat repo root. - Move
[tool.pdm.scripts]entries into ajustfile, one recipe per script. - Update CI to
uv sync+just ci(or your recipe names). - Remove PDM-only files from git (
.pdm-python,pdm.lock) after the team confirms uv works. - Document
just --listin the README first line.
Keep pyproject.toml as the source of truth for metadata and dependencies — only the tooling layer changes.
Real-world layout (monorepo-friendly)
my-repo/
pyproject.toml # root deps + [tool.uv.workspace]
uv.lock # commit
justfile # human-facing commands
.venv/ # local (gitignore)
Micronation/ # workspace member with its own pyproject.toml
dev-seo/ # static site generator
scripts/ # called by just recipes
Cloudflare Pages or static deploy example:
uv sync
uv run python dev-seo/build.py
# output: dev-seo/dist
Wrap that in just seo-deploy so deploy steps (build, wrangler, sitemap) stay repeatable.
Windows and PowerShell notes
On Windows PowerShell 5.1, && between commands often fails. Prefer:
just seo-build-all
# or
uv sync; uv run python dev-seo/build.py
Set PATH so uv and just resolve in CI and local shells (WinGet Links, %USERPROFILE%\.local\bin).
CI snippet (GitHub Actions style)
- uses: astral-sh/setup-uv@v5
- run: uv sync --frozen
- run: just test
--frozen fails if uv.lock is out of date — good guardrail for teams.
Who should stay on PDM?
- Teams with PDM plugins deeply wired into release flow
- Organizations that standardized on PDM and retraining cost is high
- Projects where install time is already negligible
For greenfield Python repos and solo freelancers, uv + just is the default we recommend in choosing a tech stack in 2026.
FAQ
Is uv a replacement for PDM or for pip? Both, in practice. uv replaces PDM’s install/lock/run role and can replace pip/venv for day-to-day work. You still use standard pyproject.toml.
Can I migrate gradually? Yes. Run uv alongside PDM on a branch until uv sync and tests pass, then remove PDM from CI.
Does just replace Make? For project recipes, yes — simpler syntax, cross-platform, great for Python repos. Heavy C++ builds may still want Make or Ninja.
Is uv production-ready? Astral ships it for serious use; pin uv in CI (setup-uv) and commit uv.lock. Treat upgrades like any toolchain change.
What about Poetry? Same story as PDM: Poetry works; uv wins on speed and simplicity if you do not need Poetry-specific packaging features.
→ Related: Choose a tech stack in 2026 · Remote work tools for developers · Best free AI tools