PyPI Starts Rejecting New Files on Releases Older Than 14 Days
A policy years in discussion finally shipped after two popular packages were compromised through exactly the gap it closes.
The Python Package Index announced on July 22, 2026 that it now rejects uploads of new files to any release older than 14 days. Once a release passes that window, its file list is effectively frozen -- a maintainer who wants to publish a fix has to cut a new release rather than add a file to an old one.
The change targets a specific attack pattern: if a project's publishing credentials or CI workflow are compromised, an attacker can upload a malicious file to an existing, already-trusted release instead of publishing an obviously new one, letting the compromise hide inside a version number users already depend on. Locking releases after two weeks closes that window for the vast majority of legitimate publishing activity, which PyPI's own analysis found rarely happens that late anyway.
The proposal itself is not new. It was first discussed during PEP 740's digital-attestations work back in January 2024, then stalled without consensus. It gained new urgency after supply-chain compromises of the popular litellm and telnyx packages in March 2026, both of which involved files added to existing releases after the fact. PyPI Safety and Security Engineer Mike Fiedler restarted the discussion, and it moved forward with support from the 2026 Packaging Summit at PyCon US.
Before shipping the restriction, PyPI checked how many projects would actually be affected: of the top 15,000 packages, only 56 had published a new file to a release more than 14 days after that release first went out, most of them adding a wheel to support a Python version that came out after the original release. PyPI's position is that those maintainers can reasonably be asked to cut a new patch release instead.
The restriction is a stopgap ahead of more formal tooling. PyPI expects the underlying semantics to eventually be handled properly through PEP 694's proposed "Upload 2.0" API and a staged-preview mechanism, which would let maintainers stage and verify a release before it goes fully live rather than relying on a fixed time window after the fact.
Source: PyPI Blog — Releases now reject new files after 14 days
