BookStack Release v24.10

This laggard of a release finally lingers to deployment this day in October bringing the first alpha-state inclusion of the new WYSIWYG editor, which has been the main development focus, but that doesn’t stop a few other goodies being included for this release too!

New (Alpha) WYSIWYG Editor Option

This release introduces the new WYSIWYG editor! This is the first step of a longer term plan to replace the existing (TinyMCE based) WYSIWYG editor due to licensing changes. Initially our goal is to match the existing editor functionality & layout as close as possible to ensure a stable & familiar upgrade path, so it should look much the same:

View of the new WYSIWYG editor, with toolbar containing a range of options towards the top, and with a range of content displayed within. The formats menu dropdown is showing presenting a range of heading & other format options

This is an initial alpha revision of this editor so there are some known omissions & weak-points along with a range of issues to solve, which I’m listing & taking feedback for on a GitHub issue here. The biggest limitation right now is the lack of specific mobile support.

This new editor option can be enabled as a site default for new pages, or can be switched to when in the editor if permissions allow:

View of the page editor draft menu with a “Switch to new WYSIWYG” option highlighted, with text below it stating “(In Alpha Testing)” View of the “Default page Editor” BookStack setting, with the mouse hovering a “New WYSIWYG (alpha testing)” option

Be wary though that, in its current state, the new editor can be less reliable, and specific content support can differ leading to loss of formatting in edge cases that may have been previously allowed. I don’t advise its use in production scenarios right now, it’s primarily in this release for wider testing to gain feedback.

This new editor is quite a significant undertaking. The editor UI controls are completely custom built from scratch and the core editing is based upon the Lexical library, although I made the decision to fork the lexical codebase into BookStack quite late during development due to some incompatible core design decisions made in lexical. This quite massively increases the maintenance surface area, but also provides us more control and possibilities around a fundamental part of BookStack. I’m thinking that as my funding continues to grow, it might even be possible to fund someone to help work part time specifically on some of the growing JavaScript/TypeScript components. This is all a bit of an experimental jump though, so I’ll be thinking about maintainability & sustainability quite a lot as we mature this editor over the next few releases.

Going forward, we’ll continue to improve and stabilize this editor to get it into a beta status, before eventually later making it the default WYSIWYG option. Then, in quite a few releases later, we’ll remove the existing TinyMCE based editor. It’s super important to me that this is a stable and easy switch-over for 99% of users.

Advanced Search Term Negation

It’s now possible to negate exact, filter, and tag search terms when performing searches in BookStack! This is done using a - prefix with the term. For example, a search of:

1
-"dog" -[Priority] -{is_restricted}

Will search for content that:

  • does not contain the exact text “dog”
  • that is not tagged with a tag named “Priority”
  • which does not have permissions set

This opens up search to a whole range of more advanced scenarios. Note that this is not supported for normal search terms though due to ambiguity in expectations and syntax, and negated terms are not currently reflected in the search UI (although they can still be used via search boxes).

Our search documentation has been updated to reflect negated terms.

Browser Search Support via OpenSearch

BookStack will now advertise OpenSearch support to browsers. I don’t mean the Amazon fork of ElasticSearch, but the standard used to tell browsers about the search functions of a website. For example, FireFox will now show an instance as an option to add for searching:

Screenshot of the URL bar in FireFox, with the mouse hovering a BookStack icon with a tooltip stating “Add search engine BookStack”

When added you can then, at any point, perform a search via the added BookStack instance using the FireFox URL/search bar. While this was possible to set up before, OpenSearch support automates much of the tedious setup work. Different browsers use this in different ways though, so how it presents in other browsers may differ.

A big thanks to @maximilian-walter for providing this feature to BookStack.

R & SAS Code Block Support

Another pair of code languages have been introduced as supported code block languages, enabling proper syntax highlight support. The languages are R and SAS:

View of code content in BookStack, one block of R code and one block of SAS code, with text in both showing in a range of colors for different parts of the language

PDF Timeout Option

