Dependencies: Next.js 16.4.2 and DOMPurify 3.4.17 fix six published advisories, three of them critical. None of them reached Bulwark: the webmail has no use cache functions and no Server Actions, its image optimizer refuses SVG and runs on sharp 0.35.5, which already carries the fix, and the mail sanitizer uses none of the DOMPurify modes the bypasses need (SAFE_FOR_TEMPLATES, IN_PLACE, XHTML parsing). Updating is still recommended
1.17.1 stops the background-notifications prompt from asking you to turn push on while the app is still restoring a subscription the browser dropped, and an open tab now repairs a dropped subscription on its own. The message list stays within the screen on phones, and a browser that was already signed in hands a mobile sign-in to the app again.
Dependencies: vitest 4.1.12 and vite 8.3.5 (npm audit)
Fixes
Push: The background-notifications prompt waits for the background re-sync and only asks if push is still off afterwards, instead of appearing while the app is restoring a subscription Safari dropped (#1321, thanks @oguzyilmaznet)
Push: A tab that stays open notices when the browser drops or replaces its push subscription and registers the new one at once, and coming back to the tab recreates a lost subscription instead of waiting for the next reload (#1321)
Mobile: On phones, the message list is never wider than the screen, so the header's buttons, each row's date and the subject's ellipsis stay on screen and the selection toolbar compacts its buttons
Login: A mobile sign-in opened in a browser that was already signed in keeps the sign-in form and hands the sign-in to the app, instead of opening the mailbox and leaving the app stuck in its sign-in sheet
VersityGW Security Update: Go crypto/x509 Certificate Distrust
This release updates VersityGWβs Go toolchain to include Goβs fix for CVE-2026-111943 (Go issue 82345). The fix blocks certificate chains containing compromised eMudhra intermediate certificates.
VersityGW uses Goβs certificate verification when connecting to TLS-protected services, including S3-compatible storage, IAM/OIDC providers, Vault, LDAP, and webhooks. Before the fix, a network attacker able to intercept or redirect one of these connections could potentially use a certificate issued through an affected intermediate to impersonate the service. After the update, Go rejects those chains, and connections to endpoints still presenting them may fail until their certificates are replaced.
This fix applies to binaries rebuilt with a patched Go toolchain. Go 1.26.10 and Go 1.27.3 contain the fix; use a later patched release if available. Existing VersityGW binaries must be rebuilt and redeployed. Connections configured to skip certificate verification do not receive this protection. These release artifacts are built with Go 1.27.3.
Action: Upgrade to this VersityGW release and redeploy. If you operate a TLS endpoint that VersityGW connects to, confirm its certificate chain does not use a distrusted intermediate.
Changelog
5fd3386 chore(deps): bump github/codeql-action from 4.38.2 to 4.38.3
53fdd1b chore(deps): bump github/codeql-action from 4.38.3 to 4.39.0
2bece2f chore(deps): bump the dev-dependencies group with 38 updates
626ec9a chore(deps): bump the dev-dependencies group with 8 updates
9503489 docs(helm): note tpl caveats for extraObjects
1f7e6dd feat(helm): add extraObjects for additional manifests
a987fb2 feat: run functional tests on FreeBSD in CI
1207dd1 fix(posix): make the listing skip-directory list configurable
c07ffdc fix(webui): send the LocationConstraint when creating a bucket outside us-east-1
7662573 fix: accept HTTP dates for LastModifiedTime in DeleteObjects
9debca3 fix: echo the client ETag in InvalidPart errors and stop duplicating request ID headers
a7b91dd fix: honor encoding-type=url in ListObjects and ListObjectsV2
For developers using the agent as a Go package, Agent.Start now requires a context.Context.
For authors of integrations, existing memory fields other than memory percentage are deprecated in favor of new fields which provide raw byte values. The deprecated fields are still populated, but will be removed from the API in a future version.
typeStatsstruct {
// Deprecated fields (populated on hubs <= 0.21.1; will be removed in a future version)Memfloat64`json:"m" cbor:"2,keyasint"`// Deprecated: GB, use MemBytes. Memory GB fields are kept for older hubs and integrations.MaxMemfloat64`json:"mm,omitzero" cbor:"-"`// Deprecated: GB, use MaxMemBytes.MemUsedfloat64`json:"mu" cbor:"3,keyasint"`// Deprecated: GB, use MemBytes.MemBuffCachefloat64`json:"mb" cbor:"5,keyasint"`// Deprecated: GB, use MemBytes.MemZfsArcfloat64`json:"mz,omitzero" cbor:"6,keyasint,omitempty"`// Deprecated: GB, use MemBytes.Swapfloat64`json:"s,omitzero" cbor:"7,keyasint,omitempty"`// Deprecated: GB, use SwapBytes.SwapUsedfloat64`json:"su,omitzero" cbor:"8,keyasint,omitempty"`// Deprecated: GB, use SwapBytes.// New fields (populated on hub version 0.21.1+ for all agents)MemBytes [4]uint64`json:"mem,omitzero" cbor:"41,keyasint,omitzero"`// [total, used, buff/cache, zfs arc] bytesMaxMemBytesuint64`json:"memm,omitzero" cbor:"-"`// max used memory bytesSwapBytes [2]uint64`json:"swap,omitzero" cbor:"42,keyasint,omitzero"`// [total, used] bytes
}
Add TLS certificate expiry alert for network monitors (#2627)
Add opt-in cgroup CPU and memory accounting (#2505)
Add pagination with a shared rows-per-page setting to data tables (#2444)
Add IRQ, SoftIRQ and Nice to the CPU usage breakdown (#2647)
Add OAUTH_DEFAULT_USER_ROLE environment variable to set the role of new OAuth users (#2516)
Add HUB_HEADERS environment variable to set custom WebSocket headers on the agent (#2585)
Add option to ignore TLS errors for HTTPS monitors (#2500)
Add zpool status messages to ZFS pool health (#2509)
1.17.0 gives plugins real panels: a panel next to the message you write or read can fill its height, start folded, be opened by the plugin, and be dragged wider, and plugins get right-click menus on selected text in the composer and in a message. Plugins can also search mail and the settings, read the user's preferences and the app's version. The AI Writing Assistant in the marketplace builds on this and needs this release. The reader's side panel stays open from message to message, and the admin panel is reworked around a settings-style sidebar with one URL per page. The Docker images move to Node.js 24.22.1 for a Node.js security fix.
Server: The Docker images are built on Node.js 24.22.1, which fixes an out-of-bounds write in the Brotli decoder (CVE-2026-111497). The server decodes Brotli responses when it fetches a calendar subscription, a WebDAV share or a plugin request, so a signed-in user could point it at a host that sends a crafted response and run code on the server. The same Node.js release fixes TLS hostname checks for servers addressed by IP. Standalone installs run on the system's Node.js: update it to 22.23.4, 24.22.1 or 26.12.1
Features
Plugins: A panel slot (composer-sidebar, composer-sidebar-right, email-detail-sidebar) can fill its panel and scroll inside (fill), start folded until the user or the plugin opens it (startFolded), and be opened, closed and toggled by the plugin with api.ui.openPanel, closePanel and togglePanel, which answer null where no panel is on screen (phones), so a plugin can fall back to a dialog. A panel opened this way gets a focusRequest prop
Plugins: The composer's plugin panels get the composer id, the draft and the selected text as it changes; the reader's side panel gets the selected text; reader frames learn whether they are on a phone, a tablet or a desktop (deviceType)
Plugins: Right-click menus on selected text: composer-selection-menu in the message being written and reader-selection-menu in an open message. The browser's own menu stays until a plugin adds entries; the webmail then draws Cut and Copy and the plugin's entries, and the click carries the selected text
Plugins: Text selected inside a message's body (an HTML mail in its frame) now reaches onTextSelectionChange
Plugins: Plugins can search mail with api.email.search, search the settings and read the user's preferences, and read the app's name and version with api.app.getInfo
Mail: The reader's side panel stays open when you move to another message, and its toggle sits in the reader toolbar, which now runs over the side panels to the right edge
Composer: The plugin panels beside the composer can be dragged wider or narrower, and keep their width
Admin: The admin panel is reworked around a settings-style sidebar with one URL per page, the real navigation rail and extension icons
Fixes
Mail: Rescheduling a scheduled message cancels the original send before creating the new one, so it works on servers that allow one active submission per message (#1308)
Mail: Dragging messages out of the list and downloading attachments, inline images and the raw message in the Pro view use the account that owns the message, so shared and secondary-account messages no longer fail (#1299, #1300, thanks @VasilisNtovolos)
Mail: Deleting a message from its hover actions shows the actions on the next row that slides under the pointer, so you can delete one after another from the same spot (#1297, thanks @dealerweb)
Mail: PDF attachment previews open in Safari (#1301)
Mail: The contact card for a sender or recipient opens in place instead of sliding in from the top left
Plugins: A plugin's passphrase dialog stays open while you type (#1302)
Plugins: The push preference mirror no longer throws in sandboxed plugin frames (#1298, thanks @dealerweb)
Layout: A pane divider stops following the mouse when the button is released over a frame
i18n: The German dialog that hands a sign-in to the mobile app is translated (#1296, thanks @dealerweb)
This is a fourth security release in the continuation of 1.30.x, mostly to address some severe PHP vulnerabilities and update our official alternative Docker images (Alpine) (our default Docker images based on Debian were already fixed).
Note that our rolling-release channel (edge) is recommended for faster security patches.
This release adds native Podman support, hostname configuration, and a delay option for new image auto-updates. It also improves performance and hardens Docker operations, projects, backups, and authentication.
This is a third security release in the continuation of 1.30.x, mostly to address some severe PHP vulnerabilities and update our official default Docker images (Debian) (but not our alternative Alpine images yet, which are delayed).
Note that our rolling-release channel (edge) is recommended for faster security patches.
docs: contributor docs are excluded from prettier checks (#28062)
lint: eslint fails to parse vitest.config.ts in admin/server packages (#28064)
lint: extra-policy oxlint perf on the blocking gate (#27671)
review-workflows: migrate unit tests from jest to vitest (#27388)
review-workflows: stop passing ignored populate to workflow create and update (#27865)
types: centralise the window.strapi type in @strapi/types (#26213)
upload: enforce the media MCP ambient guard by construction (#27617)
π Enhancement
database: describe connection pool timeouts (#28000)
utils: avoid rebuilding curried traversal wrappers on every call (#27947)
utils: remove per-key allocations from the query traversal (#27233)
β οΈ Changes to be aware of
Database driver update (knex 3.3.0)
Custom code that uses strapi.db.connection and calls delete() with limit or having, or truncate() with where, having or limit, now throws on PostgreSQL and SQLite. MySQL now applies the LIMIT. Before, the limit was ignored and every matching row was deleted, so check plugins or scripts that build such queries. Connection pool timeout errors now include the underlying connection error, and knex warnings now appear in the Strapi log as [database] knex: β¦.
Token and role names are limited to 255 characters
The name and description of API tokens, admin tokens, transfer tokens and admin roles now accept at most 255 characters. Longer values get a validation error under the field. Before, PostgreSQL returned a generic server error. Existing tokens with longer values keep working, but the admin rejects that long text on save until you shorten it.
Strapi now uses undici 8, which requires Node.js 22.19.0 or later. The engines field still says >=20.0.0, so check your runtime: this release was only tested on Node 22.20 and later.
The upload plugin now applies sharp.limitInputPixels. Strapi refuses to start if the value is not true, false or an integer of 0 or more. A value read straight from an environment variable is a string, so use env.int().
Known issue: deleting an entry changes past releases
When you delete an entry that belongs to a release that was already published, the entry is removed from that release, and the release status changes from "done" to "empty" or "ready". The published content is not affected. This already happened for localized entries, and it now happens for all entries.
In Settings > Webhooks, if you clear the last header row and type a new header name, the old text can stay in front of it (for example X-CX-D instead of X-D). Check the header names before you save.
1.16.0 regroups the settings into fewer pages with an Advanced switch for the power-user options, shows the message list as columns on request, turns @mentions into contact chips, and opens the company directory in contacts and the composer. The marketplace can install any version of an extension and roll back to a replaced one, admins get policies for the colour mode, archiving and the provider sign-out, and the Estonian locale arrives. A security audit of the whole app fixed cross-account actions on repeated message ids and about thirty smaller findings.
Mail: Delete, move and drag in merged views and cross-account search act on the clicked message. When two accounts had messages with the same id, the action could hit the other account's message, which also made sent mail vanish from the Sent folder (#857, GHSA-8x23-qw3w-mhrx, thanks @FeliceBalsamo and @knittingcode)
Mail: HTML attachments preview as sanitised text in a locked frame. The preview used to open the sender's HTML as a same-origin document that could run script in the webmail origin
Mail: A crafted style attribute, read-receipt header, mail body or subject no longer freezes the reader or the message list
Mail: Only an SPF or DKIM pass aligned with the From domain counts as sender verification, and oversized winmail.dat and embedded message parts stay attachments instead of being decoded on open
Mail: Attachment names show without directional override characters, and imported and synced HTML templates are sanitised before the composer previews them
Login: The login page asks before handing a sign-in to the mobile app, and only hands it to the app's own callback link
Login: Failed sign-ins are capped per client at 5 in 15 minutes, and the client address is forwarded to the mail server as X-Forwarded-For so the server's own limits hit the client instead of the webmail. Add the webmail to Stalwart's server.proxy.trusted-networks for that to take effect
Login: Synced settings are keyed on the account a token login resolves to, not on the claimed name, so two users can no longer share a settings blob
Admin: OAuth client secrets and the session secret stay out of the admin audit log, the config API and dashboard writes
Admin: OAuth discovery no longer follows a redirect to another host, the extension directory URL cannot point at a private address, a directory keyring older than the newest one seen is refused, marketplace versions are validated and a silent downgrade on update is refused, and the installer writes its env file readable by its owner only
Plugins: Plugin POSTs stay off the plugin proxy, secrets, agenda, ical and translate routes, only a plugin known to the server can connect and use credentials, plugin-authored HTML drops remote images, and a plugin frame that navigated to another document gets no more host messages
Server: TLS responses carry HSTS and the X-Powered-By header is gone. Upstream mail server requests get a deadline, CalDAV discovery probes and concurrent favicon fetches are bounded, and calendar feeds, synced settings blobs and the settings route have size caps
Features
Settings: The settings are regrouped into Account, Security, Notifications, General and Appearance, the mail pages Message list, Reading, Composing, Folders & tags, Filters and Out of office, then Calendar, Contacts, Files and Add-ons with the plugin pages under it, and Backup & reset. Every page has a jump row to its sections, settings links can name a section, and old settings links keep working
Settings: An Advanced switch hides power-user settings until turned on. Search results and section links that point at a hidden setting turn it on
Settings: Themes show as one row with a Show all button, and the settings search box looks like the mail search box
UI: The message list can show as columns with one-line conversation rows (#262, thanks @fdisamuel)
Composer: Typing @ offers contacts and adds the picked one as a recipient. Mentions become chips with a contact card on hover, in the composer and in received mail
Contacts: The company directory can be browsed in contacts and the composer (#1253, thanks @diegonix)
Mail: "Remove from this folder" takes a message out of just the open folder when it is in several (#615, thanks @arnauda-gh)
Mail: n jumps to the next unread message (#514, thanks @muelli)
Mail: Shift+arrow keys extend the selection (#992, thanks @IntExCZ), and while selecting, a click anywhere on a row ticks it (#1014, thanks @mmomjian)
Mail: Search results from all folders show the folder (#1172, thanks @PoltoS)
Mail: Your own folders are listed in a separate section of the sidebar (#1205, thanks @roedy-dev)
Mail: The counter can be set per folder, e.g. keep the Drafts count with totals off (#982, thanks @mbjboon-netizen)
Mail: The account dot in the unified view can be hidden (#912, thanks @mmomjian)
Mail: Sender icons are refreshed when they changed on the sender's website (#960, thanks @IntExCZ)
Composer: Templates get numeric date, day, month and year placeholders (#1284, thanks @Yahatix)
Accounts: When the admin turns on "Account List Backup: Passwords", saving the account list offers to include the passwords of accounts signed in with a plain password, encrypted in the browser. Restoring signs those accounts in in the background (#1247, thanks @lucamzanon)
Admin: The theme policy can set and lock the colour mode (#1280, thanks @chodid)
Admin: A configured logout URL ends the provider session for providers whose discovery has no end_session_endpoint (#1279, thanks @chodid)
Admin: The admin panel asks before leaving with unsaved changes (#1255, thanks @passibe15)
Admin: The version is hidden from the connector probe when the login page hides it (#896, thanks @x86dev)
Marketplace: Any version of an extension can be installed. The detail page lists every version, previews the picked one and warns about withdrawn versions, advisories, deprecations and suspensions, the listing can be sorted and filtered to installed extensions with an updates strip, and an install link can name the version to offer
Marketplace: Replaced plugin and theme versions are kept and can be rolled back to
Plugins: The UI kit gets a Combobox (#1251, thanks @tobiasge)
Translations: Estonian is a new locale, including the company directory and the strings added since (#1254, thanks @raudraido)
Demo: The demo follows one persona with a work account, a personal account and a shared Support mailbox, with real headers, an invitation, mentions, tags, templates and files
Changes
Marketplace: The marketplace talks to the extension directory's v2 API only. A self-hosted directory older than 2026-10-14 no longer works with it
Plugins: A user credential now exists only for a registry plugin or an admin-approved upload whose manifest declares it. Approvals made before this version need a fresh approval request before the plugin can use credentials
UI: The whole app uses the theme's sans font (#1278, thanks @chodid)
UI: The app switcher uses simpler calendar, contacts and files icons, and the calendar, contacts, files and settings sidebar headers have the mail header's height
Performance: Starting a search no longer re-renders every row
Fixes
Mail: Push notifications can be enabled for an account with access to a shared folder (#1050, thanks @magnetic6)
Mail: The list shows the mail's own date and keeps it on .eml import (#891, thanks @johnnyq)
Mail: PGP and S/MIME messages inside conversations are decrypted (#902, thanks @rajil)
Mail: Attachments preview in the installed app instead of opening a blank window (#865, thanks @navidrast)
Mail: Message previews drop plain-text emphasis markers (#1260, thanks @mmomjian)
Mail: Today's and yesterday's mail are told apart by the time zone setting in the list and the sender line (#1259, #1262, thanks @mmomjian and @balabommablock-cpu)
Mail: The category tab filter is kept when the mailbox refreshes, and the whole folder comes back after a restart when a category tab was open (#1264, #1265, thanks @alyyousuf7)
Mail: Shared folders from other servers are kept when they reuse an account id, and a shared folder reachable through two logins is listed once in cross views (#1108, thanks @hildebrandttk)
Mail: Renaming a tag follows it into the filter rules that name it, and keeps vacation forwarding and plugin vetoes while doing so (#854, thanks @dev-hive-kazniisa)
Mail: Bulk archive across accounts is routed by the owning account, and Archive is only created where the account allows it (#1178, thanks @VasilisNtovolos)
Mail: Conversation blobs are fetched from the message they belong to, and file previews stay open in development Strict Mode (#1287, #1288, thanks @VasilisNtovolos)
Mail: A shared conversation is marked read on the owner account, and the mark-as-read delay is followed when expanding a conversation or opening a Pro folder row (#1272, thanks @Peterka35)
Mail: The reader's Move, Tag and Rules flyouts open on the side with room (#1261, thanks @beja19)
Mail: Vacation filter rules are skipped on shared accounts without Sieve (#1263, thanks @somus)
Mail: Nextcloud filter markers inside rule text are ignored
Composer: A reply to a message from another connected account is sent from that account to the right recipient (#703, #1270, thanks @jesperordrup and @vixh)
Composer: Replies whose From is picked after the composer opens are signed (#842, thanks @mmomjian)
Composer: A contact group whose member is not an address is no longer sent (#795, thanks @brambuijs)
Composer: Your own address stays out of reply-all before your identities have loaded (#803, thanks @lucletoffe)
Composer: Sent mail keeps blank lines instead of collapsing them (#1015, thanks @mbjboon-netizen)
Composer: Inline images in replies and forwards are attached once (#1125, thanks @guisea)
Composer: The quote containment styles stay in the editor and out of the sent mail, and a quoted original can no longer paint over the composer
Composer: The composer opens when the mail client can't report directory support
Composer: A click on a mention chip opens the contact card instead of the mailto handler in Firefox
Calendar: Zero-length events end at their start instead of midnight (#837, thanks @Flying-Bas)
Calendar: Invitation times show in your time zone (#1252, thanks @TomekCodeWave)
Calendar: Answering an invite sent to a non-primary identity works (#1283, thanks @taranasus)
Calendar: The visible range is refetched after creating a recurring event (#1268, thanks @sanitz)
Calendar: Month view day columns align with the header (#1286, thanks @tobiasge)
Tasks: An all-day task's due and start are sent as a LocalDateTime (#1256, thanks @sanitz)
Notifications: Push notifications stay silent when the notification sound is off (#1289, thanks @chreds)
Admin: The admin panel loads when the config is read-only, policy defaults are applied to user settings, and OAuth auto-setup is refused before touching Stalwart when the config is read-only (#1248, #1249, #1250, thanks @chodid)
Accounts: Restored sign-ins are remembered only when the restoring account is remembered, and contact and calendar data that arrives after switching accounts is dropped instead of landing in the other account
Plugins: api.email.get reads a listed message of a shared account and no longer reads mail of other connected logins (#1273, #1274, thanks @alyyousuf7)
Plugins: A plugin slot's callbacks keep working when its props change while it loads (#1266, thanks @dedoitalia)
Plugins: Plugin dropdown messages are checked before the host draws them
Lite: Demo portraits load from the mount prefix so a bundle under a subpath stays self-contained, and the dev server stays inside its export directory
Translations: German strings that still showed in English (#1285, thanks @dealerweb), contact field types and more French strings
If you like Part-DB, consider donating to support the development. Press the sponsor button on the main github page, for more info.
Note
If you are using Part-DB it would be helpful if you fill out this short survey on your usage of Part-DB (Google Forms): https://forms.gle/Q15twx3YYq3qCNfe8
Part-DB 2.20.2
New features / Improvements
Added form to directly create parts from info providers using a known ID (#1605)
Allow to paste files from clipboard into the URL field of attachments to upload them
Allow to create new attachments from an image in the clipboard
Added an "Export as CSV (formula escaped)" mode to avoid formula injection when importing CSVs into excels
1.15.0 opens the plugin system up: plugins can add UI in most places of the app, hear and stop most actions, and use accounts and API keys through the server without seeing them, and users can install their own plugins once an admin has reviewed the code. Opening folders and messages is faster, with far fewer re-renders and requests. Calendars get default reminders, notifications can be muted per folder or account, and every sign-in is now remembered unless the admin shows the Remember me box.
Notifications: Folders and whole accounts can be muted from the folder context menu. A muted folder or account sends no push notifications and shows a muted mark in the sidebar (#1169, thanks @xnilsit)
Calendar: Each calendar has default reminders, set in calendar management. New events start on them, an event that switches back to the defaults picks up the current ones, and the event popover lists every reminder (#1209, thanks @rich0)
Calendar: Each reminder can be a notification or an email (#1209, thanks @rich0)
Accounts: Shared mail accounts can be hidden from the sidebar, from their context menu or under Settings > Layout (#1228, thanks @chodid)
Mail: The prompt before deleting several messages can be turned off (#1225, thanks @mmomjian)
UI: In Mountain View, several messages of a conversation can be open at once, the compose window stays open while reading other mail, and the selection is kept while reading a message (#1222, #1229, #1231, thanks @mmomjian)
UI: Ctrl+K opens a command palette, and a notifications panel collects plugin notifications and app errors
Admin: "Custom From Address" under Admin > Policy turns off the free-text sender address in the composer, so users can only send as their identities
Admin: Without a configured SESSION_SECRET, one is generated on first start and kept in data/admin-state. Keep that folder on a persistent volume
Plugins: Users can install their own plugins from Settings > Plugins when the admin allows uploads. The server reads the manifest and code itself, the admin reviews the actual code in the Plugins tab before approving, and the approval is checked again on every start. Settings lists in plain words what each plugin may do
Plugins: Plugins can add UI to the message list, reader, composer, sidebar, top bar, calendar, contacts, tasks, files and settings, and pages of their own with a navigation entry. Every area has its own permission
Plugins: Plugins are told about sign-in, navigation, mail, folder, calendar, contact, task, file, template, identity, filter, preference and theme changes, and can stop most of them
Plugins: Plugins can read messages and folders, move and archive messages, open a filled-in composer or a reply, edit the message being written, save drafts, read and change events and tasks, and manage templates, signatures and the out-of-office reply
Plugins: Users connect accounts for plugins in a dialog the plugin can't read, and plugins use those accounts and admin-set API keys through the server without seeing them
Plugins: The UI kit gives plugins the app's own controls and dialogs, plus side panels, detail rows, colour dots, labelled check boxes and a change preview
Plugins: Marketplace installs check the extension directory's signature
Changes
Login: The Remember me box is hidden by default and every sign-in is remembered. Set LOGIN_SHOW_REMEMBER_ME=true to show the box again
Performance: Opening a message, switching folders and searching render much less. Message rows, the folder sidebar and the reading pane only redraw what changed, a visited folder reopens without reloading, and a message starts loading when the mouse is pressed on it
Performance: Login loads the mailboxes and first page once instead of twice, the mail view's code loads while the login form is shown, and large HTML messages open with one request instead of two
Performance: Search results show before their highlighted excerpts arrive, and the list stays on screen while a search runs
Fixes
Send: Attachments stay sendable after the server's upload time limit runs out (#1243, thanks @lemourin)
Send: Uploads over 10 MB that pass through the server, such as office documents saved from the editor, are no longer cut off
Login: The sign-in response stays small enough for proxies when OIDC tokens are large, so logins on a subdomain no longer fail with a 502 (#1237, thanks @kadogams)
Login: Lite reloads into the login page instead of a missing route
Mail: The storage quota counts against the soft limit when the server sets one (#1242, thanks @somus)
Mail: The All mail and All unread views leave out a server's own "all" mailbox (#1241, thanks @somus)
Mail: Contacts, filters, calendars and files are only offered for shared accounts that support them (#1239, thanks @somus)
Mail: User folders named like system folders, such as "Spam reports", get the plain folder icon (#1235, thanks @dlrudie)
Mail: ISO timestamps are no longer offered as verification codes (#1236, thanks @mmomjian)
Mail: Shift-click selects the rows shown between the two ends instead of messages in other conversations from that time span (#1230, thanks @mmomjian)
Mail: The message list no longer reorders or repaints when switching accounts, and the loading skeleton no longer flickers after a reload or account switch
Mail: In Mountain View, a message opens together with its conversation, and threads open as a conversation on the phone (#1223, #1224, thanks @mmomjian)
Identities: A new identity is created without blank signatures (#1240, thanks @somus)
Composer: A cell range pasted from Excel becomes a table instead of an image (#1233, thanks @soringabrielalbu)
Composer: Text typed under the signature stays when the signature is swapped or removed, and picking a From address without a signature removes the old one
Composer: Dropped files no longer insert their path into the message body
Composer: The top and bottom bar buttons are easier to hit on a phone
Calendar: Invitations and replies carry the sender's Message-ID
Contacts: The contact name stays readable when the detail pane is narrow
UI: The iOS app gets its full screen height back after resuming (#1226, thanks @mmomjian)
UI: An attachment's download and menu buttons show when the keyboard reaches them
Plugins: A message is never sent when a plugin that checks it before sending fails or does not answer, and plugins can no longer block or stall sign-out
Plugins: Privileged plugins need a signed bundle, plugin network access is limited to the origins in the manifest, plugin bundles are only served to signed-in users, and slot plugins only get messages, events or contacts with the matching read permission
Plugins: Plugin and theme packages are checked the same way on every install path, marketplace bundles whose id differs from the directory entry are refused, and Theme API v2 themes install from the admin page and the marketplace
Plugins: A deleted or disabled theme is no longer forced, an extension keeps its admin state on re-upload, and a plugin's stored data is cleared when the admin removes it
Plugins: Plugins start once on every page, get their default settings, follow setting and language changes without a reload, and lay out right-to-left in Arabic, Hebrew and Persian
Plugins: Actions a plugin stopped are no longer reported as done
Plugins: Plugin buttons and panels fold away in narrow composers, toolbars and phone layouts instead of overlapping, and plugin frames keep the app's theme in dark mode
Translations: The new plugin, calendar reminder and notification strings are translated, and "composer" and the certificate subject are no longer translated as a music composer and an email subject
This release fixes backup handling across older Docker daemons and S3, improves health and scheduler reliability, and reduces live-stats rendering costs.
Backups and storage
Bind-mount volume subpaths when backing up on daemons older than API 1.45. (#4399) @kmendell
Send S3 request checksums only when required, improving GCS compatibility. (#4401) @kmendell
Write S3-only system backups directly to S3 without a local repository. (#4400) @kmendell
Include the absolute path and UID in project-directory permission errors. (#4404) @kmendell
Containers, projects, and scheduling
Report Francis as down when its host exits and extend its health-check deadline. (#4402) @kmendell
Exclude Swarm task containers from the standalone-container filter. (#4405) @kmendell
Preserve build image references when Compose fails to load, and document the update-check label. (#4406) @kmendell
Reset invalid cron settings to defaults at startup. (#4425) @kmendell
Clear caches when refreshing a workspace. (#4427) @kmendell
Allow manual updates for services with the updater disabled. (#4430) @kmendell
Registries, updates, and access
Retry digest lookups after TLS handshake timeouts. (#4428) @kmendell
Remove the stale digest name left behind when a frozen pull is tagged. (#4409) @kmendell
Stop resending image-update push notifications on every poll. (cd7c39cfcb6c364751d4b55bab887c11b5ebd859) @kmendell
Restrict SSH host-key algorithms to entries in known_hosts. (#4403) @kmendell
Match user email lookups without regard to case. (#4429) @kmendell
Interface and performance
Fix virtualized table cells being clipped by locking column widths in pixels. (#4407) @kmendell
Localize settings backup cards and role presets, and prevent long labels from overflowing. (#4408) @kmendell
Batch live stats by environment to reduce table rendering costs. (3330f4e0f53bb152cc4720be8ae724cdb1bd8cbb) @kmendell
Maintenance
Merge all-environment resource lists on the server. (#4419) @kmendell
Simplify registry helpers with composite literals and inline helpers. (00daf4441a6724cc9ff991f2927d73dcd61f4b89) @kmendell
This release adds OpenTelemetry support, a redesigned multiplexed edge tunnel, and useful CLI previews and self-update tooling. It also improves container and project workflows while fixing issues across authorization, databases, and connectivity.
Interface and container workflows
Prevent duplicate role assignments from causing a 500 in the user editor. (#4332; @DominikZublasing)