v0.6.0

<p>Worker mode, SSE and the admin Templates screen are removed, the ui addon becomes a set of daisyUI components, Clockwork does nothing unless debug is on, and the session classes split into login and scoped values.</p>

3 October 2026

Added

  • The ui addon is a set of daisyUI components as Latte partials: {include '@ui/modal.latte', ...}. New components include avatar, badge, breadcrumbs, carousel, dropdown, filter, footer, indicator, join, modal, navbar, progress, rating, skeleton, steps, timeline, toast, tooltip, and form select, toggle, radio, range and file.
  • The converted components (button, alert, card, list, menu, dropdown, navbar, toast) share one vocabulary. color, variant, size and icon take plain words, class and attrs are escape hatches, and site/views/@ui/{name}.latte replaces a shipped component.
  • UiExtension adds items(), which turns pages, a page collection or plain strings into the shared item shape (title, description, href, icon, meta, color, active, items). {include '@ui/menu.latte', items: $page->children()} needs no mapping.
  • FieldValueSet::preview(): a collapsed container field lists its contents.
  • The flat and unit global option fields.
  • F::listen() callbacks fire for append, copy, move, delete, upload and symlink as well as read and write. F::clearStat() with no path clears the whole stat cache.
  • The admin reads pending changes from one changes/status route (nav count, tree status, statusbar) instead of each controller asking git.

Changed

  • Session holds only scoped values and flash messages (get, set, has, delete, flash, pop). Login, CSRF and throttling live on SessionRoot ($app->session), which has no values of its own. Session::set() loses its $locked argument and unlock() is gone.
  • Clockwork registers nothing, stores nothing and serves no route unless debug is on. It censors password-like keys in the GET, POST and session data it records, and its API is at /clockwork instead of /clockwork/.
  • Field lookups are memoized and cleared when files are written, and so are object field definitions. One page view is shared per request (App::pageView()).
  • App::isEditor() is also true for the CLI, replacing App::seesAll().
  • FieldTypeStack encodes each entry's values with that value's own fieldtype.
  • The admin's repeater, blocks and stack routes are one set, and ui/repeater-controls.latte is now ui/list-controls.latte.
  • History::isAvailable() looks for a .git folder instead of running git.
  • fieldtypes/{name}/index.json no longer takes title or description. min_length and max_length are declared by the text fieldtypes only.
  • Field is a plain read-only class, no longer a Record. Registry owns the FieldIndex.

Fixed

  • clockwork:status, clockwork:prune and clockwork:clear read Clockwork's JSON files. They looked for a SQLite database that no longer existed.

Removed

  • FrankenPHP worker mode: the worker blocks in phlat/Caddyfile, the worker.php upload in deploy.php, App::beginRequest(), Registry::reset(), Registry::batchUpdatedAt() and the per-request resets in RecordCollection and Clockwork.
  • Toolkit\Sse and the page-save touch hook.
  • The admin Templates screen (system/templates) and the view:field command. View, App::views(), App::view(), App::fields(), App::fieldNames(), App::fieldIndex() and FieldCollection go with them.
  • The DirectSessionAccessRule PHPStan rule.
  • The example global fields address, jobTitle and phone.

Comments

No comments yet. Be the first!

Loading form…