v0.9.5

20 October 2026

Gated image variants stay behind their page's gate, and save() returns the saved record.

Added

  • Page::isPublic(): whether a page and every ancestor is published and open to anyone.
  • PageFiles::withdraw() removes the public mirrors under a page URL. Closing a page (published or access) withdraws its subtree's mirrors.
  • SessionRoot::refresh() swaps the signed-in user for the saved one on user.update:after.
  • task phlat:release lists the closed issues of a milestone named like the tag in the release notes.

Changed

  • Image variants of a page that isn't public are cached at data/cache/files/{id}/ and served through PHP behind the page's gate. Only a public page's variants are mirrored into site/public/.
  • Record::save(), Page::save() and User::save() return the record as saved and leave the instance they were called on unchanged.
  • Record::save() writes index.json before data.json, and the registry row and its field and search indexes are updated in one transaction.
  • App::shutdown() runs on response, not from Page::render().
  • App keeps typed definition memos in place of the request snapshot.
  • PageView::save() throws, since views are hand-authored files.
  • site/public/index.php resolves vendor/autoload.php through realpath() and falls back to the literal path.
  • deploy.php uploads the entry files after deploy:shared.
  • backup:create and collection:migrate truncate long progress labels.

Fixed

  • A crash during a save could leave index.json and the registry both stale with matching updated stamps, so the drift was never detected. updated now stays ahead of the registry until the sync completes, and it heals.
  • user:role no longer indexes the user twice.

Comments

No comments yet. Be the first!

Loading form…