v0.31.0

1 November 2026

An addon is mounted by a page with its view, and API clients get JSON errors, a JSON body reader and bearer tokens.

Changed

  • The addons.{id}.mount config key is removed. Create a page, at any slug, whose view is exactly @alias to mount an addon. The addon's own sub-pages, such as the admin's edit and system pages, are served beneath that page.
  • An addon that sets "automount": true in its _index.json is still served at /@alias, and the addon owns every URL under it.
  • A request with Accept: application/json gets {"error": message} instead of the error template.

Added

  • App::mountOf($alias) returns the slug of the page that mounts an addon, or null. Registry::mountOf($view) is the unscoped lookup behind it.
  • Request::json() returns the request body decoded as an array, Request::bearer() the bearer token from the Authorization header, and Request::acceptsJson() whether the client asked for JSON.
  • PageImage::palette($count) returns the most common colors of an image as #rrggbb, and PageImage::color() the most common one.
  • UnauthorizedException (401).

Removed

  • phlat addons:mount. Create the page in the admin or with phlat make:page admin --view=@admin.
  • AddonRegistry::mountFor() and AddonRegistry::all().