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.

View source ↗

47 packages · 4 outdated · one call

1 pip call32 parallel PyPI checks0 Python dependencies1-line rollback

--features

Why pyup

01

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.

02

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.

03

Dependency-safe

Reads version specifiers (==, >=, ~=…) from your installed packages and skips upgrades that would violate them. Conflicts mid-upgrade are retried individually.

04

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.

05

Built for CI

--check exits non-zero when packages are outdated, --json emits machine-readable results. Drops straight into GitHub Actions and GitLab CI.

06

Zero Python dependencies

A standalone Rust binary that drives your existing pip or uv. Nothing gets installed into your Python environment.

--compare

How it compares

Featurepyuppip-reviewpipupgradepipuuv-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 dependenciesnone✔✔✔✔
--faq

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

Install & go

Requires Python 3 with pip on your system. For uv-managed environments without pip, run pyup --uv.

Quick start