Interesting use cases

I often get feedback about how Kirby is being used for all kinds of very interesting use cases: intranets, client areas, styleguides, event calendars, etc.

I think it would be very cool to talk some more about the different things you can build with Kirby and how you set it up in your latest interesting use case.

1 Like

I used Kirby recently to create a style guide for front-end code at our agency. I wanted a structure such as:

Home > Chapter > Page > Section

With the Home showing the table of contents of each Page, and each Page showing a table of contents and then the content of each section (a title and a few paragraphs).

The structure is similar to @mdo’s code guide except that the home has only an introduction and a list of table of contents, while “HTML”, “CSS” (and others) are individual pages. We also reused @mdo’s stylesheet with a few branding tweaks.

I wrote a small snippet for writing a table of contents:

    $baseUrl = $source->url();
    $list = $source->children()->visible();
    if ($list->count() > 0):
    <?php foreach($list as $item): ?>
        <li><a href="<?= $baseUrl . '#' . $item->uid() ?>"><?= $item->title() ?></a></li>
    <?php endforeach ?>
<?php endif ?>

Each section from a page has its own folder, whose name is used as the #anchor in the page.
The only limitation right now is that sections generally have a main text and code example, and I’d like to put the code example in a separate file, like so:


It can be done, I just haven’t gotten around to doing it yet.

I love how Kirby makes it easy to devise your own content structure and HTML structure with very few limitations.


Thanks for the example!

I’m a technical writer and have recently used Kirby to build a template for the user manual of a mobile app …

I still do client work besides Kirby and one of my biggest client projects launched about a year ago. You can find it here: In fact it’s actually four connected sites:

The first specialty in this case is the multi-site setup which is run by a single Kirby installation linked to multiple content and site folders depending on the domain.

The installation is separated into two repositories. One for all the site stuff, assets, Kirby’s core and panel and one for the content. The content folders hold about 4 GB of data and all changes made via the Panel are automatically committed and pushed to a private Gitlab installation via a cronjob. That gives us a very simple but effective secondary backup system for all content changes. All content editing is done on a private staging server. The production server does not have a panel installation at all. When content changes are made in the panel on the staging server, the editors can publish those changes to the production server with a small button on Kirby’s dashboard. In the background the production server simply pulls the latest content from Gitlab coming from the staging server.

Nimbus has a massive catalogue of led luminaires. Each product has subproducts with lots of documents and files, which can be downloaded by visitors. Downloads are automatically bundled by product with custom routes, which start a PHP Zip script.

All construction illustrations for luminaires are stored as EPS files coming from the design department. Those EPS files are converted with ImageMagick to PNGs and displayed on the product pages.

Nimbus has a great collection of real life projects, which use their luminaires. For all those projects the editors can add as many pictures as they have available and set in the panel which luminaires have been used in each picture with a simple file field. On the product pages Kirby will then pull in a list of all related projects and also create a nice gallery with random project pictures.

Internally the website is used as an important source for employees and retailers to fetch information about their product catalogue. For each product family and product there’s a simple URL-based API, which can be used to export Excel sheets with all the data available. Those Excel sheets are generated on the fly.

The site has many other features, including an Angular-based Product search, a file-based retailer database, a massive news archive and more. We are currently also working on an integration with their SAP system to import all product updates directly into Kirby and use it as a single data source.


Nice to see a use case of this scale, with integration of other tools and custom scripts, whether PHP, other server-side code or client-side apps. Many would have gone to a big framework for such a project.

Is the nimbus-lighting install still on Kirby 1, or did you migrate it to Kirby 2 (which launched less than a year ago)?

The Nimbus site was running on Kirby 2 long before it got officially launched. Such things are only possible with a fantastic client like them and I’m extremely thankful for their trust. They always ask for the latest and greatest stuff and give me a lot of freedom to come up with new custom ideas and implementations. For the launch of Kirby 2, having their site as a reference was massively helpful.


I don’t know if this suits the „interesting“ category, but we basically run a rather large academic publication database of our client (as well as talks and different academic projects) via a combination of structured panel blueprints and List.js for searching.
I guess you could apply this to other database-related projects as well. JS-based sorters like these are pretty powerful, they support JSON-lazy-loading and can fuzzy-search through thousands of entries with little lag. (Kirby uses this for docs, I think)

