Is there an existing issue for this?
- I have searched the existing issues (none found for Python 3.14 / imagekit / this 500).
Current Behavior
After the image updated to v2.9.2-ls243 (build date 2026-08-02), which moved the base to Python 3.14.5 (the previous -ls242 build was on Python 3.13), every authenticated page returns HTTP 500. GET /dashboard/ — and any page that renders a child profile thumbnail — raises:
Django Version: 5.2.14
Python Version: 3.14.5
Exception Type: TypeError
Exception Value: _Pickler._batch_setitems() missing 1 required positional argument: 'obj'
Exception Location: /lsiopy/lib/python3.14/site-packages/imagekit/hashers.py, line 22, in save_dict
Raised during: dashboard.views.Dashboard
Error during template rendering
In template /app/www/public/core/templates/core/child_thumbnail.html, at line 3
{% thumbnail '40x40' child.picture as thumb %}
File ".../imagekit/hashers.py", line 22, in save_dict
self._batch_setitems(sorted(obj.items()))
when serializing pilkit.processors.resize.Thumbnail state
Root cause: the image bundles django-imagekit 5.0.0, whose CanonicalizingPickler.save_dict calls self._batch_setitems(sorted(obj.items())). Python 3.14 changed that private pickle API to _batch_setitems(self, items, obj). django-imagekit fixed this in 6.0 (matthewwithanm/django-imagekit#583, "Support Python 3.14"; current release 6.1). However Baby Buddy's Pipfile pins django-imagekit = "~=5.0" (i.e. <6.0), so this ls243 build ends up shipping imagekit 5.0.0 on a Python 3.14 base — incompatible. So the trigger is the base image moving to Python 3.14 while the app's dependency pin can't pull the fixed imagekit.
Tracked upstream (app side) at babybuddy/babybuddy#1103.
Secondary 500: when django-axes (7.1.0) locks an account, GET /login/lock also returns 500 with TemplateSyntaxError: add requires 2 arguments, 1 provided while rendering the lockout message under Django 5.2 / Python 3.14.
Expected Behavior
Authenticated pages load (HTTP 200), as on v2.9.2-ls242 (Python 3.13).
Steps To Reproduce
- Deploy
lscr.io/linuxserver/babybuddy:v2.9.2-ls243.
- Have a child with a profile picture uploaded.
- Log in →
GET /dashboard/ → HTTP 500.
(Depends on a child having a picture — the thumbnail render is what triggers the imagekit pickle path.)
Environment
- OS: TrueNAS / Debian docker host, x86_64
- Image: lscr.io/linuxserver/babybuddy
- Tag: v2.9.2-ls243 (revision e4c072eeb77b0af7b658eb98559be7754fb10093, build 2026-08-02)
- Baby Buddy: 2.9.2
- Django: 5.2.14
- Python: 3.14.5
- django-imagekit: 5.0.0
- pilkit: 3.0
- django-axes: 7.1.0
- Database: SQLite (default)
Suggested resolution
Either keep/pin the Python base at 3.13 until the app allows a Python-3.14-compatible django-imagekit, or coordinate with Baby Buddy upstream (babybuddy/babybuddy#1103) to relax the django-imagekit = "~=5.0" pin to allow >=6.0. Rolling back to v2.9.2-ls242 is a confirmed workaround (same Baby Buddy version, data unaffected).
Is there an existing issue for this?
Current Behavior
After the image updated to
v2.9.2-ls243(build date 2026-08-02), which moved the base to Python 3.14.5 (the previous-ls242build was on Python 3.13), every authenticated page returns HTTP 500.GET /dashboard/— and any page that renders a child profile thumbnail — raises:Root cause: the image bundles django-imagekit 5.0.0, whose
CanonicalizingPickler.save_dictcallsself._batch_setitems(sorted(obj.items())). Python 3.14 changed that private pickle API to_batch_setitems(self, items, obj). django-imagekit fixed this in 6.0 (matthewwithanm/django-imagekit#583, "Support Python 3.14"; current release 6.1). However Baby Buddy'sPipfilepinsdjango-imagekit = "~=5.0"(i.e.<6.0), so this ls243 build ends up shipping imagekit 5.0.0 on a Python 3.14 base — incompatible. So the trigger is the base image moving to Python 3.14 while the app's dependency pin can't pull the fixed imagekit.Tracked upstream (app side) at babybuddy/babybuddy#1103.
Secondary 500: when django-axes (7.1.0) locks an account,
GET /login/lockalso returns 500 withTemplateSyntaxError: add requires 2 arguments, 1 providedwhile rendering the lockout message under Django 5.2 / Python 3.14.Expected Behavior
Authenticated pages load (HTTP 200), as on
v2.9.2-ls242(Python 3.13).Steps To Reproduce
lscr.io/linuxserver/babybuddy:v2.9.2-ls243.GET /dashboard/→ HTTP 500.(Depends on a child having a picture — the thumbnail render is what triggers the imagekit pickle path.)
Environment
Suggested resolution
Either keep/pin the Python base at 3.13 until the app allows a Python-3.14-compatible django-imagekit, or coordinate with Baby Buddy upstream (babybuddy/babybuddy#1103) to relax the
django-imagekit = "~=5.0"pin to allow>=6.0. Rolling back tov2.9.2-ls242is a confirmed workaround (same Baby Buddy version, data unaffected).