In the last release we added the command-based PDF export option which allowed PDF exports to be generated using a custom command. One limitation of this was the default 15 second process timeout, which was found to be fairly limiting in some scenarios, so this timeout is now configurable:

1
2
# Allow 30 seconds for the export process instead of the default 15
EXPORT_PDF_COMMAND_TIMEOUT=30

Improved User Invite Failure Feedback

Sending user invites, when users are created by admins, is quite commonly the first use of emails within a new BookStack instance but if email has not been configured correctly & tested, this can result in an error when BookStack tries to send the invite. Previously this would just result in a generic error screen, leaving the admin needing to hunt around in error logs to understand what went wrong. From this release we now specifically show an error notification to explain the scenario, while returning the admin back to the user creation form with the existing data-prefilled.

An error notification in BookStack with the text “Could not create user since invite email failed to send”

This should hopefully avoid a frustrating start to many initial uses of BookStack.

Translations 🏴󠁧󠁢󠁷󠁬󠁳󠁿

This release adds a new language: Welsh! This is thanks to Crowdin member “KateBaber”’s continuous work over the last 10 months to develop out these Welsh translations.

Of course there’s been plenty of other great efforts by our translators, so a big thanks to the band of brilliant bilinguals below that have made contributions since our last feature release:

  • Ricard López Torres (richilpez.torres) - Catalan - 7922 words
  • KateBarber - Welsh - 7517 words
  • daniel chou (chou0214) - Chinese Traditional - 1883 words
  • Zero Huang (johnroyer) - Chinese Traditional - 1344 words
  • sarahalves7 - Portuguese, Brazilian - 821 words
  • petr.husak - Czech - 343 words
  • javadataherian - Persian - 274 words
  • Ivan Krstic (ikrstic) - Serbian (Cyrillic) - 246 words
  • Larry (lahoje) - Swedish - 237 words
  • Tim (thegatesdev) - Dutch; German Informal; French - 223 words
  • Martins Pilsetnieks (pilsetnieks) - Latvian - 217 words
  • Indrek Haav (IndrekHaav) - Estonian - 201 words
  • toras9000 - Japanese - 197 words
  • Marcia dos Santos (marciab80) - Portuguese - 191 words
  • cbridi - Portuguese, Brazilian - 190 words
  • Jihyeon Gim (PotatoGim) - Korean - 180 words
  • algernon19 - Hungarian - 172 words
  • Ngoc Lan Phung (lanpncz) - Vietnamese - 121 words
  • hollsten - Swedish - 104 words
  • Erik Lundstedt (Erik.Lundstedt) - Swedish - 101 words
  • Worive - Catalan - 95 words
  • Honza Nagy (honza.nagy) - Czech - 91 words
  • nanangsb - Indonesian - 84 words
  • Leonardo Mario Martinez (leonardo.m.martinez) - Spanish, Argentina - 76 words
  • m0uch0 - Spanish - 60 words
  • David (david-prv) - German; German Informal - 53 words
  • Hsin-Hsiang Peng (Hsins) - Chinese Traditional - 49 words
  • xgrug - Chinese Simplified - 46 words
  • Irjan Olsen (Irch) - Norwegian Bokmal - 40 words
  • Michal Melich (michalmelich) - Czech - 39 words
  • cracrayol - French - 37 words
  • Илья Скаба (skabailya) - Russian - 35 words
  • David Bauer (davbauer) - German Informal - 33 words
  • scureza - Italian - 33 words
  • Vitaliy (gviabcua) - Ukrainian - 32 words
  • yngams (younessmouhid) - Arabic - 32 words
  • Aleksandar Jovanovic (jovanoviczaleksandar) - Serbian (Cyrillic) - 23 words
  • Red (RedVortex) - Hebrew - 19 words
  • HrCalmar - Danish - 17 words
  • Avishay Rapp (AvishayRapp) - Hebrew - 16 words
  • 10935336 - Chinese Simplified - 11 words
  • matthias4217 - French - 10 words
  • Sascha (Man-in-Black) - German - 9 words
  • Ohadp - Hebrew - 8 words
  • Berke BOYLU2 (berkeboylu2) - Turkish - 5 words
  • etwas7B - German - 3 words

