wheelripe

Notes · 2026-10-13

Which of your dependencies have no wheel for Python 3.15 yet?

CPython 3.15 shipped in October 2026, and the free-threaded build (3.15t) is now supported. Within days the same issue appears on dozens of trackers: “add Python 3.15 support”, followed by a hand-made list of which dependencies do and do not have wheels yet.

The question nobody's tooling answers

Look at harlequin#1119 or dynamic-des#40: maintainers open PyPI for each dependency, scroll the file list and look for cp315. Then they do it again for 3.15t, where abi3 wheels do not count. Then again for macOS and Windows. Then again next week.

pip does not help much: it stops at the first package that needs a compiler, needs the target interpreter on each OS, and never says which newer release would have worked. Dependabot and Renovate bump versions but do not know about wheel tags.

What wheelripe does

It reads your lockfile (uv, PEP 751, Poetry, Pipenv, requirements, pyproject) and fetches each package's file list from the PyPI JSON API — one request per package. For each target platform it applies the same tag rules pip uses: interpreter, ABI (including PEP 803 abi3t), and platform with your glibc/macOS floor.

$ uvx --from git+https://github.com/Blackman99/wheelripe wheelripe uv.lock -p 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
NOT RIPE for CPython 3.15: 1 blocked upstream · 1 needs a version bump

The useful distinction is bump versus blocked. A bump you can do today. A blocker you wait on — the report links the upstream project so you can watch it.

Trusting the answer

Tag matching has corners: manylinux floors, legacy aliases, universal2, abi3 on free-threaded builds, compressed tag sets. So wheelripe's CI asks pip itself (--dry-run --only-binary=:all: with explicit Python/ABI/platform) about 26 real packages on 7 platforms for both 3.15 and 3.15t, and installs on real 3.15/3.15t interpreters. Any disagreement turns CI red.

Make CI tell you

- uses: Blackman99/wheelripe@v0.1.0
  with:
    python-version: "3.15t"
    fail-on: blocked

Run it weekly. The job goes green the week your last blocker ships a wheel. There is also an MCP server so a coding agent can check before it touches requires-python.

Docs · GitHub