BookStack Release v25.07
Dan Brown posted on the 30th of July 2025
Today we release the July 2025 version of BookStack which brings a varied bundle of improvements across the platform for better editing, extra customization capabilities and more!
Markdown Plaintext Input
The markdown text edit area has made use of CodeMirror to provide code-based features like markdown syntax highlighting, line numbering and some autocomplete features, in addition to providing a nice interface to work with from a development point of view. Unfortunately though the use of a smarter editor like this could introduce compatibility issues with certain browser-level features such as spell-checking, searching and other extensions. To help avoid these issues, there’s now an option in the markdown editor to use a plaintext text-area instead:
While I originally thought this would be a simple input swap on option change, in the end I spent a lot of extra time matching the existing CodeMirror functionality as best as possible. This meant supporting the same range of editor shortcuts, drag & drop features, scroll syncing and editor action buttons.
New WYSIWYG Editor for Comments & Descriptions
In the last release the new WYSIWYG editor moved to a Beta status. As part of its continued slow roll-out, book/chapter/shelf description boxes and comment inputs now use the new WYSIWYG editor:
This is a cut-down version relative to its use for pages, and should match the prior TinyMCE based editor in terms of supported functionality, but this should get the fundamental new editor code used & exercised in a lot more cases to help test things further before it eventually becomes the default editor for pages.
New WYSIWYG Editor Improvements
On the topic of the new WYSIWYG editor, it’s received a whole load of improvements and fixes since the last feature release:
- Added toolbar for media elements for easier menu access.
- Added ability to insert new paragraph on click under certain last hard-to-escape blocks (tables, drawings etc…).
- Updated media embed code field to show existing embed code for direct editing.
- Updated media resize handling to be more reliable and to retain focus after resize.
- Updated table resize handles to be more efficient, and prevented them wondering far away from tables so often.
- Updated source code popup with larger input.
- Updated source code generation with newlines between top-level blocks.
- Fixed buggy media selection scenarios.
- Fixed media form “src” field not working when video is using source elements.
- Fixed table resize handles overlapping table captions.
- Fixed text formatting being inconsistent on new paragraphs.
- Fixed tiny image resize square on image insert.
- Fixed text highlight action & updated label.
- Fixed unstable table cell background colours.
- Fixed incorrect header levels used via format shortcuts.
- Fixed UI menu not reflecting block format changes.
- Fixed URLs not allowing any protocol as per old editor.
A big thanks again to all those that have provided valuable feedback via our beta discussion thread, this is essential for progressing the editor to a stable position. I continue to welcome further feedback in that thread regarding any issues found.
Changelog Input Changes
The page changelog input has been improved to provide a little extra editing breathing room, since a single line input could get a little cramped, while also showing a character counter to help avoid scenarios where text would be unexpectedly cut down on save.
Thanks to @shresthkapoor7 for providing this enhancement.
ZIP Import/Export API Endpoints
Back in v24.12 we introduced the importable ZIP export format. Now that this has had some use without report of significant issues, it seemed a sensible time to now roll this out to BookStack’s REST API.
There’s new export-zip
endpoints for books, chapters, and pages in addition to a range of endpoints for listing, showing, uploading, and running imports.
Thanks to @LM-Nishant for starting off the work on this one.
Parent Tag Classes
For a while tag classes have been available to provide an easy method of applying customizations.
These are simple CSS classes added to the <body>
of the HTML page so that customizations can perform tag-dependant
style or JavaScript code changes/actions depending on what tags are applied.
These have worked well for pages but it was hard to use them for wider-scoped customizations, like entire book/chapter customizations for example.
In this release we now include classes from parent chapters & books. These are distinct from standard tag classes since these will include the name of the parent item type. As an example, A tag of name Categorisation
with a value of Important
set on a book will result on the following classes being set on the <body>
when viewing child chapters/pages:
book-tag-pair-categorisation-important
book-tag-name-categorisation
book-tag-value-important
You could then use these to apply customizations to an entire book. For example, if you then wanted this book-level tag to add a banner on the book and all main child chapter/page views, you could use the following “Custom HTML Head Content”:
|
|
Details of tag classes can be found in our docs.
Multi-Column Layout Refinements
In this release cycle I spent a little time refining the sidebar behaviour in the main three-column layout used for most views. Sometimes, especially at tablet & half-desktop sizes, you’d see sidebar content be cut with harsh edges. Spacing has now been altered to make this far less frequent while also making better use of space at those smaller screen sizes.
I’ve also added a fade to the sidebars when content is scrolled out of view to provide an indication that there’s content there to uncover:
Updated Permission Generation Handling
Upon certain action, such as item creation or permission change, BookStack will recalculate & store view access rights. In some cases, where changes were made in parallel, this could fail leading to content being hidden from everyone until permissions we regenerated.
For this release careful consideration has been applied to these actions, wrapping them at a higher level in transactions, in a way that allows parallel changes to not fail, instead allowing each change to block other changes when needed.
Translations
Since the last feature release Nepali has been added as a new language option! A big thanks to Angel Pandey, Supriya Shrestha and gprabhat for their contributions which quickly made the translations for Nepali complete.
And of course a huge thanks to all the professional passage processors below who have contributed translations since the last feature release:
- Angel Pandey (angel-pandey) - Nepali - 12227 words
- Ngoc Lan Phung (lanpncz) - Vietnamese - 4903 words
- ahmad abbaspour (deshneh.dar.diss) - Persian - 1184 words
- Al Desrahim (aldesrahim) - Indonesian - 888 words
- Supriya Shrestha (supriyashrestha) - Nepali - 754 words
- gprabhat - Nepali - 623 words
- toras9000 - Japanese - 131 words
- Honza Nagy (honza.nagy) - Czech - 128 words
- TapioM - Finnish - 83 words
- scureza - Italian - 34 words
- m0uch0 - Spanish - 33 words
- cbridi - Portuguese, Brazilian - 33 words
- Tim (thegatesdev) - Dutch - 31 words
- David (david-prv) - German - 30 words
- CrazyComputer - Chinese Simplified - 61 words
- matthias4217 - French - 19 words
- CellCat - Chinese Simplified - 12 words
- lingb58 - Chinese Traditional - 10 words
- mabdullah - Arabic - 6 words
- Ehsan Sadeghi (ehsansadeghi) - Persian - 5 words
- Firr (FirrV) - Russian - 2 words
- LiZerui (iamzrli) - Chinese Traditional - 2 words
- Indrek Haav (IndrekHaav) - Estonian - 1 words
Word counts are those tracked by Crowdin, indicating original EN words translated.
Next Steps
For the next development cycle I’m going to start to think about the extension/developer capabilities of the new WYSIWYG editor, so that many of the existing hacks/customizations could potentially be transferred to the new WYSIWYG editor as this will be an important requirement before making it the default.
A few months back I built a concept implementation of somewhat native LLM integration into BookStack, allowing search and LLM-based querying. I plan to revisit this and take it further to better answer/understand the questionables & considerations I discovered in my first exploration.
Full List of Changes
Released in v25.07
- Added plaintext markdown page editor input option. (#5725, https://github.com/BookStackApp/BookStack/issues/5705)
- Added ZIP Import/Export API endpoints. Thanks to @LM-Nishant. (#5721, #5592)
- Added tag-classes based upon parent book/chapter. (#5681, #5217)
- Updated comment and description inputs to use the new WYSIWYG editor. (#5676)
- Updated 3-column layout with better usability. (#5685)
- Updated changelog input to large area with character counter. Thanks to @shresthkapoor7. (#5663, #5434)
- Updated mail logic to remove use of our custom patched Symfony mailer. (#5636)
- Updated translations with latest Crowdin changes. (#5696)
- Updated many actions to better handle parallel permission generation. (#5689, #4838)
- Updated new WYSIWYG editor with improvements & fixes. (#5731)
- Updated PHP package versions.
Released in v25.05.2
- Added Nepali Language. (#5677)
- Updated translations with latest Crowdin changes. (#5695)
- Updated PHP package versions.
- Updated content diffs to better group non-ascii language characters into words.
- Fixed error when loading opensearch endpoint with certain PHP in some environments. (#5673)
- Fixed namespace for test case. Thanks to @bumperbox. (#5668)
Released in v25.05.1
- Updated new WYSIWYG editor with a range of fixes. (#5653)
- Fixed comment updates showing incorrect notification text. (#5642)
- Fixed search system ignoring words adjacent to non-breaking spaces. (#5640)
- Updated translations with latest Crowdin changes. (#5637)
Header Image Credits: Photo by Dmitry Djouce (CC-BY-2) - Image Modified