Coming from a Drupal background I saw a lot of possibilities in glueing together pages/page elements via related page links. Didn’t test this out to full extend though.

Hi there, this is my first post and I would like to share some kirby-related projects that I have worked on over the past two years.

#An Innovation Management System

About two years ago I developed a kirby-based combination of knowledge management system and employee self-service terminal for a leading manufacturer in sensor technology. The system runs on twelve touch screen terminals that have been placed at strategic locations throughout their plants.

First of all, the new platform allows their innovation department to collect and curate ideas brought forward by employees. For them it was the move from a paper-based archive of ideas to a living pool of information that is available to everyone within the company. We also introduced an innovation score that encourages creative competition between the departments – by keeping track how many ideas were handed in and ultimately realized.

In addition the platform also replaces all bulletin-boards. Company news and internal career opportunities are made available exclusively through the terminals – so that everyone is always up-to-date.

#A Reference Management System

Recently I have started working on a small reference management system for scientific writing. As I got more and more frustrated with all the desktop applications available on OS X, it seemed like a fun challenge to see how far I would get with Kirby. Another thing that annoyed me, was how personal libraries have become less and less accessible once they only consist of nothing more than PDF files. In a sense I set out to create a digital library front end, that allows scholars to share their readings and annotations.

I made it surprisingly far. About eight weekends into development I have already got the essential features in place. It turns out that the new panel is just perfect for my use case. For every type of reference (article, book, website, etc.) there is one matching blueprint that contains all the required and optional fields. In the template I then work with a lot of ifs to only display the fields that have been populated. I use tags to group references by topic and to display them accordingly. A user login gives registered users access to the PDF download and allows them to edit the references. The BibTex for each entry is dynamically generated so I can copy individual references or even download the entire library in one file.

Link: /cc: @distantnative

#A game dialog editor

Last summer my best friend and I worked on a video game for four weeks straight. The engine we decided to use is great for cross platform development but its dialog syntax is not very polished. I got tired of writing it by hand and repurposed the tree menu snippet to generate multilevel dialog. This is the project that got me thinking in the direction of BibTex because it made me realized how easy it is to output usable code with Kirby.



The university from which I got my bachelor’s degree is pretty small (~1000 students) and so you kinda know each other and are really willing to help each other. Only problem: You sometimes just don’t know who has already done some research on a topic or just knows a lot about a specific method.

Thats why we tried to put together a little knowledge database where essentially every student could add as many research areas, methods (plus the type of expertise) that they feel, they could help others with. And the front part of this database is a simple search field that queries all students. Plus quite a lot autocomplete to minimize too many variations of the same thing (mobile communication, mobile communications…).

Kirby just worked nicely for this.


I’ve also came across very different projects where I used Kirby (v1 and v2) or at least the old toolkit.

Besides the normal corporate websites (check out,,, – and some very interesting sites are still work-in-progress), I also worked on quite complex web applications for managing different types of data – a order management tool for (orders in a database, but the tool itself is an own kirby installation), a customer/calendar/invoice tool for, and some small, easy installations for a custom wiki for example. Maybe I will build some edited screenshots with dummy data and more detailed description, if you’re interested :wink:

I think pretty much any app/website can be build with or on top of Kirby. I just came across again, and thought that also a bookmarking tool would be easy to set up with kirby… maybe my next project in free-time…

Oh, and another old project from @bastianallgeier inspired me for building an easy project-management-tool: – have to get some more freetime :smiley:

I am using Kirby to build a tracking system for the Colleges data that I use in other software I have written. I needed quickly build a way to allow some employees to update the College data. Each college is a page with about 15 fields with subpages holding year specific data. I built blueprints for the panel, allowing employees to update the easily update the data. I have about 1200 colleges in Kirby and it is extremely fast even without caching. Building the whole thing took only about 2 days so far.


Here is some information about the simple project management tool for freelancers I build with Kirby.

For a while I have been searching for the best way to keep my clients up to date with the progress of their project.

I tried several online project management solutions (Basecamp, Asana, etc.), but they rarely fit the needs of my clients. I think those tools are great for teamwork, but I needed something more straightforward so that my clients could keep track of the progress of an ongoing web project.

I found a great alternative when I heard about project hubs. This was a perfect solution for me and my clients.

Wanting to simplify the process of adding new content to a project hub, I build a simple theme for the Kirby CMS. This became the Kirby Project Hub theme.

