↑ ↓ to navigate
↵ to select
esc to close
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 validates type against the field-type registry and accepts options, the same as blueprints_save. An unknown type is an error instead of a silently dropped field.

Changes

  • Root routing: a collection must set root_routing: true for its index entry to serve /. /index keeps 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) or 422 (validation) instead of always 422.
  • REST API: an update that names a handle which cannot be resolved (collection template/layout/index_template, form collection/blueprint, navigation item entity link or parent_id) is now rejected with 422 instead of silently ignored.
  • Query filters: an operator a field type does not support (for example contains on a toggle, or a typo) now returns QUERY_ERROR from entries_query and renders an empty result in Liquid {% query %}, instead of returning the whole collection unfiltered.
  • entries_query_by_relation: sorting by position now 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 records maybe.
  • The stale platform files /application.css and /application.js were 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: true and an entry with handle index. Without root_routing, / returns 404 while /index still works.
  • REST status codes: clients that treated every create failure as 422 should also handle 409 and 404.
  • Unresolvable handles on update are now 422 errors; check the reference exists before updating.
  • Query filters: audit {% query %} filters and entries_query calls for operators outside each field type's supported set; they now error instead of returning the full collection.