Kirby 2.4.0

Highlights in 2.4.0

A new Starterkit!

We've secretly been working on a massive update for the starterkit. Fabian has come up with a great new design, lots of new content and documentation and many new built-in features. We are very happy about the result and hope you will like it too. It's included in every standard download. The full source code can also be found on Github.

Read more about the new starterkit…


The Panel finally supports permissions!

Each user role can now define a set of rules to restrict each Panel action based on the action type, the current page/file, user, language or even a combination of all of them.

You want to have a translator role that is only able to edit a specific language? Or an editor role that can only create new drafts in the blog but not publish them? Or a role that only allows users to edit their own profile page? It's all possible now!

Read more about this feature in the docs.

Content Representations

One of Kirby's biggest advantages is its content structure. You can use as many fields and field types as you need to create content that isn't just a large WYSIWYG field.

Kirby 2.4 comes with a new core feature called "Content Representations" that allows you to output content in different formats. This could be JSON for your AJAX script or using Kirby as an API for other tools, an automatic RSS feed representation of your blog, or a plain text representation of your résumé.

Read more about this feature in the docs.

Support for language-specific domains

Kirby now supports using a separate domain for each language out of the box:

c::set('languages', [
    'code'    => 'en',
    'name'    => 'English',
    'default' => true,
    'locale'  => 'en_US',
    'url'     => '',
    'code'    => 'de',
    'name'    => 'Deutsch',
    'locale'  => 'de_DE',
    'url'     => '',

Kirby will detect the language based on the domain, and links to other languages, e.g. in language switchers, will just work™.

Kirby objects are easier to debug

Kirby objects such as $page, $site or $file have a lot of connections to other objects. The result is that a lot of stuff is printed when debugging those objects with var_dump(), print_r() or dump().
Starting with Kirby 2.4, the most complex objects are now printed with their most important information only. Please note that this new feature only works with PHP 5.6 or later.

Improved exception handling

Kirby now has a new powerful visual error view powered by Whoops.
It becomes active automatically once you enable debug mode. And on your production site it displays a nice and clean error page that doesn't tell attackers anything about the error.

A big CLI Update

Our command line interface got a big update as well. With many new commands, it is now even more powerful than before. Check out the CLI readme for more information.


  • Add support for Panel permissions, see permissions docs
  • Hooks are now using event objects (see below) with additional useful meta information
  • Prefix Panel session variables to prevent overlap with plugins
  • Support for a default user blueprint for custom user form fields
  • Better error handling for forms
  • Fix overflow issue for long checkbox labels
  • Fix visibility of the text field counter in the file view
  • Complex objects are now printed with their most important information only when debugging (PHP 5.6+)
  • Translation updates
  • Improved datetime field
  • Huge performance improvement for sorting files
  • Decreased padding before headline fields
  • Fixed checkboxes issue with wrong fallback content in multi-language sites
  • Basic composer file
  • Fixed broken label translation in template switcher
  • Fixed z-index issue for submit buttons
  • Improved icon rendering


  • New Content Representations feature
  • Roles now use their own PHP files that are compatible with the registry, see permissions docs
  • Multi-language sites can now use separate domains per language
  • Complex objects are now printed with their most important information only when debugging (PHP 5.6+)
  • New error view for exceptions powered by Whoops (only in debug mode)
  • Custom language files can now be written in YAML
  • Add tinyurl.url option to support separate tinyurl domains
  • $file->blur() now accepts a blur amount parameter
  • The cache.ignore option now only has to contain URIs of the default language
  • Add support for hook wildcards
  • Inside hooks, $this is now set to a new event object with useful information about the event
  • All roots can now be fully customized in the site.php
  • Update Parsedown library
  • link kirbytag now automatically adds rel="noopener noreferrer" when you set target="_blank" to improve the security and performance of such links
  • User login no longer deletes session data, e.g. from plugins
  • Prefix Kirby session variables to prevent overlap with plugins
  • Fix a bug in $field->isTranslated() that would return incorrect results if the field value was set but identical to the default language
  • Fix a bug in the controller registry that would allow plugins to override custom controllers
  • Core dependencies are now managed with Composer, also the core can now be installed via Composer


Our partners

CDN by KeyCDN Search by Algolia