Modoboa 2.12.0 is available
Oct. 26, 2026 — Antoine Nguyen
Before you upgrade: IMAP hierarchy separator
Folder sharing requires Dovecot to use / as IMAP hierarchy separator: shared folders are listed as shared/<owner address>/<folder>, and addresses contain dots. Existing installations use ., so the switch is not automatic: the installer keeps enable_sharing = false in the [dovecot] section when it updates an existing configuration file.
If you want to enable folder sharing, folders are not renamed on disk, but the folder names stored in Sieve filters and in the webmail settings must be converted. The new migrate_imap_separator command takes care of it (#4319, #4343):
- back up everything, then list what will be converted with --dry-run
- switch Dovecot to /: with the installer, set enable_sharing = true and run it in upgrade mode; otherwise add separator = / to the inbox namespace and reload Dovecot
- right after, run the command for real (it can be run again safely if it reports errors)
python manage.py migrate_imap_separator --dry-run
# switch Dovecot to '/', then:
python manage.py migrate_imap_separator
Between the two steps, filters can't find their target folders: messages are delivered to the inbox instead, nothing is lost. The command needs doveadm (run it on the mail server or use the doveadm HTTP API), only converts fileinto commands, and folder names can't contain . anymore. The upgrade guide has every detail.
Webmail
- Folder sharing: users can share their folders with other accounts, based on IMAP ACL (#4321, #4322). Shared folders are tracked and their ACL are cleaned when an account is deleted or renamed (#4320)
- Compose form: attachments are managed within the form (#4277), the recipients input is improved (#4278), drafts are saved automatically and a warning shows up before leaving the form (#4279)
- Undo send: a message can be recalled right after clicking send (#4285)
- Threads: reply directly within the thread view (#4289)
- Fixes: scheduled messages are deleted properly and a cancelled message is no longer lost (#4288), folder lists use the server IMAP hierarchy delimiter (#4302), and a style attribute holding several URLs no longer breaks message display (#4332)
Dashboard
The administrators dashboard is redesigned (#4335), and resellers and domain administrators now get statistics too.
- New traffic, activity and system widgets, with statistics for resellers and domain administrators (#4337)
- Widgets load independently, with skeleton and error states: a slow widget no longer holds the whole page (#4336)
- The news feed widget highlights recent posts (#4333)
Calendars
- External feeds: users can subscribe to external iCalendar feeds (#4328)
- Recurring events: they can now be created and edited (#4329)
Contacts
CardDAV synchronization got a thorough overhaul:
- Sync is scoped to the user's address book (#4304), the CardDAV client and contact API are hardened (#4305), and the resource name is tracked with a complete vCard mapping (#4306)
- The address book is pushed to CardDAV in a background job (#4309), sync recovers from failures (#4310) and can be enabled again (#4311)
- Fewer HTTP requests and SQL queries during sync (#4315)
- Interface: contacts are shown and searched by display name (#4316), the page number is reset when switching category (#4317), and long values are truncated when importing a CSV file (#4314). Cleanups in #4313
Sieve filters
- An existing filter set is no longer overwritten (#4291)
- Proper errors are returned instead of 500 (#4292), and the frontend handles API errors and URL encoding correctly (#4298)
- The Sieve client is more robust (#4293), and namespaces are loaded before listing mailboxes for action templates (#4287)
Administration
- Access checks: account lookups are scoped and the right permission is checked on POST actions (#4340)
- Plugins: plugins can extend the account serializers and pages (#4323, #4325) and add badges to accounts, with a filter by badge in the list (#4326). The shared mailboxes of Modoboa Pro are presented in the interface (#4327)
- Auto-configuration: works with Thunderbird Android (#4330), and Thunderbird placeholder support in AutoDiscover/MobileConfig is fixed again (#4101)
- Fixes: account rename and mailbox creation on update (#4303), a queued mailbox operation is kept when the maildir is unreadable rather than missing (#4294), a missing RRD directory is rejected before statistics jobs (#4284), and the background color comes from the theme (#4339)
Dependencies, localization and development
- Dependencies: Django 5.2.18 (#4281), django-otp 1.7.5 (#4282, #4312), django-reversion 6.4.0 (#4307), caldav 3.6.0 (#4296, #4308, #4344), and sievelib 1.6.0 is required (#4290)
- Translations: French and Japanese are updated (#4295, #4324, #4341, #4342)
- Development: IMAP ACL and shared namespace are enabled in the development Dovecot (#4318), dead code and the bundled rfc6266 copy are removed (#4299, #4300), and the alarms status filter is covered by tests (#4338)
Thanks
Welcome to our new contributors mvanhorn, feafel and annejan, and thanks to ntninja for the Thunderbird auto-configuration fix!
Upgrade
After the version-specific steps above:
pip install -U modoboa
cd <modoboa_instance_dir>
python manage.py migrate
python manage.py collectstatic
python manage.py check --deploy
python manage.py load_initial_data
sudo systemctl restart uwsgi supervisor
Full changelog: 2.11.1...2.12.0