---
title: "pillow Breaking Changes on PyPI | Since.dev"
description: "What each pillow release removed, renamed or changed: 90 breaking changes in 2 versions on PyPI, each with its source."
canonical_url: https://since.dev/packages/pypi/pillow
last_updated: 2026-10-16
---

# 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

## 13.0.0

51 breaking changes, first published October 16, 2026.

- **Removed**  

Python 3.10 is no longer supported. Users on Python 3.10 must upgrade their Python version. [github.com](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- **Removed**  

Previously deprecated features scheduled for removal in 13.0.0 were removed. Code relying on them will break. [github.com](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- **Removed** `GifImagePlugin._save_netpbm`  

GifImagePlugin.\_save_netpbm was removed. Code that calls it directly will fail and should stop using it. [github.com](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- **Removed** `PIL.ExifTags.IFD.Makernote`  

ExifTags.IFD.Makernote was removed. Code that references it will fail. [pypi.org](https://pypi.org/project/pillow/13.0.0/)
- **Removed** `PIL.FliImagePlugin.o8`  

PIL.FliImagePlugin.o8 was removed in pillow 13.0.0 [pypi.org](https://pypi.org/project/pillow/13.0.0/)
- **Removed** `PIL.GifImagePlugin.ImageMath`  

PIL.GifImagePlugin.ImageMath was removed in pillow 13.0.0 [pypi.org](https://pypi.org/project/pillow/13.0.0/)
- **Removed** `PIL.GifImagePlugin.ImageOps`  

PIL.GifImagePlugin.ImageOps was removed in pillow 13.0.0 [pypi.org](https://pypi.org/project/pillow/13.0.0/)
- **Removed** `PIL.Image.Image.get_child_images`  

PIL.Image.Image.get_child_images was removed in pillow 13.0.0 [pypi.org](https://pypi.org/project/pillow/13.0.0/)
- **Removed** `PIL.Image.logger`  

PIL.Image.logger was removed in pillow 13.0.0 [pypi.org](https://pypi.org/project/pillow/13.0.0/)
- **Removed** `PIL.Image.SupportsArrayInterface.__len__`  

PIL.Image.SupportsArrayInterface.\_\_len\_\_ was removed in pillow 13.0.0 [pypi.org](https://pypi.org/project/pillow/13.0.0/)

And 41 more in this version.

## 12.3.0

39 breaking changes, first published July 1, 2026.

- **Removed**  

Pillow no longer ships experimental free-threaded wheels for Python 3.13. [github.com](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- **Removed**  

Wheels are no longer built for manylinux2014 or Amazon Linux 2 platforms. [github.com](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- **Removed** `ImageCms`  

Non-image modes are no longer accepted by ImageCms. Code that relied on them must use image modes instead. [github.com](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- **Removed** `PIL.ImageText.Font`  

PIL.ImageText.Font was removed in pillow 12.3.0 [pypi.org](https://pypi.org/project/pillow/12.3.0/)
- **Behavior changed** `ImageDraw.line`  

Drawing a line or arc with width zero now draws nothing. [github.com](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- **Behavior changed** `ImageMath.unsafe_eval`  

Expressions evaluated by ImageMath.unsafe_eval no longer receive the globals previously set for eval(). [github.com](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- **Behavior changed** `ImageOps.expand`  

An unsupported border format now raises ValueError instead of being accepted. [github.com](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- **Default changed** `ImageGrab.grab`  

Screenshots from macOS retina displays keep their full size unless resizing is requested. [github.com](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- **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](https://pypi.org/project/pillow/12.3.0/)
- **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](https://pypi.org/project/pillow/12.3.0/)

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](https://since.dev/scan.md), or have your coding agent call `check_code` with your manifest or lockfile over [MCP](https://since.dev/docs.md#mcp). [The API](https://since.dev/docs.md#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.

[Scan a repository](https://since.dev/scan.md). Any public GitHub repository. No sign-in.

### Tell your agent what changed since it was trained.

`claude mcp add --transport http since https://api.since.dev/mcp`

---

Every page on this site as Markdown: https://since.dev/sitemap.md. For agents: https://since.dev/llms.txt.
