The newer the Python, the more holes in the cheese.
wheelripe reads your lockfile and, for the Python you want to move to and every platform you ship, tells you which dependencies would fall back to a source build — and the first release of each that fixes it.
When a new CPython comes out (3.15 landed in October 2026, with a supported free-threaded 3.15t build), most upgrades stall on the same question: which of our dependencies have wheels for it yet? Today people answer it by trying an install, reading the error, opening PyPI for each package, scrolling the file list, and repeating per platform. wheelripe does that for every package at once, without installing anything, using the same tag rules pip uses.
What you get
$ wheelripe uv.lock --python 3.15
BLOCKED confluent-kafka 2.16.0 no cp315 wheel for any target platform (ships cp38–cp314)
BUMP numpy 1.26.4 → 2.5.2 no cp315 wheel in 1.26.4 (ships cp39–cp312); 2.5.2 is the first release with one
BUMP pydantic_core 2.41.5 → 2.48.0 no cp315 wheel in 2.41.5 (ships cp39–cp314); 2.48.0 is the first release with one
READY 1 package (0 with binary wheels · 1 pure Python)
NOT RIPE for CPython 3.15: 1 blocked upstream · 2 need a version bump- BUMP your pinned version has no wheel, a newer release does; wheelripe names the first one.
- BLOCKED no release has a wheel yet; you are waiting on upstream (the report links the project).
- EXCLUDED the release's
requires-pythonrules your target out. - BUILD only an sdist exists for any Python; usually fine for pure-Python packages.
- READY a matching wheel exists: version-specific, stable ABI (abi3/abi3t) or pure Python.
Three ways to run it
CLI on your laptop, GitHub Action on a schedule so CI tells you the week you become ripe, and an MCP server so your coding agent can check before it bumps requires-python.