Kirby 2.1.0 is here!

Let's face it: I'm not good with version numbers :) With the start of Kirby 2 I swore to myself to come up with smaller feature releases more often, instead Kirby 2.1 took more than seven months.

But as with all good resolutions, reality kicks in sometimes and the last seven months have been full of fantastic feedback and a growing community that came up with too many great ideas. I somehow felt the pressure that 2.1 should be rather good and so it took longer than expected and still there's soooo many on the todo list for 2.2.

I think this is a great release though and after finishing the full changelog for it, it became pretty clear how much work has gone into this.

This is the perfect time to send a massive shout out to Nico (@distantnative) for helping me with this release over the last weeks. With Sascha's (@sashtown) support with the website and now Nico helping me with the development, it all feels easier and more fun than ever before and I'm super thankful for having them in the team.

New dedicated changelog

Instead of littering the blog with huge update notices there's a brand new changelog section with all updates since Kirby 1. I will setup a feed for it shortly.

You can find all the changes and new features of this release over here:

New Langkit

More and more people use Kirby for multi-language websites and I thought it is about time to create a multi-language starterkit. For now you can only pull it from Github. I'm working on a fully downloadable version.

Download Kirby 2.1.0

Update instructions

Please follow the update instructions for your existing Kirby site.


With our new discourse forum integration for comments in the blog you can instantly start discussing this version below this article. I'm super excited to hear your thoughts.

This is a companion discussion topic for the original entry at

Incredible work! So looking forward to messing around with the new panel hooks. Now I have no excuses left for my procrastination on Kart.


Massive changelog! I’m not a developer, but I’m very excited by the possibilities hooks bring.

I tried to clone it from github as described here, but recursive cloning the toolkit failed (timeout). Maybe it’s an issue with github?! The panel submodule could be cloned without any problems.

Submodule 'toolkit' ( registered for path 'toolkit'
Cloning into 'toolkit'...
fatal: unable to access '': Failed connect to; Operation timed out
Clone of '' into submodule path 'toolkit' failed

Are you behind a proxy or perhaps a restrictive company network? Does the error persist when you try the SSH url?

git clone --recursive

Thanks for your reply @jancbeck. Today everything works fine. Yesterday, I just wondered that the other submodules could be cloned without any problems …

A massive update! Nice work!

In the changelog there is an addition to the panel:

Optional widgets. Widgets can now return false to not appear in the dashboard. This is great to ask for user roles and show/hide widgets accordingly.

Does anyone have an example on how to use this?

Oh, nice to see that optional widgets actually made it in :smile:

I used that for a little page stats plugin I wrote a while ago. Basically stats are only displayed for admins and not for anybody else:


$site = site();

if ($site->user()->hasRole('admin')) {
  return array(
    'title' => 'My awesome widget',
    'html'  => function() {
      // Do some stuff
      return "<p>Some stuff</p>";
} else {
  return false;

Any user not having the admin role will just not see the widget.


Thanks @FabianSperrle ! This is an example i was interested in!

I’m excited about this update!

Just a note on OSX 10.10.3 I had to run brew update && brew doctor because I was getting an error Fatal error: Call to undefined function ImageCreateFromPNG() from SimpleImage.

Hopefully that helps anyone else who might run into this.

1 Like

Ha, I reported this problem on Github, see the issue.
FWIW, I just ran a Homebrew update + doctor (libpng was updated and doctor didn’t find any problem) and it still doesn’t work.

@bastianallgeier How can I get more context at the hook? Would be really handy if Core hands over the old URI to the hook.

So far I agree that there’s not enough context. I have that on my list for the next round. I think I’m going to pass some kind of “before” state to hooks where it makes sense.

1 Like

@bastianallgeier When coming Kirby 2.2 or next version?