Yesterday the Python team shipped 3.15.1 and 3.14.9. The release I actually care about this month is a different one: on October 1, 2026, Python 3.10 reached end of life. No more bugfix releases, no more security patches. 3.10.22 is the last one, forever.
I know this because a small tool of mine runs on it.
The tool
I built a small offline utility for myself that reads Swiss administrative letters - payment orders, reminders, official forms - and extracts the parts that matter: who wants money, how much, by when. It runs locally, with the model on localhost, which is the whole point: these letters contain exactly the data you don't paste into a chatbot.
The constraint I gave myself was brutal and deliberate: Python standard library only. No pip install, no packages, no virtualenv. The result is about 306 lines of plain Python that can run with whatever interpreter is already there.
That interpreter, on that machine, is Python 3.10.
Why I pinned myself to 3.10 in the first place
Choosing "stdlib only" sounds like a purist stance. It was actually an operational one. Every dependency is a supply chain you have to watch. Every install is a small ceremony. The standard library, on the other hand, is just there - same version as the interpreter, tested together, no network required.
The side effect I didn't fully think through: pinning to stdlib quietly pins you to the interpreter too. My code uses nothing newer than 3.10, so it runs everywhere from 3.10 up. But the machine itself still carries 3.10, and as of this month, that version gets nothing. Not even security fixes.
What end-of-life actually means here
Let me be precise, because "EOL" gets thrown around loosely. Python 3.10 entered security-only mode back in 2023, which means it has only received security patches since then. As of October 1, 2026, it receives nothing at all. If a vulnerability is found in the 3.10 interpreter tomorrow, there will be no official fix.
How much does that matter for my tool? Less than for a web service, more than zero. My threat model is narrow but real: the program handles letter text that arrives from outside. A maliciously crafted document attacking an unpatched interpreter bug is a theoretical attack path. For an offline single-user tool, it's a path I'm willing to walk for a few more weeks, not a path I want to live on.
The upgrade is cheap, and that's the payoff
Here's the part that makes me glad about the stdlib decision. Migrating a project off an EOL Python is usually painful because of dependencies: some package pins an old version, some C extension needs rebuilding, some transitive thing breaks. I have none of that. My entire dependency tree is the standard library, and the standard library's promise is backwards compatibility within reason.
So the plan is boring: install 3.15, run the tool, run a handful of test letters through it, compare outputs. If 306 lines of stdlib Python don't survive a five-version jump, something has gone very wrong in the world. The release notes for 3.15 even work in my favor: UTF-8 is now the default encoding (PEP 686), which removes one of the few places where my file-reading code could behave differently across systems.
There's also one new 3.15 feature that fits the tool's shape: explicit lazy imports (PEP 810). The tool starts, reads one letter, prints, exits. Startup time is most of its runtime. Lazy imports are made for exactly this shape of program.
The actual lesson
Dependencies are a bet. Every package you add is a bet that someone will keep maintaining it, that it will keep working with your Python version, and that you'll be online when you need to fix it. For this tool I bet on the standard library, and the bet paid off in an unexpected place: end-of-life day. When your Python version dies, the size of your problem is roughly the size of your dependency tree. Mine is zero packages, so my problem is an afternoon, not a project.
If you maintain anything still on 3.10 - and a lot of long-lived internal tools are - the clock that started on October 1 is real. The good news from yesterday's releases is that the landing spot is excellent. 3.15.1 is waiting.
Top comments (0)