BookStack Release v25.07

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:

BookStack page markdown editor, with options dropdown showing and mouse hovering over a “Plaintext editor” checkbox

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:

View of a description input, showing an editor box with a few formatting controls: Bold, italic, link and lists

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.

BookStack page editor view focused on an open changelog input, which contains three lines of text and a 93/180 character counter below the input

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.

List of import API endpoints: GET list, POST create, GET read, POST run, and DELETE delete

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”:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<style>
  .book-tag-pair-categorisation-important main:before,
  .tag-pair-categorisation-important main:before {
    content: 'This content is marked important!';
    display: block;
    padding: .25rem 1rem;
    background-color: orange;
    margin-bottom: 1rem;
    color: #FFF;
    font-size: 12px;
    border-radius: 4px;
    font-weight: bold;
  }
</style>

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:

BookStack page sidebar showing a fade over the contents lists which is disappearing behind the header bar

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