v0.23.0
Latest release29 October 2026
The registry holds one row per record with a column per declared field, and every date is stored as a Unix timestamp in the files and the registry.
Changed
- A registry query can filter and sort only on a declared field: one a view, a role or a collection field defines. A query naming any other field throws
InvalidArgumentException. A declared field no record has written yet matches nothing. - Each declared field is a column of the
registrytable (itemsin a collection) with its own index. A list's or object's sub-values go tofield_items. A page, user or item is one row, wherefield_indexheld a row per value. createdandupdatedin_index.json, the registry and collection items, and the value of a@phlat/datetimefield, are Unix timestamps.Record::$createdandRecord::$updatedare?int,Collection::create()takes?intstamps andRegistry::updatedAt()returns?int.phlat page:dates --applyrewrites existing pages and users; collection items convert on first read.- A date field and
createdandupdatedtake dates in a condition:starts=2026-10-18matches anywhere in that day in the site timezone,starts!=2026-10-18is the rest, and a date with a time matches that instant. A date with no time is the whole day for<=and>as well:starts<=2026-10-18includes that day andstarts>2026-10-18starts the day after. <><=>=match numbers only, so a field compared that way must be a@phlat/numberor@phlat/datetime.search_indexstores no text of its own, so the registry file is a tenth of its size. Registry files need SQLite 3.43 or later.Registry::SCHEMAis 21 and rebuilds on the first request. Collection databases drop their old index tables and reindex on first read.
Added
"query": falseon a field option or in a fieldtype_index.jsonkeeps the field out of the columns: it stays searchable withsearch=but cannot be filtered or sorted on. Markdown, richtext, code and password fields set it.phlat page:dates [--apply] [folder...]lists, and with--applywrites, the date rewrite for pages and users.FieldIndex::column($name)returns the column holding a field, andFieldIndex::forget()drops its cached column list.@phlat/datetimerejects a value that is not a date with "Enter a valid date and time."
Fixed
cover_aspect>0,sort=-updated,limit=24on 127,000 pages takes under 1 ms for the first page and 52 ms at offset 50,000, from 480 ms and 680 ms. Its count takes 86 ms, from 470 ms.