Plugin System, Language Extensions & Simplified Styling
We're excited to announce a major update to BonitoBook that transforms it from a single-purpose notebook into an extensible platform. This release introduces a powerful plugin system, extensible language evaluators, and a completely redesigned styling architecture.
1. Plugin System: Transform Your Notebooks
The biggest new feature is a flexible plugin system that lets you completely customize how notebooks are rendered and behave. Plugins are modules that define custom book types and rendering logic.
Creating a Plugin
Plugins live in
.name-bbook/book.jl
or a shared
.bbook/book.jl
:
From the plugin guide:
Built-in Plugin Examples
We've included three example plugins showcasing different use cases:
Slideshow Plugin - Turn notebooks into presentations
Draggable Plugin - Interactive drag-and-drop layouts
Book Plugin - Custom book formats with enhanced styling and table of content
2. Extensible Language Evaluators
BonitoBook now supports an extensible evaluator system for any language. We've moved language-specific code into extensions and made it easy to add new languages. Python support now needs using PythonCall.jl and CondaPkg:
Variables are automatically transferred between Python and Julia scopes, and the Python environment persists across cells.
Creating Custom Language Evaluators
Adding a new language to BonitoBook is straightforward. From the language evaluator guide:
Dependency Reduction
As part of this refactoring, we've moved WGLMakie to an extension, significantly reducing BonitoBook's dependency footprint and load times. Makie is still fully supported but only loaded when needed.
3. Simplified Styling System
The styling system has been completely redesigned around a single
generate_style()
function with comprehensive CSS variables.
Before and After
Before: Styles scattered across
styles/style.jl
with hardcoded values everywhere
After: Single
style.jl
file with 70+ optional parameters:
Lazy File Loading
The new folder structure uses lazy initialization:
.name-bbook/
├── book.jl # Plugin definition (optional)
├── style.jl # Styling (lazy-loaded from template)
├── include.jl # Optional include file, with code run on start
├── ai/ # AI configs (lazy-loaded)
├── data/ # Data files
└── meta.toml # Version tracking
Files are only created when you edit them - until then, they're loaded from templates. This makes updates easier, keeps your repository clean while maintaining full customizability. We also fixed
include
and added an optional
include
file you can add to the notebook, which will run all code inside it on startup.
4. Usability Improvements
Beyond the major features, numerous small improvements enhance the daily experience:
-
Inline slider values:
@manipulate
now shows current values next to sliders using flexbox -
File tab tooltips: Hover over tabs to see full file paths
-
Better mobile styling: Improved responsive design for tablets and phones
-
Consistent spacing: All UI components now use the CSS variable system
-
New cell menu: It was quite annoying that the new cell menu changed the whole layout, so now it's fixed and opens a non obstructive hover menu
-
More Tooltips: Added quite a few Tooltips to explain the UI
-
fixed include: include wasn't working which should be fixed now
Migration Guide
Upgrading is straightforward:
For Books Without Custom Styling
-
Delete your
.name-bbook/
folder -
A fresh structure will be created automatically the next time you run the book
For Books With Custom Styles/Plugins
-
Backup your
book.jl
and custom styles -
Delete the old folder structure
-
Recreate using the new plugin system if needed
-
Use
generate_style()
for styling customization
The new
meta.toml
file tracks versions and helps detect when migration is needed.
Looking Ahead
This release shows how BonitoBook can be an extensible platform rather than a single-purpose tool. The next feature we plan to work on is a plugin for an LLM agent dashboard and polish the LLM integration. The plugin system opens up exciting possibilities for specialized notebook formats - we can't wait to see what the community builds!