Skip to content


  • The panel can now be extended with your own icon plugins 🎉
panel.plugin('my/icons', {
  icons: {
    'my-icon': '<path d="M7,3V13H5v2H8a1,1,0,0,0,1-1V4h2V2H8A1,1,0,0,0,7,3Z" /><circle cx="2" cy="14" r="2" /><polygon points="12 0 12 6 16 3 12 0" />'
  • You can now use query templating in more blueprint options (help, default, label, empty and headline) (#1823, #1862)
    label: "Notes for {{ page.title }}"
    type: textarea
    help: "You can fill in some notes for {{ page.title }} here"   
  • To create a custom response in your custom API routes, you can now return a Response object (#2076)
  • Content locking can be switched off with the new content.locking option (#2000)
return [
  'content' => [
    'locking' => false
  • New F::relativepath() method
echo F::relativepath('/Users/secret/www/site/templates/default.php', '/Users/secret/www');
// result: '/site/templates/default.php'
  • New $options argument in Json::encode() (#2111)
echo Json::encode('здравей', JSON_UNESCAPED_UNICODE);
  • Added yml and yaml extensions to F::$types (#2018)
echo F::type('yaml');
// result: code
  • Added application/yaml and text/yaml to Mime::$types (#2018)
echo Mime::fromExtension('yml');
// result: application/yaml


  • Clicking the Today button in the calendar dropdown will now immediately set the date (#1736)
  • More detailed PHP CS settings now result in even cleaner source code
  • Changing a user role is now completely disabled if there's just one role (#1948)
  • The parent option in sections is now validated correctly and a readable error message is thrown when incorrect objects or values are given (#1938)
  • The current user's role is used as the default when creating new users (#2038)
  • The panel default language is now used as default in the installer and when a new user is created (#1940)
  • Improved pull request template
  • We now use absolute class names in doc blocks for better IDE support
  • A custom panel css file has now a cache-buster timestamp (#1729)
  • New detailed error messages on uploads, including php.ini setup issues (#1812)
  • The image preview in structure fields now uses srcset and proper thumbnails (#2039, #2040)
  • Updated contributing guide
  • Invalid structure field data now throws a human-readable error message (#2046)
  • Enhanced structure field preview for multiselect fields (#1996)
    FireShot Capture 749 - Exploring the universe - Mægazine_ - http___localhost_test_kirby_1996_p
  • We reduced the content locking frequency to make locking less resource-intensive (#2000)
  • Updated translations
  • Translated options in blueprints have better fallbacks now, if the language is not available (#1876)
  • An invalid field section setup is now throwing a more readable error (#1935)


  • Show radio buttons in the files, pages and users pickers, when the max option is set to 1 (#2109)
  • Fixed panel jumps on opening the file dialog from textareas (#1879)
  • Fixed unicode replacements in Slug generator (#1903)
  • The correct locale is now set in API calls from the panel, which fixes localised dates and other localisation issues (#1872)
  • Forbidden user roles no longer appear in the user dialogs, when creating a new user or changing user roles (#1917)
  • Default values in structure fields no longer block saving checkboxes and other fields correctly (#1950)
  • Adding files to the textarea now creates correct absolute paths when necessary (#2003)
  • Users without an admin role can now change the roles of other users if they have permissions to do so (#1919)
  • Keyboard navigation through dropdowns now skips disabled options correctly (#1661)
  • Routing in the panel no longer shows broken fields (#2007)
  • The pattern validation in text fields is now working correctly (#2041)
  • Fixed Page siblings in page.update:after hook (#1401)
  • Consistent $collection->append() and $collection->prepend() methods (#2078)
  • The Vuex user store is now correctly updated when the email, language or name of the current user is changed (#1957)
  • Untranslatable fields in multi-language installations are now never stored (#2001)
  • Files in the files section are now sorted explicitly by the sort field to fix a wrong order (#2020)
  • Invalid fractions in structure fields are now handled correctly (#1930)
  • Focusing a disabled structure field no longer throws an error (#1960)
  • A duplicated page is now properly indexed when the page.duplicate:after hook is triggered (#1923)
  • Better range input behaviour when the field is empty (#2044)
  • Fixed layout of the empty box, when there's a lot of text (#2065)
  • The info option in the users field is now working correctly (#2050)
  • Fixed unclickable links in the help text of a disabled field (#1965)
  • The disabled toggle field now displays its state correctly (#2004)
  • Fixed a bug in the time field, which always set the time to 12:00 AM (#1781)
  • The file field in API error responses is now showing the correct file path on Windows (#1937)
  • Spellchecking in textareas is now enabled by default again (#2047)
  • Fixed Page siblings collection in page.changeSlug:after hook (#1952)
  • A newly created user can now be impersonated directly (#2021)
  • Fixed widont() helper when the last word contains a dash (#1902)
  • Some nested array options in the config didn't work reliably. This is now fixed (#1944)
  • The $position parameter in the page.changeStatus:before hook is now filled in correctly at all times (#1982)
Assets 2
You can’t perform that action at this time.