pillow breaking changes
Every breaking API change we have recorded in pillow on PyPI: 90 breaking changes in 2 versions. Below are its newest 2 versions, removals and renames first, each with its source.
Newest change October 16, 2026

On this page
13.0.0
- Removed
Python 3.10 is no longer supported. Users on Python 3.10 must upgrade their Python version. github.com - Removed
Previously deprecated features scheduled for removal in 13.0.0 were removed. Code relying on them will break. github.com - Removed
GifImagePlugin._save_netpbm
GifImagePlugin._save_netpbm was removed. Code that calls it directly will fail and should stop using it. github.com - Removed
PIL.ExifTags.IFD.Makernote
ExifTags.IFD.Makernote was removed. Code that references it will fail. pypi.org - Removed
PIL.FliImagePlugin.o8
PIL.FliImagePlugin.o8 was removed in pillow 13.0.0 pypi.org - Removed
PIL.GifImagePlugin.ImageMath
PIL.GifImagePlugin.ImageMath was removed in pillow 13.0.0 pypi.org - Removed
PIL.GifImagePlugin.ImageOps
PIL.GifImagePlugin.ImageOps was removed in pillow 13.0.0 pypi.org - Removed
PIL.Image.Image.get_child_images
PIL.Image.Image.get_child_images was removed in pillow 13.0.0 pypi.org - Removed
PIL.Image.logger
PIL.Image.logger was removed in pillow 13.0.0 pypi.org - Removed
PIL.Image.SupportsArrayInterface.__len__
PIL.Image.SupportsArrayInterface.__len__ was removed in pillow 13.0.0 pypi.org
And 41 more in this version.
12.3.0
- Removed
Pillow no longer ships experimental free-threaded wheels for Python 3.13. github.com - Removed
Wheels are no longer built for manylinux2014 or Amazon Linux 2 platforms. github.com - Removed
ImageCms
Non-image modes are no longer accepted by ImageCms. Code that relied on them must use image modes instead. github.com - Removed
PIL.ImageText.Font
PIL.ImageText.Font was removed in pillow 12.3.0 pypi.org - Behavior changed
ImageDraw.line
Drawing a line or arc with width zero now draws nothing. github.com - Behavior changed
ImageMath.unsafe_eval
Expressions evaluated by ImageMath.unsafe_eval no longer receive the globals previously set for eval(). github.com - Behavior changed
ImageOps.expand
An unsupported border format now raises ValueError instead of being accepted. github.com - Default changed
ImageGrab.grab
Screenshots from macOS retina displays keep their full size unless resizing is requested. github.com - Signature changed
PIL.BlpImagePlugin.BLP1Decoder.decode
Was def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]; now def decode(self, buffer: Image.DecoderInput) -> tuple[int, int]. pypi.org - Signature changed
PIL.BlpImagePlugin.BLP1Decoder.set_as_raw
Was def set_as_raw(self, data: bytes, rawmode: str | None = None, extra: tuple[Any, ...] = ()) -> None; now def set_as_raw(self, data: bytes | bytearray, rawmode: str | None = None, extra: tuple[Any, ...] = ()) -> None. pypi.org
And 29 more in this version.
Check your code
These are the changes. To see which of them reach your code, scan a public repository, or have your coding agent call check_code with your manifest or lockfile over MCP. The API reads every change in every version, not only the newest. On Team and up, a fix pull request opens for the changes that reach a connected repository. Nothing merges or deploys.

Put your code on continuous management.
Scan a public repository now, or give your agent one line.
See how out of date your code is.
Tell your agent what changed since it was trained.
claude mcp add --transport http since https://api.since.dev/mcp