v0.42.0
3 November 2026
The pages cache gets its own store, installed addons move back to the project root, and the framework repo no longer carries a site.
Changed
- The pages cache is its own store,
data/cache/pages.db, reached only through$page->cache(). Its config key iscache.pages.enabled(wascache.fragments.enabled). $app->cache($name)writes todata/cache/app.{name}.db, accepts only lowercase letters, numbers and dashes, and can no longer reach the pages cache. An app store's config key iscache.app.{name}.enabled.Cache::flushTree()takes no URL and clears its own page's tree. To empty the whole pages cache, call$app->page('/')->cache()->flushTree().cache.get:after,cache.set:afterandcache.flush:afterpasspagesorapp.{name}as the store name.- Installed addons (git submodules) live at
addons/{creator}/{name}/in the project root again, besidesite/.site/addons/holds only site-only addons. Theaddons:*commands run git in the project root. - The license exception is part of
LICENSE.LICENSE-EXCEPTIONis gone.
Removed
- The docs site is no longer a submodule of the framework repo. It lives in its own project, along with its
deploy.php,compose.yaml, Docker files andphp.ini. - The site theme build scripts (
build:styles,watch:styles,build:htmx) andtask phlat:watch. A site builds its own CSS.npm run buildbuilds the admin assets only.
Upgrading
- Replace
$app->cache('fragments')->flushTree($page->url())with$page->cache()->flushTree(), and$app->cache('fragments')->flush()with$app->page('/')->cache()->flushTree(). Renamecache.fragments.enabledand anycache.{name}.enabledkeys. Listeners that test the store name compare topages. Runphlat cache:clearto drop the old cache files. - For each submodule at
site/addons/{creator}/{name}, rungit mv site/addons/{creator}/{name} addons/{creator}/{name}from the project root, and make sure.gitignoredoes not ignore/addons.