Hi everyone,
I’m currently experimenting with a setup in Kirby where I want to store a relation between “software” and “skills”. In my blueprint, I have two tabs: one called Skills, where users manage a simple structure field containing only skill titles, and another called Software, where users manage software entries that each have a title and a relation to one or more skills using a multiselect field.
For testing, I created 100 skills and 100 software entries. Each software entry is linked to between zero and five skills. However, I’ve noticed significant performance issues with this setup. Opening the “Software” tab in the Panel (at /panel/pages/pageSlug?tab=software) takes about two seconds, and saving the page (/api/pages/pageSlug/changes/publish) takes around ten seconds. From my investigation, the slowdown seems to be caused by the line in my blueprint that uses query: page.skills.toStructure.
Here is my current blueprint:
title: Software Skill Relations
tabs:
software:
label: Software
icon: display
fields:
software:
label: Software
type: structure
fields:
title:
label: Titel
type: text
softwareSkill:
label: Skills
type: multiselect
options:
type: query
query: page.skills.toStructure
text: "{{ structureItem.title }}"
value: "{{ structureItem.title }}"
skills:
label: Skills
icon: star
fields:
skills:
label: Skills
type: structure
fields:
title:
label: Titel
type: text
I have already searched the forum for similar topics but could not find an exact match. I did, however, come across a discussion suggesting the use of subpages instead of structure fields for performance reasons (Speed advantage: structure or pages?) and another post that mentions using PHP-based blueprints to cache query results (When is Kirby not the right fit?).
Given that Kirby is a flat-file CMS without a relational database, I understand there are limitations, but I would have expected that handling 100 entries with a handful of relations should still be manageable with modern server performance. I would really appreciate any suggestions, possible directions to explore, experiences from similar setups, or specific tips for optimizing toStructure queries in my blueprints. I can also gladly provide a sample page content file if that would help others test this scenario.
Thanks a lot for your time, and for the great work on Kirby ![]()