2 categories = ["Releases"]
4 title = "BookStack Release v23.05"
5 date = 2023-05-03T10:00:00Z
7 image = "/images/blog-cover-images/bird-ray-hennessy.jpg"
8 slug = "bookstack-release-v23-05"
12 BookStack v23.05 releases today, sneaking into the start of May with a
13 bunch of additions, updates and changes including a new command line tool
14 to help with admin operations.
16 * [Update instructions](/docs/admin/updates)
17 * [GitHub release page](https://github.com/BookStackApp/BookStack/releases/tag/v23.05)
21 - **Page Include Tags** - Nesting is now allowed for [include tags](https://www.bookstackapp.com/docs/user/reusing-page-content/#include-tags), up to 3 levels of depth. You may now see more content loaded for pages which previously had unparsed nested include tags.
22 - **SAML2** - Single LogOut (SLO) requests will now include a "session_index" for the current user. This technically brings BookStack's implementation closer to the spec, and is not expected to cause issues, but if using SLO it may be wise to check your identity provider behavior remains the same as before during logout.
23 - **Custom Code Block Themes** - Due to a change of library, the method of defining custom codeblock themes has significantly changed, and "window.CodeTheme" code is no longer used. Refer to our ["Changing Code Block Themes"](https://www.bookstackapp.com/docs/admin/visual-customisation/#changing-code-block-themes) documentation for further information.
24 - **Editor Event - editor-markdown::setup** - This event no longer contains "codeMirrorInstance" in the event data. It instead has a "cmEditorView" property. [See the event docs for more details](https://github.com/BookStackApp/BookStack/blob/development/dev/docs/javascript-public-events.md#editor-markdownsetup).
25 - **Editor Event - editor-markdown-cm::pre-init** - This event has been renamed to "editor-markdown-cm6::pre-init" and no longer contains "config" in the event data. It instead has a "editorViewConfig" property. [See the event docs for more details](https://github.com/BookStackApp/BookStack/blob/development/dev/docs/javascript-public-events.md#editor-markdown-cm6pre-init).
26 - **Upload Timeouts** - The use of "window.uploadTimeout" has been removed as a way to control upload timeouts. This would previously only be used in certain cases. Instead, if required, timeouts can usually be enforced at the web-server level.
30 ### New System CLI (Early Alpha)
32 When it comes to managing a BookStack instance, backup & restore has always been a point of contention.
33 Ultimately, the method of backup can depend on preference, hosting and environment.
34 Our documentation provides a generic set of commands & actions to achieve backup & restore, but while some found these simple and scriptable,
35 some found the process overwhelming and complicated.
37 To help with backup, restore, and other tasks, with this release I'm introducing the BookStack System CLI.
38 This is a new CLI tool, included within the BookStack app files, that can perform the following commands:
40 - **Init** - Setup a fresh BookStack installation within a folder.
41 - **Backup** - Creates a backup of an existing BookStack installation to a single ZIP file.
42 - **Restore** - Restore a backup ZIP into an instance of BookStack.
43 - **Update** - Update an existing BookStack installation to the latest version.
45 This CLI is technically managed as [a new separate project](https://github.com/BookStackApp/system-cli) and is self-contained,
46 independent of the BookStack codebase, meaning it can be downloaded and used without an existing working BookStack install.
48 Here's a demo of using the CLI to take a backup, and restoring that backup into a new instance created by the CLI:
50 [](https://asciinema.org/a/whALf4oAkhBU3VeuOAjpmGEGz)
52 To support backups, a new `<bookstack_install_dir>/storage/backups` folder has been added to act as the default backup output location, but alternatively a path for the output zip can be provided when running the command if a custom file name/location is preferred.
54 It should be noted this new CLI **should be considered an early alpha** implementation, with the likelihood to run into bugs relatively high.
55 Some known issues (mostly due to MySQL variance) are [documented in the project readme](https://github.com/BookStackApp/system-cli#known-issues).
56 The CLI is written in PHP, and made to be platform abstract. So far i've been testing this across a range of unix-based systems but this kind of CLI is still very environment dependant so it may be a while before things mature.
57 Behaviour, output, options and the CLI name may change over time as I gain feedback from people using this.
59 In the longer-term vision, I may integrate this CLI with the BookStack interface, so that things like backups can be managed from within the application, but that brings its own complications and I'd like to see the CLI mature first.
61 ### New Upload Handling & Attachment Manager Simplification
63 File upload handling has been revamped in a few key areas, specifically the image manager and attachment manager UIs, found when editing a page.
64 The new experience switches out our previous usage of the [dropzone.js](https://www.dropzone.dev/) library with a lightweight
65 custom implementation, with an aim to give us more control while providing a more "BookStack" integrated feel:
67 
69 This new format for image uploads has the added benefit of now showing errors in a clearer and more accessible format.
71 To support these changes the areas in which they are used have received some attention.
72 The styles of the image manager have been tidied and tightened to provide a cleaner user experience.
74 The attachment management panel has had a more extensive overhaul, replacing the previous tabbed-based interface
75 with a simpler layout that requires less clicks for common upload actions.
77 
79 ### Code Block Updating to CodeMirror 6
81 Within BookStack all code syntax highlighting and code editing, including that of the Markdown page editor, is assisted by the popular [CodeMirror](https://codemirror.net/) JavaScript library.
82 After being released last year, I started work to upgrade from CodeMirror 5 to 6 in August 2022, but quickly found this update was essentially a rebuild of the library requiring a lot of work on the BookStack side of things.
83 This release cycle I put my head down and spent a lot of time on this so that, as of BookStack v23.05, all such code blocks are now using CodeMirror 6.
85 
87 This will hopefully not impact most users, apart from providing better mobile support while keeping us up-to-date on our libraries.
88 This does have some significant impacts to those that had applied customizations, since it changes some of the "Editor Events" we previously had,
89 while also significantly changing (and unfortunately complicating) the way custom code themes are applied.
90 See the upgrade notices at the top of the blogpost for more details.
92 ### API Updates - Image Gallery & Content Permissions
94 This release brings two new sets of endpoints to the API, helping to fill gaps and further empower our API users to achieve the actions possible via the UI.
96 
98 The first set are image gallery APIs, which allow the management of page content images much like within the image manager when editing pages.
99 This will be welcome to those that have wanted to handle images in a much more granular way via the API, outside of using the base64-encoded-in-content approach.
101 The second set are content permissions APIs, allowing handling of all controls you'd usually see when viewing the "Permissions" for a single Shelf/Book/Chapter/Page within the user interface. Those wanting to set custom permissions on API-created content should be happy to see these added.
103 ### Nested Include Tags
105 From very early on BookStack has had the ability to dynamically include the whole content, or parts of content, from other pages
106 using [page include tags](https://www.bookstackapp.com/docs/user/reusing-page-content/#include-tags).
107 These have only ever worked at a single layer though, so "nested" tags within the included content would not then be subsequently parsed.
109 Within this release, this behaviour has changed so that nested include tags will now be parsed.
110 This works for up to three levels inclusions, with the limit being there to prevent performance and recursion issues.
112 Thanks to [@jasonF1000](https://github.com/BookStackApp/BookStack/pull/4192) for helping to contribute this feature.
114 ### Clojure Code Syntax Highlighting
116 Another new coding language gets highlighting support in this release, with
117 the lucky language being Clojure:
119 
121 ### OIDC ID Token Logical Theme Event
123 A new `OIDC_ID_TOKEN_PRE_VALIDATE` event has been added to the [logical theme system](https://github.com/BookStackApp/BookStack/blob/development/dev/docs/logical-theme-system.md). This allows the customization of incoming OIDC ID token data,
124 which can be useful to perform any changes required
125 that are outside the scope of what the standard and/or BookStack supports.
127 As an arbitrary example, the below would prefix "Sir" to the names of those that have a name ending in "Chuckle":
130 Theme::listen(ThemeEvents::OIDC_ID_TOKEN_PRE_VALIDATE, function (array $idTokenData, array $accessTokenData) {
131 $currentName = $idTokenData['name'];
132 if (str_ends_with($currentName, 'Chuckle')) {
133 return array_merge($idTokenData, [
134 'name' => 'Sir ' . $currentName,
140 ### JavaScript Codebase & Public (Editor) Events
142 With all the JavaScript focused work performed for this release, there's been some general
143 clean-up and alignment performed to keep things tidied and maintained.
145 First of all, I've added [ESLint](https://eslint.org/) to standardise the formatting and code style
146 across the whole BookStack JavaScript codebase to help ensure consistency while potentially
147 catching or preventing issues.
149 Secondly, all of our custom public JavaScript events (Which we previously called "Editor Events") have been
150 properly documented within a [developer doc markdown file within the repo](https://github.com/BookStackApp/BookStack/blob/development/dev/docs/javascript-public-events.md), providing details of each event along with an example.
151 In addition to providing detail for developers, this helps us track the public API we're providing so it's easier
152 for us to advise of breaking changes.
154 ### Option to Disable SMTP SSL Verification
156 Many using BookStack in private/local networks would configure the system to send mail via a SMTP
157 server that uses a self/privately-signed certificate, and this could cause BookStack to throw an error
158 since the certificate was not signed by a commonly known authority.
160 While it's often possible to work around this, by adding the custom certificate authority to the host system
161 trusted certificate store, this could be a tricky process in some environments.
162 As an alternative, the below option can now added to your `.env`:
165 MAIL_VERIFY_SSL=false
168 With this option set to `false`, all levels of SSL/TLS certificate verification will be ignored during SMTP email sending.
169 This can make you more vulnerable to [MITM attacks](https://en.wikipedia.org/wiki/Man-in-the-middle_attack), so should only be used where necessary on private networks.
171 Thanks to [@vincentbernat](https://github.com/BookStackApp/BookStack/pull/4126) for helping to contribute this feature.
175 Another release means another update to translation content within BookStack from the following
176 remarkable roster of folks that have provided translation text since the original v23.02 release:
178 - Michal Gurcik (mgurcik) - *Slovak*
179 - Jøran Haugli (haugli92) - *Norwegian Bokmal*
180 - Ji-Hyeon Gim (PotatoGim) - *Korean*
181 - Martins Pilsetnieks (pilsetnieks) - *Latvian*
182 - Vitaliy (gviabcua) - *Ukrainian*
183 - Vasileios Kouvelis (VasilisKouvelis) - *Greek*
184 - jozefrebjak - *Slovak*
185 - HeartCore - *German Informal; German*
186 - Pooyan Arab (pooyanarab) - *Persian*
187 - Dremski - *Bulgarian*
188 - SmokingCrop - *Dutch*
189 - Ochi Darma Putra (troke12) - *Indonesian*
190 - Frédéric SENE (nothingfr) - *French*
193 - Indrek Haav (IndrekHaav) - *Estonian*
194 - 10935336 - *Chinese Simplified*
195 - Maciej Lebiest (Szwendacz) - *Polish*
196 - pedromcsousa - *Portuguese*
197 - Martin Sebek (sebekmartin) - *Czech*
198 - Xabi (xabikip) - *Basque*
199 - scureza - *Italian*
200 - toras9000 - *Japanese*
201 - H.-H. Peng (Hsins) - *Chinese Traditional*
202 - Mosi Wang (mosiwang) - *Chinese Traditional*
204 - 骆言 (LawssssCat) - *Chinese Simplified*
205 - kostasdizas - *Greek*
206 - Ricardo Schroeder (brownstone666) - *Portuguese, Brazilian*
207 - Eitan MG (EitanMG) - *Hebrew*
212 During this last release cycle I thought a lot more about multi-language support within BookStack,
213 but ran into significant doubts about it about it being worthwhile to make significant content changes in order to support this
214 due to the complexity it'd add; especially as such a change would likely only benefit the larger, more resourceful
215 BookStack users while having a development impact for everyone.
216 I wanted to think about potential alternative options that don't require so much foundational change, so I posted
217 a question [within the issue thread](https://github.com/BookStackApp/BookStack/issues/569#issuecomment-1501145217)
218 to gain feedback and help explore what exactly people are lacking right now.
219 If you have a need to support multi-lingual content within BookStack, I'd welcome your response to that.
221 Right now there's fair demand in regards to features surrounding comments and notifications, both areas untouched
222 in quite a while apart from the addition of webhooks.
223 I'd like to spend some time in these areas. Notifications in general is very complex topic, at least when you consider
224 the levels of preferences and control that people may desire or require.
225 It may be the case I tackle some minor issues in these areas, to help form questions and ideas that I can take to the
226 wider community to help establish a path forward towards the more significant features here.
228 The image upload work in this release reminded me that the image manager is a little old.
229 While I neatened a few parts for v23.05, it's still very much non-mobile-friendly and I don't think it's very accessible either, so I'd like to overhaul things a tad to bring them up to standards.
233 If you missed it, it's worth checking out the [March Project Update](/blog/project-update-march-23/) post
234 where I shared many of the non-release-specific project updates for the month which included
235 new hacks and API scripts.
237 ### Full List of Changes
239 **Released in v23.05**
241 * Added system CLI for admin operations. ([#4206](https://github.com/BookStackApp/BookStack/pull/4206), [#3149](https://github.com/BookStackApp/BookStack/issues/3149))
242 * Added image gallery API Endpoints. ([#4103](https://github.com/BookStackApp/BookStack/pull/4103))
243 * Added content permission API endpoints. ([#2702](https://github.com/BookStackApp/BookStack/issues/2702), [#4099](https://github.com/BookStackApp/BookStack/pull/4099))
244 * Added new logical theme event to customize OIDC ID token data. ([#4200](https://github.com/BookStackApp/BookStack/issues/4200))
245 * Added Clojure syntax highlighting for code blocks. ([#4112](https://github.com/BookStackApp/BookStack/issues/4112))
246 * Added option to disable SSL verification with SMTP email sending. Thanks to [@vincentbernat](https://github.com/BookStackApp/BookStack/pull/4126). ([#4126](https://github.com/BookStackApp/BookStack/pull/4126), [#3166](https://github.com/BookStackApp/BookStack/issues/3166))
247 * Added support for three-levels of nested include tags. Thanks to [@jasonF1000](https://github.com/BookStackApp/BookStack/pull/4192). ([#4192](https://github.com/BookStackApp/BookStack/pull/4192), [#2845](https://github.com/BookStackApp/BookStack/issues/2845))
248 * Added detailed documentation for public JS events. ([#4179](https://github.com/BookStackApp/BookStack/issues/4179))
249 * Added standard JS codebase formatting via ESLint. ([#4181](https://github.com/BookStackApp/BookStack/pull/4181), [#4180](https://github.com/BookStackApp/BookStack/issues/4180))
250 * Updated code blocks & markdown editor to CodeMirror 6. ([#3617](https://github.com/BookStackApp/BookStack/pull/3617), [#3518](https://github.com/BookStackApp/BookStack/issues/3518))
251 * Updated file upload handling for images and attachments. ([#4193](https://github.com/BookStackApp/BookStack/pull/4193))
252 * Updated SAML2 SLO requests to include a session index. ([#3936](https://github.com/BookStackApp/BookStack/issues/3936))
253 * Updated translations with latest Crowdin changes. ([#4163](https://github.com/BookStackApp/BookStack/pull/4163))
254 * Fixed audit log type filter leading to wrong location. ([#4201](https://github.com/BookStackApp/BookStack/issues/4201))
255 * Fixed large videos within content escaping content area. Thanks to [@chopin2712](https://github.com/BookStackApp/BookStack/pull/4204). ([#4204](https://github.com/BookStackApp/BookStack/pull/4204))
256 * Fixed missing WKHTMLTOPDF in .env.example.complete file. Thanks to [@7nohe](https://github.com/BookStackApp/BookStack/pull/4145). ([#4145](https://github.com/BookStackApp/BookStack/pull/4145))
257 * Fixed not being able to search for terms containing backslashes . Thanks to [@esakkiraja100116](https://github.com/BookStackApp/BookStack/pull/4202). ([#4202](https://github.com/BookStackApp/BookStack/pull/4202), [#4175](https://github.com/BookStackApp/BookStack/issues/4175))
258 * Fixed timestamp in API docs example chapter response. Thanks to [@tigsikram](https://github.com/BookStackApp/BookStack/pull/4191). ([#4191](https://github.com/BookStackApp/BookStack/pull/4191))
260 **Released in v23.02.3**
262 * Fixed issue where user delete fails when no "migration" user is selected. ([#4162](https://github.com/BookStackApp/BookStack/issues/4162))
263 * Fixed tag selection via mouse on Safari. ([#4139](https://github.com/BookStackApp/BookStack/issues/4139))
264 * Updated translations with latest Crowdin changes. ([#4131](https://github.com/BookStackApp/BookStack/pull/4131))
266 **Released in v23.02.2**
268 * Fixed role deletion failing when submitting with empty migration role. ([#4128](https://github.com/BookStackApp/BookStack/issues/4128))
269 * Fixed ownership migration upon user delete not working. ([#4124](https://github.com/BookStackApp/BookStack/issues/4124))
270 * Updated translations with latest Crowdin changes. ([#4074](https://github.com/BookStackApp/BookStack/pull/4074))
272 **Released in v23.02.1**
274 * Fixed an issue with language loading in certain scenarios. ([#4068](https://github.com/BookStackApp/BookStack/issues/4068))
275 * Updated translations with latest Crowdin changes. ([#4066](https://github.com/BookStackApp/BookStack/pull/4066))
279 <span style="font-size: 0.8em;opacity:0.9;">Header Image Credits: <span>Photo by <a href="https://unsplash.com/@rayhennessy?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Ray Hennessy</a> on <a href="https://unsplash.com/photos/Hk6W46UGWRg?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a></span></span>