Repository navigation
Releases
Releases · kestellohq/cms
Kestello 0.1.0-rc.3
A pre-release of Kestello 0.1.0, for testing. Sites are offered it only with release.prereleases on, or when they already run a pre-release of 0.1.0.
Added
- Link fields find pages: type words such as "contact" into a button's Link and pick a published page to fill in its address, or type an address as before. Authors and contributors find every published page, not only the ones they may edit (
GET /content/lookup?linkable=1). The field isKLinkInputin the UI kit for plugins. - Site → Fleet watches the other Kestello sites you look after, in one list: Kestello version and newer releases, plugin and theme updates and license problems, Site Health and the last backup. Turned on with
app.fleet.enabled; each site is added with a token made on it with only the newfleetpermission, which readsGET /api/v1/fleet/reportand nothing else. Sites are asked every hour, or with Check now. - System → Security shows who the site trusts for code: its trusted publishers, the key Kestello's own updates must carry, a warning when the admin installs unsigned zips, and for every installed plugin and theme who signed it and where its updates come from (
GET /api/v1/security/packages). - Editorial checklists: a content type can list what its entries must (required) or should (recommended) have before they are published: an excerpt, a featured image, a term of a taxonomy, a minimum number of words, a search description, or a plugin's own check (
$cms->content->checks->define()). Set them under Before publishing on System → Content types or withContentType::checklist(); the editor checks them as you type (POST /api/v1/content/{type}/checklist). A required item that isn't done keeps an entry from being published or scheduled; drafts and submissions for review always save. - Waiting on you on the Overview: your entries sent back with changes requested, entries assigned to you, and entries in review that are yours to publish, most urgent first (
GET /api/v1/content/waiting,Reviews::waitingFor()). - @mentions in review comments: naming someone as
@usernametells them, in the bell and by email, when they may open the entry. Typing @ in Add a comment suggests people who may edit entries of the type, and names are marked in the timeline. - Plugins and themes can say where their updates come from:
"updates": {"github": "owner/name"}for a GitHub repository's releases, or"updates": {"url": "https://…"}for the vendor's own feed. Kestello checks every 12 hours (app.updates.check_every), and Site → Updates lists what is available, with the release notes, and updates through the same backup, health check and automatic rollback as an upload. Packages withoutupdatesstill update by upload. This needs the permission once called Update Kestello itself, now Update Kestello, and plugins and themes from their publishers. - License keys for paid plugins and themes (
"license": trueinupdates): an administrator enters the key on Site → Updates or withpackage:license. It is stored encrypted, shown only by its last four characters, and sent only to that package's own feed, in a header. When the vendor refuses it, the vendor's message and renew link are shown. package:check-updates [<plugin:slug>]asks the sources now.- Typing on the page reaches list items, icon list items, table cells and captions. In a list, Enter adds an item after the caret's (an icon carries over), Enter in an empty last item ends the list and starts a paragraph, and Backspace in an empty item removes it. In a table, Tab and Shift+Tab move along the cells, Enter moves down a row and adds one on the last row, and the arrow keys move between rows and items. A new list starts with one item, ready to type into. Each added or removed item or row is its own undo step.
- Saved page HTML, for sites without the Node renderer, such as shared hosting. Pages visitors see without signing in go out as real HTML that Vue then takes over, so text shows before the scripts arrive and crawlers read the page. While an administrator has the admin open, their browser draws the pages that have no HTML yet in a hidden frame and sends it to the site. Saved HTML belongs to the exact page data, so a change to a page, a menu or a list gives new data, and the page waits again for its new HTML. It is on by default (
app.prerender), off on a public demo and when the Node renderer is set up. The API lists waiting pages atGET /system/prerenderand takes their HTML atPOST /system/prerender/{key}, for administrators only. - A
composer.jsonwith no requirements, socomposer create-projectand Composer's autoloader work for developers. Kestello still has no PHP dependencies. - A public demo, to let others try Kestello. Choose A public demo in the installer's site step: there is no administrator step, everyone signs in as
demowith the passworddemo, and the site starts as a sample bakery (pages, posts, a contact form, menus and images). Visitors can change content, the design, menus, forms and images; their account, people, plugins, themes, updates, backups and settings are locked, and the API answers those with ademoproblem. Sign-in sessions, the audit log, backup downloads and form attachments are hidden, nothing is emailed, uploads are images up to 5 MB, and search engines are kept out. Every hour the site goes back to its snapshot and everyone is signed out; this also works without cron, through the web runner. The admin shows a bar with the time left, the sign-in page shows the account, the public site a Demo site badge, and forms say that anyone can read what is sent.php bin/cms demo:resetanddemo:snapshotlook after it on the server, and Site Health has a Demo check. - Updates that the server stops halfway (a host's time or memory limit, a restart) are finished or put back by the next request, before plugins load: the new version is kept when its check had passed, otherwise the old code and the database backup from before the update come back. While Kestello itself is being checked,
core/current.phponly names the new release as long as the update runs, so the next request already runs the old one. After three failed tries the site stops trying and keeps visitors on the maintenance page: Site → Updates shows what happened with Try again, Site Health reports it, andbin/cms update:recoverdoes the same on the server. A new update waits until an unfinished one is put back. When the server stops the updater but not the health check it started, the site waits for that check to end before putting the update back, so the two never change the database at the same time; the check has a time limit of its own, visitors keep seeing the maintenance page for as long as an update has not finished (not only its first 30 minutes), and Site → Updates and Site Health say when an update has been running for more than 15 minutes. - Switch back after an update, for Kestello on Site → Updates, for plugins on Plugins → Manage plugins and for developer themes on Appearance → Themes: the version before the last update comes back with the database backup taken before it. A backup of the site as it is now is made first. The API answers
POST /updates/core/switch-backandPOST /plugins/switch-back, andPOST /updates/recoverasks for another try. - Structured data for search engines: every public page describes itself as JSON-LD (the site, who runs it, the page, its main image, an Article for dated entries, and breadcrumbs). Settings > Search and sharing says whether an organization or a person runs the site, with a name, logo or photo, and profiles on other sites. Plugins change the nodes with the
seo.schemafilter; pages hidden from search, error pages and the admin get none. - A Canonical address for each entry, for text first published elsewhere. That address goes in the canonical link and
og:url, and the entry leaves the sitemap. - Hooks for search:
seo.alternatesaddshreflanglinks for the same page in other languages, andsitemap.filesandsitemap.urlsadd files and addresses to the sitemap (addresses on this site only). Pages also getog:localewhen the site language names a country,article:modified_time, andmax-image-preview:largewhen they may be listed. - Search checks in the entry editor's Checks tab, on the unsaved values: a title or search title too long for search results, a missing or too long description, a page hidden from search, a canonical address elsewhere.
- The WordPress importer brings over what Yoast SEO, Rank Math, SEOPress and All in One SEO kept on each post: the search title (without the site name, which the title pattern adds), the description, "hide from search engines", the sharing image, and a canonical address on another site.
- Settings > Search and sharing: the pattern for page titles (such as
{title} {sep} {site}), a separate one for the home page, the separator, and a default sharing image for pages without an image of their own. The browser tab, search results and link previews follow it; the admin keeps its own titles. The settings form shows a media picker for fields with themediaformat. - A search title and a sharing image for every entry, under Search and sharing in the editor. The search title replaces the entry's title in the browser tab, search results and link previews; the page itself still shows its title. The sharing image is used for link previews instead of the first image on the page.
- The first public version of Kestello: structured content with revisions and scheduling, the visual page editor with blocks, patterns and per-screen styles, the template builder, media library, forms, menus, redirects, search, webhooks, a REST API with an explorer, people, roles and two-factor sign-in, backups, Site Health, background jobs and scheduled tasks, themes and plugins with ...
Kestello 0.1.0-rc.2
A pre-release of Kestello 0.1.0, for testing. Sites are offered it only with release.prereleases on, or when they already run a pre-release of 0.1.0.
Added
- Site → Fleet watches the other Kestello sites you look after, in one list: Kestello version and newer releases, plugin and theme updates and license problems, Site Health and the last backup. Turned on with
app.fleet.enabled; each site is added with a token made on it with only the newfleetpermission, which readsGET /api/v1/fleet/reportand nothing else. Sites are asked every hour, or with Check now. - System → Security shows who the site trusts for code: its trusted publishers, the key Kestello's own updates must carry, a warning when the admin installs unsigned zips, and for every installed plugin and theme who signed it and where its updates come from (
GET /api/v1/security/packages). - Editorial checklists: a content type can list what its entries must (required) or should (recommended) have before they are published: an excerpt, a featured image, a term of a taxonomy, a minimum number of words, a search description, or a plugin's own check (
$cms->content->checks->define()). Set them under Before publishing on System → Content types or withContentType::checklist(); the editor checks them as you type (POST /api/v1/content/{type}/checklist). A required item that isn't done keeps an entry from being published or scheduled; drafts and submissions for review always save. - Waiting on you on the Overview: your entries sent back with changes requested, entries assigned to you, and entries in review that are yours to publish, most urgent first (
GET /api/v1/content/waiting,Reviews::waitingFor()). - @mentions in review comments: naming someone as
@usernametells them, in the bell and by email, when they may open the entry. Typing @ in Add a comment suggests people who may edit entries of the type, and names are marked in the timeline. - Plugins and themes can say where their updates come from:
"updates": {"github": "owner/name"}for a GitHub repository's releases, or"updates": {"url": "https://…"}for the vendor's own feed. Kestello checks every 12 hours (app.updates.check_every), and Site → Updates lists what is available, with the release notes, and updates through the same backup, health check and automatic rollback as an upload. Packages withoutupdatesstill update by upload. This needs the permission once called Update Kestello itself, now Update Kestello, and plugins and themes from their publishers. - License keys for paid plugins and themes (
"license": trueinupdates): an administrator enters the key on Site → Updates or withpackage:license. It is stored encrypted, shown only by its last four characters, and sent only to that package's own feed, in a header. When the vendor refuses it, the vendor's message and renew link are shown. package:check-updates [<plugin:slug>]asks the sources now.- Typing on the page reaches list items, icon list items, table cells and captions. In a list, Enter adds an item after the caret's (an icon carries over), Enter in an empty last item ends the list and starts a paragraph, and Backspace in an empty item removes it. In a table, Tab and Shift+Tab move along the cells, Enter moves down a row and adds one on the last row, and the arrow keys move between rows and items. A new list starts with one item, ready to type into. Each added or removed item or row is its own undo step.
- Saved page HTML, for sites without the Node renderer, such as shared hosting. Pages visitors see without signing in go out as real HTML that Vue then takes over, so text shows before the scripts arrive and crawlers read the page. While an administrator has the admin open, their browser draws the pages that have no HTML yet in a hidden frame and sends it to the site. Saved HTML belongs to the exact page data, so a change to a page, a menu or a list gives new data, and the page waits again for its new HTML. It is on by default (
app.prerender), off on a public demo and when the Node renderer is set up. The API lists waiting pages atGET /system/prerenderand takes their HTML atPOST /system/prerender/{key}, for administrators only. - A
composer.jsonwith no requirements, socomposer create-projectand Composer's autoloader work for developers. Kestello still has no PHP dependencies. - A public demo, to let others try Kestello. Choose A public demo in the installer's site step: there is no administrator step, everyone signs in as
demowith the passworddemo, and the site starts as a sample bakery (pages, posts, a contact form, menus and images). Visitors can change content, the design, menus, forms and images; their account, people, plugins, themes, updates, backups and settings are locked, and the API answers those with ademoproblem. Sign-in sessions, the audit log, backup downloads and form attachments are hidden, nothing is emailed, uploads are images up to 5 MB, and search engines are kept out. Every hour the site goes back to its snapshot and everyone is signed out; this also works without cron, through the web runner. The admin shows a bar with the time left, the sign-in page shows the account, the public site a Demo site badge, and forms say that anyone can read what is sent.php bin/cms demo:resetanddemo:snapshotlook after it on the server, and Site Health has a Demo check. - Updates that the server stops halfway (a host's time or memory limit, a restart) are finished or put back by the next request, before plugins load: the new version is kept when its check had passed, otherwise the old code and the database backup from before the update come back. While Kestello itself is being checked,
core/current.phponly names the new release as long as the update runs, so the next request already runs the old one. After three failed tries the site stops trying and keeps visitors on the maintenance page: Site → Updates shows what happened with Try again, Site Health reports it, andbin/cms update:recoverdoes the same on the server. A new update waits until an unfinished one is put back. When the server stops the updater but not the health check it started, the site waits for that check to end before putting the update back, so the two never change the database at the same time; the check has a time limit of its own, visitors keep seeing the maintenance page for as long as an update has not finished (not only its first 30 minutes), and Site → Updates and Site Health say when an update has been running for more than 15 minutes. - Switch back after an update, for Kestello on Site → Updates, for plugins on Plugins → Manage plugins and for developer themes on Appearance → Themes: the version before the last update comes back with the database backup taken before it. A backup of the site as it is now is made first. The API answers
POST /updates/core/switch-backandPOST /plugins/switch-back, andPOST /updates/recoverasks for another try. - Structured data for search engines: every public page describes itself as JSON-LD (the site, who runs it, the page, its main image, an Article for dated entries, and breadcrumbs). Settings > Search and sharing says whether an organization or a person runs the site, with a name, logo or photo, and profiles on other sites. Plugins change the nodes with the
seo.schemafilter; pages hidden from search, error pages and the admin get none. - A Canonical address for each entry, for text first published elsewhere. That address goes in the canonical link and
og:url, and the entry leaves the sitemap. - Hooks for search:
seo.alternatesaddshreflanglinks for the same page in other languages, andsitemap.filesandsitemap.urlsadd files and addresses to the sitemap (addresses on this site only). Pages also getog:localewhen the site language names a country,article:modified_time, andmax-image-preview:largewhen they may be listed. - Search checks in the entry editor's Checks tab, on the unsaved values: a title or search title too long for search results, a missing or too long description, a page hidden from search, a canonical address elsewhere.
- The WordPress importer brings over what Yoast SEO, Rank Math, SEOPress and All in One SEO kept on each post: the search title (without the site name, which the title pattern adds), the description, "hide from search engines", the sharing image, and a canonical address on another site.
- Settings > Search and sharing: the pattern for page titles (such as
{title} {sep} {site}), a separate one for the home page, the separator, and a default sharing image for pages without an image of their own. The browser tab, search results and link previews follow it; the admin keeps its own titles. The settings form shows a media picker for fields with themediaformat. - A search title and a sharing image for every entry, under Search and sharing in the editor. The search title replaces the entry's title in the browser tab, search results and link previews; the page itself still shows its title. The sharing image is used for link previews instead of the first image on the page.
- The first public version of Kestello: structured content with revisions and scheduling, the visual page editor with blocks, patterns and per-screen styles, the template builder, media library, forms, menus, redirects, search, webhooks, a REST API with an explorer, people, roles and two-factor sign-in, backups, Site Health, background jobs and scheduled tasks, themes and plugins with signed packages, and signed core updates.
- A site language in Settings > General. The admin, emails and theme text follow it, and the admin formats plurals, numbers and dates for it. Validation messages from the API, the reasons a save is refused, and the problems visitors see when sending a form (a missing answer, an expired ...
Kestello 0.1.0-rc.1
A pre-release of Kestello 0.1.0, for testing. Sites are offered it only with release.prereleases on, or when they already run a pre-release of 0.1.0.
Added
- Plugins and themes can say where their updates come from:
"updates": {"github": "owner/name"}for a GitHub repository's releases, or"updates": {"url": "https://…"}for the vendor's own feed. Kestello checks every 12 hours (app.updates.check_every), and Site → Updates lists what is available, with the release notes, and updates through the same backup, health check and automatic rollback as an upload. Packages withoutupdatesstill update by upload. This needs the permission once called Update Kestello itself, now Update Kestello, and plugins and themes from their publishers. - License keys for paid plugins and themes (
"license": trueinupdates): an administrator enters the key on Site → Updates or withpackage:license. It is stored encrypted, shown only by its last four characters, and sent only to that package's own feed, in a header. When the vendor refuses it, the vendor's message and renew link are shown. package:check-updates [<plugin:slug>]asks the sources now.- Typing on the page reaches list items, icon list items, table cells and captions. In a list, Enter adds an item after the caret's (an icon carries over), Enter in an empty last item ends the list and starts a paragraph, and Backspace in an empty item removes it. In a table, Tab and Shift+Tab move along the cells, Enter moves down a row and adds one on the last row, and the arrow keys move between rows and items. A new list starts with one item, ready to type into. Each added or removed item or row is its own undo step.
- Saved page HTML, for sites without the Node renderer, such as shared hosting. Pages visitors see without signing in go out as real HTML that Vue then takes over, so text shows before the scripts arrive and crawlers read the page. While an administrator has the admin open, their browser draws the pages that have no HTML yet in a hidden frame and sends it to the site. Saved HTML belongs to the exact page data, so a change to a page, a menu or a list gives new data, and the page waits again for its new HTML. It is on by default (
app.prerender), off on a public demo and when the Node renderer is set up. The API lists waiting pages atGET /system/prerenderand takes their HTML atPOST /system/prerender/{key}, for administrators only. - A
composer.jsonwith no requirements, socomposer create-projectand Composer's autoloader work for developers. Kestello still has no PHP dependencies. - A public demo, to let others try Kestello. Choose A public demo in the installer's site step: there is no administrator step, everyone signs in as
demowith the passworddemo, and the site starts as a sample bakery (pages, posts, a contact form, menus and images). Visitors can change content, the design, menus, forms and images; their account, people, plugins, themes, updates, backups and settings are locked, and the API answers those with ademoproblem. Sign-in sessions, the audit log, backup downloads and form attachments are hidden, nothing is emailed, uploads are images up to 5 MB, and search engines are kept out. Every hour the site goes back to its snapshot and everyone is signed out; this also works without cron, through the web runner. The admin shows a bar with the time left, the sign-in page shows the account, the public site a Demo site badge, and forms say that anyone can read what is sent.php bin/cms demo:resetanddemo:snapshotlook after it on the server, and Site Health has a Demo check. - Updates that the server stops halfway (a host's time or memory limit, a restart) are finished or put back by the next request, before plugins load: the new version is kept when its check had passed, otherwise the old code and the database backup from before the update come back. While Kestello itself is being checked,
core/current.phponly names the new release as long as the update runs, so the next request already runs the old one. After three failed tries the site stops trying and keeps visitors on the maintenance page: Site → Updates shows what happened with Try again, Site Health reports it, andbin/cms update:recoverdoes the same on the server. A new update waits until an unfinished one is put back. When the server stops the updater but not the health check it started, the site waits for that check to end before putting the update back, so the two never change the database at the same time; the check has a time limit of its own, visitors keep seeing the maintenance page for as long as an update has not finished (not only its first 30 minutes), and Site → Updates and Site Health say when an update has been running for more than 15 minutes. - Switch back after an update, for Kestello on Site → Updates, for plugins on Plugins → Manage plugins and for developer themes on Appearance → Themes: the version before the last update comes back with the database backup taken before it. A backup of the site as it is now is made first. The API answers
POST /updates/core/switch-backandPOST /plugins/switch-back, andPOST /updates/recoverasks for another try. - Structured data for search engines: every public page describes itself as JSON-LD (the site, who runs it, the page, its main image, an Article for dated entries, and breadcrumbs). Settings > Search and sharing says whether an organization or a person runs the site, with a name, logo or photo, and profiles on other sites. Plugins change the nodes with the
seo.schemafilter; pages hidden from search, error pages and the admin get none. - A Canonical address for each entry, for text first published elsewhere. That address goes in the canonical link and
og:url, and the entry leaves the sitemap. - Hooks for search:
seo.alternatesaddshreflanglinks for the same page in other languages, andsitemap.filesandsitemap.urlsadd files and addresses to the sitemap (addresses on this site only). Pages also getog:localewhen the site language names a country,article:modified_time, andmax-image-preview:largewhen they may be listed. - Search checks in the entry editor's Checks tab, on the unsaved values: a title or search title too long for search results, a missing or too long description, a page hidden from search, a canonical address elsewhere.
- The WordPress importer brings over what Yoast SEO, Rank Math, SEOPress and All in One SEO kept on each post: the search title (without the site name, which the title pattern adds), the description, "hide from search engines", the sharing image, and a canonical address on another site.
- Settings > Search and sharing: the pattern for page titles (such as
{title} {sep} {site}), a separate one for the home page, the separator, and a default sharing image for pages without an image of their own. The browser tab, search results and link previews follow it; the admin keeps its own titles. The settings form shows a media picker for fields with themediaformat. - A search title and a sharing image for every entry, under Search and sharing in the editor. The search title replaces the entry's title in the browser tab, search results and link previews; the page itself still shows its title. The sharing image is used for link previews instead of the first image on the page.
- The first public version of Kestello: structured content with revisions and scheduling, the visual page editor with blocks, patterns and per-screen styles, the template builder, media library, forms, menus, redirects, search, webhooks, a REST API with an explorer, people, roles and two-factor sign-in, backups, Site Health, background jobs and scheduled tasks, themes and plugins with signed packages, and signed core updates.
- A site language in Settings > General. The admin, emails and theme text follow it, and the admin formats plurals, numbers and dates for it. Validation messages from the API, the reasons a save is refused, and the problems visitors see when sending a form (a missing answer, an expired page, a file that is too large) are translated.
- Forms in the site's language: the default button text, thank-you and closed messages, the notification emails and their default subject, and the limits of a file field ("Up to 3 files, 12 MB each."). They follow the language when it changes later.
- Site pages load the active plugins' and theme's translations for the site language (also during server-side rendering), and the base theme's text is translatable. Site pages also get
auth.user.admin, so a theme can offer a way to the admin to everyone who may open it. - Error pages in plain words, in the site's language and the theme's colours. A theme's own
errors/Errorpage getsstatus,heading,messageandhomealready translated. A mistyped address under/adminshows the admin's own Page not found, with the menu. - Translation templates:
bin/cms i18n:extractwrites the.potfile for core, a plugin or a theme. - Updates from GitHub: Kestello checks the releases of
kestellohq/cmstwice a day (or on Check now under Site → Updates), shows the release notes, and downloads, verifies and applies a new version from there.bin/cms core:checkdoes the same check from the command line. - Email sign-up, off by default. Settings > Accounts decides who can create an account (nobody, anyone, or addresses at listed domains) and with which role, for email sign-up and for sign-in providers alike. A visitor enters their address, and the emailed link opens a page to choose the password; the account only exists after that. The answer never shows whether an address has an account: its owner gets an email instead. Themes can restyle the new
@core/auth/Registerand@core/auth/CompleteRegistrationpages like the other sign-in pages. Theauth.can_registerand `auth.d...