MailFlow v3.0.0
A major release built around three headline additions — a real plugin system, retro themes, and detached message windows — plus a couple of correctness fixes for attachments and sent mail.
Highlights
Plugin system
GTD is no longer baked into the core — it's now the first fully self-contained MailFlow plugin, running behind a generic capability layer and a bounded plugin API. This is the foundation for third-party plugins going forward.
- Per-user plugin activation with a new Plugins section in Settings, so each user chooses what's enabled.
- Plugins get a bounded engine facade rather than raw internals, plus registries for UI slots, context-menu items, row-hover actions, settings categories, and WebSocket/reconnect handlers.
- A headless plugin runtime means plugin logic (like GTD's sections fetch) no longer lives in core app code.
- Plugin author guide added for anyone building against the API, with CODEOWNERS for the GTD plugin.
- CI now enforces the Tier-2 plugin import boundary on every build, so core and plugins stay properly separated.
Retro themes
Two new early-2000s themes for the nostalgic: Windows XP (Luna) and Windows Classic (9x), each paired with era-appropriate fonts and scoped skeuomorphic styling across the sidebar, message list, compose window, and settings.
Detached message windows (#219)
Double-click a message to pop it out into a floating, in-app window you can move, resize, minimize, and dock. Multiple minimized windows dock side by side. Read/star/AI/print keep the window open; archive/trash/move/spam/snooze dismiss it. Desktop-only.
Fixes
- Attachments: downloading a file with a non-ASCII filename (e.g. Cyrillic) no longer fails with
ERR_INVALID_CHAR. The real name is carried viafilename*=UTF-8''…with an ASCII-safe fallback, including the "download all" ZIP path (#367). - Sending: the IMAP Sent copy is now appended with CRLF line endings instead of bare LF, fixing mis-parsed
Subjectand droppedTodisplay-names on strict servers like PurelyMail/Dovecot (#365). - Retro themes: beveled compose window frame, themed settings modal (frame, tabs, sub-tabs, corners), and flattened sidebar selection, message cards, and notice banners.
- Fonts: guard
applyFontSetagainst a missing DOM so it can't throw.
Upgrade notes
- The GTD migration to the plugin model is automatic — legacy tables and columns (
gtd_pets,gtd_gist,gtd_enabled/gtd_folders) are dropped and their data moved to the genericplugin_data,plugin_account_config, and per-message annotation stores. Existing GTD users are grandfathered into the plugin on upgrade; no manual action required. - Self-hosted (build-from-source): pull
mainand rebuild. - GHCR image users: pull
3.0.0(or3.0/latest). - Native desktop/mobile app builds are not part of this release — they remain manual-only pending signing and the outstanding native-security items.