v4.0.0-beta.9 (2026-11-13)
🚀 Features
- read the saved crop and focal point from _transforms (#19547) (ae5e1dc)
- add label, type and details to sessions (#19492) (b3c508f)
- serve historical upload variants and replay transforms on restore (#19474) (af30c3e)
- ui: export standalone CSS tokens (#19472) (fd82d9d)
🐛 Bug Fixes
- respect custom admin routes during upgrades through CPA (#19484) (f2f8ee5)
- bump minimum node version to 24.22.3 (#19555) (94372c8)
- preserve transaction failures and clean up sessions (#19159) (397fa9c)
- pass the request to db.findOne in findByID (#19488) (7a80820)
- deps: bump the non-major group with 1 updates (#19500) (90b4962)
- drizzle: limit atomic updates with a locking subquery (#19214) (a5c71f3)
- ui: await persistence of merged preference writes (#19157) (7fdf644)
🛠 Refactors
- split generateFileData into focused steps (#19558) (0e9d165)
- keep latest version helpers internal (#19548) (f6189b5)
📚 Documentation
⚙️ CI
- allow ubuntu-26.04 runner label in actionlint (#19546) (6251cee)
- use the breaking changes section of PR bodies in release notes (#19554) (0ec1c0f)
🏡 Chores
⚠️ BREAKING CHANGES
-
bump minimum node version to 24.22.3 (#19555) (94372c8)
Applications on Node.js
24.xbefore24.22.3, on Node.js25.x, or
on Node.js26.xbefore26.13.1must upgrade their local, CI, and
deployment runtimes. The supported range is now^24.22.3 || >=26.13.1."engines": { - "node": ">=24.22.1" + "node": "^24.22.3 || >=26.13.1" } -
add label, type and details to sessions (#19492) (b3c508f)
On SQL adapters, this adds three columns to each
<collection>_sessions
table, so existing projects need a database migration. In development
the schema is pushed automatically; in production, runpayload migrate:createand thenpayload migrate. MongoDB needs no migration.
This is in the v4 migration guide under "Sessions say what they are".
🤝 Contributors
- Nate Lentz (@nathanlentz)
- Jessica Rynkar (@JessRynkar)
- Elliot DeNolf (@denolfe)
- Dan Ribbens (@DanRibbens)
- Jarrod Flesch (@JarrodMFlesch)
- Alessio Gravili (@AlessioGr)
- German Jablonski (@GermanJablo)
- Jake Fletcher (@jacobsfletch)