v0.13.0
Feature
Breaking Change
v0.13.0 - Root routing gate, email suppression and API status codes
Serving / now requires root_routing, bounced and complained addresses are suppressed automatically, REST errors carry the right status code, and unsupported query filters error instead of returning everything.
Breaking Changes
This release contains breaking changes. Please review the migration guide below before upgrading.
New
- Email suppression: addresses that hard-bounce or file a complaint are automatically excluded from all outgoing mail. Historical bounces and complaints were backfilled; the list is visible and editable in the admin.
globals_save:fields[]now validatestypeagainst the field-type registry and acceptsoptions, the same asblueprints_save. An unknown type is an error instead of a silently dropped field.
Changes
- Root routing: a collection must set
root_routing: truefor itsindexentry to serve/./indexkeeps working regardless. The 13 existing collections that relied on the old fallback were updated in production, and every account's default Page collection already sets it. - REST API: create failures now return
409(conflict),404(missing reference) or422(validation) instead of always422. - REST API: an update that names a handle which cannot be resolved (collection
template/layout/index_template, formcollection/blueprint, navigation item entity link orparent_id) is now rejected with422instead of silently ignored. - Query filters: an operator a field type does not support (for example
containson a toggle, or a typo) now returnsQUERY_ERRORfromentries_queryand renders an empty result in Liquid{% query %}, instead of returning the whole collection unfiltered. entries_query_by_relation: sorting bypositionnow uses the real position column, and number fields sort numerically rather than as text.- A form submission's spam status can no longer be stuck at
pending; a classifier error recordsmaybe. - The stale platform files
/application.cssand/application.jswere removed; account assets with those names are now reachable at their own URLs. - Kamal deployment scaffold removed; Capistrano remains the deploy path.
Fixes
- Switching an entry's blueprint or re-running an import could leave duplicate stored values for one field; every reader now resolves one value per field handle, and switching blueprints re-points surviving values onto the new fields.
- Public page renders no longer re-query field values for every global and navigation item.
- Import/export progress now includes the forms step.
- Analytics dashboard scopes visits by account correctly.
- Liquiditor's
{% paginate %}and collection preview now match production output.
Migration Guide
- Root routing: if a collection serves your home page, make sure it has
routing: ":handle",root_routing: trueand an entry with handleindex. Withoutroot_routing,/returns 404 while/indexstill works. - REST status codes: clients that treated every create failure as
422should also handle409and404. - Unresolvable handles on update are now
422errors; check the reference exists before updating. - Query filters: audit
{% query %}filters andentries_querycalls for operators outside each field type's supported set; they now error instead of returning the full collection.