* Word counts are those tracked by Crowdin, indicating original EN words translated.

Next Steps

Efforts will be focused on maturing the new editor over the next release cycle, addressing issues raised in its wider testing. Build of the new editor introduces TypeScript into the BookStack codebase, so I’ll probably look to migrate more of our original JS code to TS.

It’d be nice to get back to some other features though, so I may also pick out a long-standing desired feature to focus on otherwise this year looks a bit thin due to so far focusing on maintenance work and like-for-like replacements of existing functionality.

Full List of Changes

Released in v24.10

  • Added ability to configure the PDF export command timeout. (#5119)
  • Added new Lexical based editor. (#5058)
  • Added not operator to search. (#4536)
  • Added OpenSearch support. Thanks to @maximilian-walter. (#5198)
  • Added SAS and R code language support. (#5206)
  • Added search term negation support. (#5239)
  • Added Welsh language to language list. (#5240)
  • Updated dompdf and bacon-qr-code libraries to new major versions. (#5222)
  • Updated page editor type to always exist in API and database. (#5117)
  • Updated translations with latest Crowdin changes. (#5188)
  • Updated user account creation to provide better email failure feedback. (#5195)
  • Fixed drifting search icon on smaller screen sizes. (#5204)

Released in v24.05.4

  • Updated API docs with consistent parameter types. (#5183)
  • Updated default content iframe embed max-width to align with other content types. (#5130)
  • Updated LDAP group sync to query via full DN.
  • Updated translations with latest Crowdin changes. (#5118)
  • Fixed books read API response not applying visibility control to chapter contents.
  • Fixed API docs users response showing extra property. (#5178)
  • Fixed database error thrown when using out dev docker setup. (#5124)
  • Fixed RTL display issues with tasklist checkboxes. (#5134)

Released in v24.05.3

  • Updated translations with latest Crowdin changes. (#5065)
  • Updated callouts with LTR text handling where supported. (#5104)
  • Updated project PHP and JavaScript dependencies.
  • Fixed blocked diagrams.net loading when using a custom URL that includes a port. (#5107)
  • Fixed OIDC incorrectly calling userinfo endpoint when valid empty groups provided. (#5101)
  • Fixed image replacement being case-sensitive when it should not be. Thanks to @DanielGordonIT. (#5096) (#5095)
  • Fixed HTML code block highlighting when custom self-closing tags are used. (#5078)
  • Fixed testing when custom ALLOWED_IFRAME_SOURCES is set. Thanks to @mueller-contria. (#5069) (#5068)

Released in v24.05.2

  • Fixed initial page publish changelog message not being saved if set. (#5056)
  • Fixed incorrect WYSIWYG code shortcut reference. Thanks to @bradenterpstra01. (#5036)
  • Added role create/update validation to warn about too-long external auth ID values. (#5037)
  • Updated GIF thumbnail generation to no support animation, to avoid issues with large-frame-count GIFs. (#5029)
  • Updated translations with latest Crowdin changes. (#5022)
  • Updated backup code description text to clarify their use. (#5017)
  • Updated docker-compose.yml to remove deprecated version. Thanks to @michaelortnerit. (#5052)

Released in v24.05.1

  • Updated PHP dependencies.
  • Updated routes with IP-based rate limiting. (#4993)
  • Updated email confirmation flow to not require email submission form.
  • Updated translations with latest Crowdin changes. (#4994)
  • Updated WYSIWYG alignment handling to also consider table align attributes. (#5011)
  • Fixed attachment upload validation errors appearing as JSON. (#4996)
  • Fixed incorrect notification preferences URL in email. Thanks to @KiDxS. (#5008, #5005)
  • Fixed non-visible MFA setup titles in dark mode. (#5018)
  • Fixed outdated path in visual theme system guidance. (#4998)
  • Fixed potential cache permission issues by reverting cache location. (#4999)

Header Image Credits: Photo by Ximonic (Simo Räsänen) (CC-BY-SA-4) - Image Modified