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.

Diagram: pyproject.toml flows through uv sync into uv.lock and a virtualenv; just recipes run uv run commands

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 justfile anyone 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)

  1. Install uvhttps://docs.astral.sh/uv/ (standalone installer; no Python required first).
  2. Install justhttps://github.com/casey/just (single binary).
  3. Export dependencies from PDM’s lock or pyproject.toml — usually [project.dependencies] already exists.
  4. Run uv lock then uv sync at repo root.
  5. Move [tool.pdm.scripts] entries into a justfile, one recipe per script.
  6. Update CI to uv sync + just ci (or your recipe names).
  7. Remove PDM-only files from git (.pdm-python, pdm.lock) after the team confirms uv works.
  8. Document just --list in 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