Changelog#
The authoritative changelog lives in CHANGES.md at the repository root. It is included below so the rendered docs always match the release history.
0.6.6 (unreleased)#
Add
cloud-vinylandplone.observabilityto the ecosystem navigation dropdown in the docs.
0.6.5 (2026-08-04)#
Fix: SVG (skip-Thumbor) images no longer emit uid-based scale URLs that permanently 404. Root cause was not
purge_scalesbut the volatileThumborScaleStorageintroduced in 0.6.x:get_or_generatereads a fresh empty per-instance dict on every traversal, so no uid scale URL could ever resolve — theplone.scaleannotation is never consulted. Fixed on both ends: skip-types now emit the original field URL with a modification-time cache buster (both plone.namedfile code paths, the legacy__init__for 7.x and_scale_urlfor >= 8.0.0a2), the HiDPIsrcsetattribute and thesrcset()method emit Thumbor URLs, andget_or_generateheals legacy uid URLs (cached HTML, staleimage_scalescatalog metadata) by parsing the deterministic{fieldname}-{width}-{md5}uid and regenerating the info on the fly — restricted to widths registered inplone.allowed_sizes. Review hardening on top: srcset() mirrors the parent’s edge-case guards (zero-size original, original-size back-fill, unresolvable src scale), and the HiDPI srcset path threads crop info through for scale infos that carry a scale name. Closes #17.Add
cdk8s-ploneto the ecosystem navigation dropdown in the docs.Chore: apply ruff 0.16 markdown code-fence formatting to four docs files (pre-existing drift; the QA workflow runs the latest ruff via uvx over the whole repo). Mark up
zope2.Publicas inline code in a security-doc heading so vale’s Microsoft.Spacing rule no longer trips on it.
0.6.4 (2026-04-20)#
Fix:
_needs_auth_url()no longer issues a PostgreSQL query per image. The old implementation looked upallowed_rolesinobject_statevia a request-scoped pool connection, which saturated the per-pod psycopg pool under cold-cache production load (30 thumbnails per listing page × concurrent anonymous requests = 30 sPoolTimeoutstacks). Replaced with an in-memoryrolesForPermissionOn("View", context)lookup — the plone-pgcatalogallowed_rolescolumn is a cache of exactly this computation, so the SQL was re-asking a question Zope already knew the answer to. Zero DB round-trips, zero pool pressure, no catalog-lag skew vs. live workflow state. Closes #8.Fix:
@thumbor-authREST service now prefers the ZODB storage connection (already held for the request) over the psycopg pool, so per-image auth verification doesn’t contend onpool.getconn(). The SQL query is unchanged — this is strictly a connection-acquisition change, matching the pattern plone-pgcatalog uses in_get_pg_read_connection. Falls back to the pool when no ZODB storage is in scope (tests, scripts). Related to #8.
0.6.3 (2026-04-13)#
Move
@@imagesout of overrides, it is on a layer.
0.6.2 (2026-04-10)#
Fix: access-check queries now use the dedicated
allowed_rolesTEXT[] column instead ofidx->'allowedRolesAndUsers'.plone-pgcatalogextractsallowedRolesAndUsersinto its own column, so the old JSONB lookup returnedNULLfor every migrated object — making_needs_auth_url()always returnTrue(broken anonymous images) and@thumbor-authalways return401for 3-segment URLs. Affects both_needs_auth_urlinscaling.pyandThumborAuthServiceinrestapi.py. Closes #5.Docs: the Sphinx reference changelog is now a MyST include of the root
CHANGES.md, removing the stale hand-maintained copy.
0.6.1 (2026-04-03)#
Fix:
IImageScaleStorageadapter registration now uses*as second discriminator instead ofIPlonePgthumborLayer. The adapter lookup inplone.namedfilepasses amodifiedcallable (not a request), so the layer-based registration never matched — all scales still used the defaultAnnotationStorage. Closes #4.
0.6.0 (2026-04-03)#
Fix:
ThumborScaleStorageno longer writesScalesDictto ZODB. Thestorageproperty now returns a volatile (non-persistent) dict, eliminating constant write transactions frompre_scale(). Closes #3.
0.5.0 (2026-04-02)#
Remove
server_url,security_key, andunsafefrom controlpanel and registry. These settings are configured exclusively via environment variables (PGTHUMBOR_SERVER_URL,PGTHUMBOR_SECURITY_KEY,PGTHUMBOR_UNSAFE).Controlpanel now shows env-var configuration hint in the description.
Upgrade step (v2 -> v3) deletes orphaned registry records from existing sites.
Purge button uses alert styling.
Closes #2.
0.4.0 (2026-04-02)#
Add browser layer
IPlonePgthumborLayerand bind all views, services, and adapter overrides to it. This enables clean uninstall via GenericSetup: removing the layer deactivates all registrations.Add uninstall profile (removes browser layer and control panel configlet).
0.3.0 (2026-03-10)#
Wire
smart_croppingandparanoid_modefrom env vars / Plone registry into Thumbor URL generation.Add
_scale_urloverride for upcoming plone.namedfilescale_infosupport, with backward compatibility for current releases.Simplify dev setup: run Plone locally, Docker only for postgres/thumbor/nginx.
0.2.0 (2026-03-07)#
Add
@@thumbor-purge-scalesview andzconsole run -mscript to remove legacy ZODB image scales and reindeximage_scalesmetadata after installation.
0.1.0#
Initial implementation: Thumbor URL generation for Plone image scales.