Kirby is advertised as headless-ready and multilingual-ready, which it isn’t. That’s the source of most of my issues I believe. That and the docs.
By the way, if you advertise your CMS as having support for headless, then going headless is not supposed to be hacky or bad practice…
It’s my choice, in a headless situation, to use any CSS libraries or frontend frameworks that I want, including Tailwind. For the previews to look like the frontend, I need to bring these technologies into the panel, a process that Kirby makes very difficult. That’s not very headless at all.
You mention you can’t understand some code of mine even after reading it twice. Well, I wouldn’t have had to write that code if the CMS was truly headless-ready. Also, the code looks like it does because of YOUR Models and API! Apart from using your API, all I’m doing there is a recursive traversal function. So unless you’ve never seen recursive traversal functions, the complexity is due to Kirby itself! I wish I had found a better solution, but I didn’t.
Now, I can also look back at my posts in this forum and remind us of all the difficulties I’ve had that are NOT due to a hack or non-standard approach on my part:
- The inability to use
localhost
for development, despite that not being indicated in the docs
- Multiple, different things sharing the same name and causing confusion (Authentication vs Authentication, $page->url va $page->url, this list is actually enormous)
- The difficulty of having to do programming work in a wild-stab-in-the-dark fashion using yml + a limited query language without the modern programming tools like IDE integrations, syntax highlighting, types, docs, examples, logging, error management, environment variables, etc.
- The untestable nature of anything related to the query language
- The inability to get all pages from a single non-custom API endpoint (basic requirement for a true headless CMS).
- The inability to import third-party scripts or styles into the panel View.
- The mysterious use of an undocumented function
this.field
in Vue computed
functions in many examples.
- Needing to use a hack to get the
alt
text for my images
- The lack of basic capabilities in the query language, like ternaries, OR operators, etc.
- The inability to get the translated URLs for links without having to traverse the content
- The search on getkirby.com that doesn’t find things like
$page
when searching for page
- The broken
writer
options marks
and inline
that don’t behave how the docs suggest and in some cases simply don’t work at all (I forget the details here, I just stopped using them)
- The inability to see the docs for older versions of Kirby from the website
- Kirby destroys my variable names (by converting everything to lowercase) between the backend and the frontend, preventing me from using my preferred capitalization strategy: camelCase.
I could go on all day like this. I understand that I can write custom API endpoints to resolve some of these issues, but what’s the point of a CMS if I have to do everything myself and don’t even get to choose my programming language?
We can also discuss best practices if you want:
- semver is a best practice, and nothing is forcing you to have your licensing strategy collide with best practice versioning.
- The way config works makes it impossible for my production config to survive a URL change at the DNS level
- Docs should have examples, just saying that a function returns
$mixed args
is pretty much useless.
- Everything being a page in Kirby makes simple things hard to do because non-page items keep cropping up in page-related situations.
- scrolling a full-height
<main>
element rather than the body itself, which breaks expectations for any scroll-related features like scroll-snapping in the panel.
- wrapping single images in arrays (and other things) for no obvious reason: just makes it harder to access the data from the frontend
- Getting locked out of my LOCAL DEV instance of Kirby because of rate-limiting is definitely not best practice
- The lack of any kind of migration strategy for content structure updates is surprising for structured content management
- The amount of bad UI/UX that can be found in the panel fields is astonishing and beyond the scope of this superficial “review”
There is a LOT more I could say here too, but I have to stop somewhere.
To be clear, I’m not trying to start a flame war here, only to justify why I do blame Kirby for wasting months of my time.
I have also been demonstrating tremendous patience here dealing with all of the above and so much more. But since Kirby is by far the biggest reason why my project is late, over budget, of poor quality, not reusable and a continuous source of frustration, I do consider Kirby harmful and will avoid it as much as possible in the future, for myself and anyone else who asks for my advice.
I appreciate the offer to send me a refund, but no one can refund the months of pain I’ve been going through trying to make a Cathedral out of chopsticks and destroying my schedule and happiness in the process.
To be clear, the free trial would indeed have steered me away from Kirby on the first minute of day one as a cursory glance at the docs is enough to turn me away. However, I was involved in this project too late to change that decision.
Ok, let’s bring this back to things we can all do to improve our lives. On my end, I will be moving away from Kirby as soon as possible and that will solve the vast majority of my problems with this project. In the meantime, I have sacrificed performance and used all sorts of hacks everywhere and I have something that sort of works…
On your end, you seem to be satisfied with Kirby as it is, so I guess you don’t have to do anything, but here is what I would propose based on my experience:
- Don’t claim to be headless-ready
- Don’t claim to support multilingual setups out-of-the-box
- Fix + improve your documentation