Welcome | Get started | Dive | Contribute | Topics | Reference | Changes | More

2026

This is the 2026 change log for Lino. Learn how to read and maintain this document in Documenting changes.

2026-03-12

An application developer can now temporarily change a @schedule_often into @schedule_often(log_level=”DEBUG”) for debugging. Until now Lino always always forced lino.modlib.linod.SystemTask.log_level to WARNING for background tasks with a frequency specified in seconds.

2026-03-10

Added new mixins FormatPreviewable and HistoryAwarePreviewable and new actions ResetToRevision and CompareRevisions, see their corresponding documentations.

2026-03-05

Introduce new action ForgetMe on User to schedule the deletion of all data related to a user. Running this action sets the current datetime on User.forget_me_since. The actual deletion of data is done by a data checker ForgettableChecker that looks for objects that are instances of Forgettable mixin and whose Forgettable.get_forgettable_data method returns a queryset that contains objects that are related to the user and needs to be deleted. The data checker calls the Forgettable.forget() method on these objects, which deletes them unless the developer has defined a custom behavior.

Changes in lino.modlib.printing: Add new attribute DocumentClass.mirror_pages. Add a keyword argument with_url to Addressable.get_address_lines(). Both features are currently used only by songbook.weasy.html. TODO: use it also in the other document classes.

Add new plugin setting auto_load_config_files, which defaults to False. Set it to True to preserve old behaviour (which is to look for a series of image files in the config directory). This feature isn’t used on any production site and I think we can deprecate it. Only the DocumentClass.page_background_image seems useful and recommended.

2026-02-26

The new choicelist lino.modlib.printing.DocumentClasses (#6632) makes it possible to have multiple sets of layouts for printable documents.

The settings.py potentially need manual conversion; instead of saying:

yield ('weasyprint', 'header_height', 30)

in your get_plugin_configs() you must now override (e.g.) your startup() method:

def startup(self):
    super().startup()
    self.models.printing.DocumentClasses.default.header_height = 30

You can now start numbering the items of a page at an arbitrary number. Added a new field Page.start_num, and Sequenced now calls this instead of unconditionally starting with 1.

2026-02-24

Updated the signature of msg_func (the 5th positional argument to notify.Message.emit_notification) now takes user as the only positional argument.

2026-02-20

New feature #6605 (A feedback form for collecting contact data). New plugin lino.modlib.webforms. Visible in noi2: the pages “Contact” and “Register” each contain a form that is generated from the insert_layout of the respective model and whose submit button does the same AJAX request under publisher as under react. The body of these pages contains a memo command [show webforms.RequestContactsWeb.insert], which is a new variant of the show command.

2026-02-10

New site setting lino.core.site.Site.unwrap_span_tags.

2026-02-03

Moved TextFieldTemplate from tinymce to jinja. The biggest side effect now is the menu location: “My text field templates” was moved from “Configuration” to the main menu and “Text field templates” was moved from “Explorer” to “Configuration”.

2026-01-27

A subtle optimization for #6595 (Suboptimal breadcrumbs in SectionResponsesByCertificate): When get_parent_links() yields at least one breadcrumb, then Lino no longer adds a link to the list view. Added instructions for testing Breadcrumbs in the manual test suite.

2026-01-26

New features ensure_even_pages and clear_cache_of_children for lino.modlib.printing.MultiCachedPrintable (#6591).

2026-01-12

Added new Model attribute exempt_from_clean. The field names given on this Iterable/Sequence are exempted from validation during full_clean. By default all VirtualField if this set is empty (NOT overridden).

2026-01-08

Add a new database field lino_xl.lib.trading.TradingRule.journal. In Lino Studio we want a default value for lino_xl.lib.trading.TradingRule.columns_to_print per journal.