The gist of it
Kirby 4 will launch in 2023
We are very excited to announce the first test version for Kirby 4 with many great user-facing features and improvements. We want share our progress with you out in the open in the coming weeks. Final release of v4 is scheduled for later this summer. 🚀
All licenses purchased in 2023 qualify as Kirby 4 licenses
We will treat any license bought on or after 1 Jan 2023 as if you bought it on the day of the v4 release. Older licenses that have not been activated yet will qualify as well. For older active licenses we will offer very fair upgrade prices as always.
Kirby 4 will be built upon the healthy code base we established for Kirby 3. Upgrades will be comparable to a 3.x release. While we stay on the same architecture, this new version will bring many long-awaited features and is going to move your projects forward.
ETA for Kirby 4
We roughly plan with the following schedule for v4. The success of the alpha & beta and your input will determine the final release date.
Late summer 2023
We are not done yet …
This is the very first public test version of Kirby 4. Now it's time for you to get involved. We need your honest feedback and your eagle eyes to find bugs. We plan to build more features in the next weeks. You can follow our process on Discord.
This version is very likely buggy.
That's why we call it alpha :)
Do not use it in production!
Link to anything
Page creation dialogs
Faster, better page creation
I like to move it, move it
Filter pages and files
Filter pages and files by any criteria: The pages and files sections now come with support for our powerful query string syntax.
Color me surprised
Color in all its facets: Multiple color notations, color picker, pre-defined colors, custom color names and transparency. You can't get more color than that.
Never cut off the most important part of your images again. Set a focus point and let your images shine in all their beauty.
Uploading files the smart way
Screenshot-123.jpg? With the preview and edit options in the new upload dialog, meaningless file names are now a thing of the past. Use the new blueprint options to optimize uploads before they land on the server.
Block field improvements
Our best field is now 25% bester
- Split and merge text, list and headings
- New option buttons to split or merge
- Press enter at the end of a headline to append a new text block
- Text block with
inline: truefor text field will split directly on Enter (
Shift + Entercreates a hard line break)
- Custom blocks can support splitting by implementing a
New Keyboard shortcuts
|Move focus up||
|Move focus down||
|Move block up||
|Move block down||
|Extend selection up||
|Extend selection down||
Layout field improvements
Copy & Change
More flexibility: Simply change a layout, and copy one or all layouts into other layout fields.
No longer lost in translation
Each language got its own view now. Easily configure your languages or edit language variables right from the Panel. Easy, right?
The larger your website, the more important becomes search. With Kirby's new search view, searching in the Panel has become a breeze.
Changeable file templates
Change is in the air
Change file templates to any allowed template defined by its parent in a files section or field.
Writer field improvements
Writing in style
With custom marks and nodes for your own style, customizable heading levels and a character counter, you have full control about your writing.
Link to internal pages & files with our new link field in the link dialog. No more guessing of URLs.
You need a block or inline format that’s not available? Create your own marks and nodes with our brand new extension API for Writer plugins.
Default page model
Set a new page standard
The default page model kicks in when there is no specific model for a page.
Of course, other models can extend the default page model, too.
New Versioning Scheme
- Kirby will follow semantic versioning
- Major versions will no longer be automatically bound to paid upgrades
- Major versions will be released on a yearly cycle to bring continuity and planning security.
- 4.0.0: late summer 2023
- 5.0.0: late summer 2024
- 6.0.0: late summer 2025
Frequently asked questions
We are getting a lot of questions after our announcement and already tried to answer most of them here. We will keep collecting questions from the community here and try to answer them as transparently as possible. Let us know on Discord or in the Forum if you have additional questions.
What happens with licenses purchased before 2023?
We really appreciate the support of everyone who uses our volume discounts to purchase licenses in advance and we don't want to break the trust that comes with such purchases.
All unused v3 licenses, which have not been activated before 1.1.2023 will be upgraded to v4 for free as well.
What will happen with Kirby 3?
Kirby 3 will receive security support for quite a while after the launch of Kirby 4. The launch of Kirby 4 will not mean that you have to rebuild all your old projects.
The decision to build on the Kirby 3 architecture also means that you have a better chance for upgrades of old projects this time and we have a better chance to provide security support for Kirby 3 because it's not a completely different codebase.
What will Kirby’s future licensing model look like?
- No subscription
- One-time purchase that allows to keep using the purchased version
- Updates to a reasonable amount of new major versions will be included with each purchase
- More details to be announced
Support for UUIDs in URL helper
You can now pass a page UUID or a file UUID to the
url() helper and it will be converted to the actual URL:
This will also work for other URL methods like.
Support for UUIDs in API calls
You can now use UUIDs in API calls to request pages and files. #4769
The UUIDs must be passed without scheme, but a prefixed
File routes can also handle file UUIDs for files and parents:
In addition to that there are new direct UUID file routes:
File::blueprints()method that collects valid blueprints from the files sections and files fields of the parent model
- Fields can now define
'hidden' => true(component notation) or
::isHidden(): bool(class-based) to make them non-rendering
- New file permissions for
Dialogs for fields
Fields can now define their own dialogs on the backend.
Fields with array definition:
The route patterns for field dialogs are automatically prefixed with the following scheme:
Here's an example:
In a field component, the dialog can be opened by using the field endpoint:
We've added new icons to our Panel iconset:
New JS error classes
More to come …
We are not done here …
- Removed flickering from
- Fixed name of default blueprints to
- Blocks: batch selection allows deselecting blocks
- Blocks: batch selection gets deselected on Escape key
- Fixed i18n translate issues, e.g. for the user blueprint title #4869
- Writer field: Email mark toolbar button title is properly translated now
- Empty required Writer field now shows proper invalid styling in Panel
- UUIDs are less often generated when not needed to be generated
- Kirby queries now differentiate between integers and floats as arguments
- Kirby no longer hides errors in the response class when the response is converted to a string: #5027
- Throw proper errors when thumbnails cannot be generated
config/blueprintsdirectory with dead block blueprints and moved default blueprints for site, page and file to in-code arrays in
Kirby\Cms\Model(and thus also don't use the
Drawer Component Structure
Portals: Dialogs, Drawers and other Overlays are now seperated into different portals. This is done by setting the overlay type:
An overlay without a type will use the default overlay portal. Separating them into different portals gives us more control over z-index and layering of elements.
Kirby\Cms\Modelin favor of
this.$store.dispatch("dialog")is deprecated. Use
this.$store.dispatch("drag", drag)has been deprecated. Use
this.$panel.drag = draginstead
Removed deprecated code
Kirby\Form\OptionsQueryclasses have been removed. Use
Kirby\Toolkit\Queryclass has been removed. Use
- Passing the
$slotsvariables to snippets was deprecated and support has now finally been removed.
- We have added more native PHP type hints throughout the system. When eextending core classes, this might require you to update your method to include those type hints as well.
- When thumb generation fails, the image API now throws an error and no longer loads the original image.
focusare now used by core methods. They are no longer available for custom file methods and content fields with these names can only be accessed via e.g.
$fallbackis an array and neither the array
$keynor the array
$fallbackhave a matching entry for the locale, the first element of the
$keyarray will now be returned (not anymore the one from
$fallbackis a string, it will be considered with priority over both of these.
- If overwriting the
hiddenfield, it must return
'hidden' => truenow
Kirby\Uuid\Uuidis now an abstract class, child classes need to implement the
Kirby\Uuid\Uuid::key()can now also return
nullif the new
$generateparameter isn't passed as
trueand no UUID has yet been generated for the model
- Errors are no longer hidden when a response is converted to a string
- Removed the
- Removed the
- Unauthenticated API and Panel calls now return a correct 401 HTTP code instead of 403.
this.$library.autosizehas been removed, wrap
- Defining the footer slot in
<k-dialog>will no longer wrap the slot content in the
<footer>element. This can now be more flexibly handled by using
<k-dialog-footer>inside the slot.
- The form drawer no longer automatically closes on submit. This is introducing the same behaviour as in dialogs. Auto-closing might often not be the intended result of submitting the form and it's easier to close it manually in a submit handler than to re-open it again.
this.$store.state.isLoadingis no longer available. You can now use
this.$panel.isLoadingin Vue components to access the current loading state.
this.$store.state.dialogis no longer available. Use
k-content-itemonly emit the
clickevent. For other native events, use the
.nativeevent listener modifier
- Native events (e.g.
dbclick) need the
.nativemodifier now when used on
- Need to use
.nativemodifier for all previous event listeners on