Here is a quick explanation:

An administrator creates client users and selects a preferred language for each one of them. (the UI can be easily translated). The administrator then attaches projects to each client user.

A client can see his list of projects on the front end of the website and the project pages can be password-protected. A project page displays every important event onto a single webpage, presented in a timeline. Each item in this timeline can link to a content page or a downloadable file.

Here are some screenshots of the admin panel.

If you want more details, you can take a look at a demo of the theme or read the documentation.

If you would like to try out this theme, contact me by email and I will send you a beta version : info (at) g-design (dot) net


Liked it, bought it.
Annnd here is text to be able to post.


I used Kirby to build a SAAS product:

There are some SQLite databases used but that’s it. That you can build a complete service almost entirely with flat files was a happy discovery and a very pleasant experience. Thank you Bastian for making life simple. Before anyone else dishes out their time in learning Laravel or Rails or similar, Kirby works quite well for this.

If anyone is interested in the back-end workings, let me know and I can post details.


That’s great! And yes, so much can be done with Kirby… You should definitely share some insights into your backend. Are you using the panel?

Thanks Thiousi!

Here is some of how it’s set up (with some changes to make it clearer):

Model (as in MVC)

In the content folder I created a page named “app”. Within that page I created sub-pages for each model. So my folder structure looks like:


All of those pages are empty and simply are to allow me to create Kirby models for them:


Kirby models can be treated like any PHP class so within them I have typical CRUD functions, like:

// site/models/user.php

class UserPage extends Page {
  public function create() {
    $error = false;
    $messages = array();
    try {
      $user = site()->users()->create(array(
        'username'  => get('username'),
        'email'     => get('email'),
        'password'  => get('password'),
        'language'  => 'en',
        'role'      => ‘customer’
    } catch(Exception $e) {
      $error = true;
      $messages[] = 'The user could not be created. ' . $e->getMessage();
    return compact('error', 'messages'); // Explained below in "Linking them all together"



I have a model called “user” but unlike in traditional MVC where the model properties (e.g., username, email, password) are defined in the model, my “user” model is just an abstraction of Kirby’s user object and as such I let Kirby handle those property definitions.

Not having to create a user management system from scratch (especially considering security) was one of the reasons I went with Kirby instead of Laravel or Rails.

As a result it’s very simple:

  1. A user submits a POST request to /signup: tell Kirby to create user account.
  2. A user submits a POST request to /login: tell Kirby to validate username and password and login.
  3. A user submits a GET request to /logout: check if user is logged in, then tell Kirby to log the user out.

(All these functions are explained in the Cheatsheet.)

View (as in MVC)

Views are no different than normal pages. So for creating a user, I have this page: content/signup and its accompanying template in: site/templates/signup.php

Controller (as in MVC)

My MVC paradigm gets a little confused here, but my controllers’ responsibilities are mostly redirecting users away from pages they shouldn’t have access to.

For example, if a non-logged in user tries to access the /profile page, he or she will be redirected to the /login page.

Linking them all together

I created a plugin titled “API”. The whole plugin consists of a list of routes to perform CRUD operations on the models. For example:

// site/plugins/api/api.php

      'pattern' => 'signup', 
      'method'  => 'POST',
      'action' => function() {
        $user = page('app/user');
        $data = $user->create();
        if ($data['error']) {
          return array('signup', array('error' => $data['error'], 'messages' => $data['messages']);
        } else {


  • Route is only called by a POST request (i.e. the user submits a form on the signup page).
  • $data contains the response of the user model. If an error occurs, then the signup page is shown again and the error message passed in as a template variable. Errors are shown in the signup template like:
<?php if (isset($error)): ?>
  <div class="errors">
    <?php foreach ($messages as $message): ?>
      <?php echo $message ?><br> 
    <?php endforeach ?>
<?php endif ?>

In conclusion

That’s a simplified explanation but hopefully it somewhat shows how easy it is. So to answer your question, the panel is only used by and accessible to me, while all users use the frontend. Let me know if you’d like to know anything else.


Thanks for sharing :slight_smile:. Always great to see what people do with Kirby.

Thanks a lot for taking the time to write about this!
One question comes to mind, and take it with a pinch of salt from somewhat not very familiar with MVCs. I’ve never used Models used in Kirby before, what’s the advantage of using models over plugins or controllers?

For the difference between controllers and models, see this post: