Rust CLI · v0.1.1 · Apache-2.0
Every outdated package.
One command.
pyup checks all your installed Python packages against PyPI in parallel and upgrades the outdated ones with a single pip install call — dependency-safe, rollback-ready, zero Python dependencies.
47 packages · 4 outdated · one call
numpy==2.2.1 pydantic==2.10.4
1 pip call32 parallel PyPI checks0 Python dependencies1-line rollback
Why pyup
One pip call
Every outdated package goes into a single pip install --upgrade, so pip’s resolver sees all constraints at once — faster and safer than per-package installs.
Parallel PyPI checks
Up to 32 packages checked simultaneously through a streaming fast path that reads ~8KB per response instead of 12MB+ of release metadata for heavy packages.
Dependency-safe
Reads version specifiers (==, >=, ~=…) from your installed packages and skips upgrades that would violate them. Conflicts mid-upgrade are retried individually.
One-line rollback
A snapshot of pre-upgrade versions is saved automatically before every upgrade. If something breaks, pyup --rollback restores everything in a single pip call.
Built for CI
--check exits non-zero when packages are outdated, --json emits machine-readable results. Drops straight into GitHub Actions and GitLab CI.
Zero Python dependencies
A standalone Rust binary that drives your existing pip or uv. Nothing gets installed into your Python environment.
How it compares
| Feature | pyup | pip-review | pipupgrade | pipu | uv-outdated |
|---|---|---|---|---|---|
| Single pip call | ✔ | — | — | — | — |
| Streaming fast path | ✔ | — | — | — | — |
| uv support | ✔ | — | — | — | ✔ |
| Dependency constraints | ✔ | — | — | ◐ | — |
| --target patch/minor/major | ✔ | — | — | — | — |
| CI mode (--check / --json) | ✔ | — | — | — | — |
| Requirements file sync | ✔ | — | ✔ | ✔ | — |
| Rollback | ✔ | — | — | ✔ | — |
| Post-upgrade pip check | ✔ | — | — | ✔ | — |
| Python dependencies | none | ✔ | ✔ | ✔ | ✔ |
Questions
What is pyup?
pyup is a fast, lightweight command-line tool written in Rust that checks every installed Python package against PyPI in parallel and upgrades all outdated packages with a single pip install call. It’s a standalone binary with zero Python dependencies, supports uv-managed environments, and automatically snapshots versions before upgrading so you can roll back with pyup --rollback.
How is pyup different from pip-review?
pip-review upgrades packages one at a time. pyup collects all outdated packages and upgrades them in a single pip install call — faster, and pip’s resolver sees every constraint at once. pyup is also a standalone Rust binary with no Python dependencies.
Will pyup break my dependencies?
Before upgrading, pyup reads dependency specifiers from your installed packages and never upgrades a package beyond what others allow. If pip still hits a conflict during the upgrade, pyup retries packages individually and skips the conflicting ones, then runs pip check to verify the environment.
Does it work with uv?
Yes. Run pyup --uv to use uv pip commands instead of python -m pip — required for uv-managed virtual environments that don’t include pip.
Can I use it in CI?
pyup --check fails the build when packages are outdated; pyup --json --check adds machine-readable output. Both exit with code 1 when outdated packages are found.
What if an upgrade breaks something?
Every upgrade saves a snapshot of pre-upgrade versions to .pyup-snapshot.json. Run pyup --rollback to restore all packages in a single pip call — the snapshot is deleted after a successful rollback.
Install & go
Requires Python 3 with pip on your system. For uv-managed environments without pip, run pyup --uv.
Quick start