# Changelog ## 1.7.7 (2026-07-09) ### Features - **Plugins**: `ui.rerenderEmail` API and restyled read-receipt banner - **Plugins**: New hooks — `onBeforeBlobUpload`, `onBeforeDraftAutoSave`, `onBeforeEditDraft` (#586) - **Plugins**: `ui.prompt` dialog and first-class settings-section tabs - **Calendar**: Jalali (Persian/Shamsi) calendar support with Saturday as week start (#490) - **i18n**: Hebrew locale with full RTL support - **i18n**: Slovak translation - **i18n**: User-selectable regional date format - **Contacts**: Enable trusted-senders address book sync by default when contacts are available - **Mail**: Pin emails to the top of the folder list - **Mail**: Setting to disable the tag-color row tint in the message list - **Mail**: Click the sender avatar to select a message/thread (Thunderbird-style) - **Accounts**: Pin the default account on top and drag-to-reorder the account switcher - **Composer**: Recipient autocomplete from Sent, with on-demand server search - **Composer**: Preselect the identity of the active mailbox for new messages - **Email**: Send a quick reply with Ctrl/Cmd+Enter - **Headers**: Parse Stalwart spam headers - **Login**: Configurable logo size and hideable heading/subtitle - **PWA**: Apple Touch icons for the iOS home screen ### Fixes - **Mail**: Hide Files when the account lacks the filenode capability (#563) - **Mail**: Keep advanced search filters applied when switching folders (#553) - **Mail**: Keep the email list scrollable when the bottom reading pane is enabled with no conversation selected - **Mail**: Route keyword writes to the email's own account in unified view - **Mail**: Render emails that set `height:100%` on a wrapper element - **Mail**: Hide images that fail to load - **Mail**: Storage quota not shown with Stalwart (#577) - **Spam**: Hide the spam action in Sent, Drafts and Scheduled - **Spam**: Fix stale folder counters and open message after spam actions - **Composer**: Wait for in-flight attachment uploads before sending - **Composer**: Only commit a recipient on Space when the input is a valid email (#571) - **Composer**: Attachment reminder now ignores quoted text on reply/forward (#570) - **Calendar**: Store the event organizer as owner-only to prevent duplicate ORGANIZER/ATTENDEE - **Calendar**: Strike through cancelled events and mute their reminders (#572) - **Calendar**: Use `calendarAddress`/`organizerCalendarAddress` for scheduling, drop retired `sendTo`/`replyTo` (#500) - **Auth**: Keep the session when the auth server is briefly unreachable - **Shortcuts**: Make keyboard shortcuts layout-agnostic and map by physical position - **Shortcuts**: Don't toggle mailbox subfolders on Arrow keys while typing - **Contacts**: Clear the photo on the server by sending `media: null` when removed - **Plugins**: Preserve the settings slot and privileged tier - **Pro**: Prompt to save or discard a draft when closing a compose tab via the tab-bar X - **Pro**: Show the Edit button on draft emails opened in a new tab - **List**: Shift-click on the checkbox extends the selection (range) - **CSP**: Allow external/data fonts so email webfonts render - **Notifications**: Brand push notifications with the configured PWA icon - **Notifications**: Notification sound preview — base-path prefix and longer default beep - **Unsubscribe**: Send `mailto:` unsubscribe ourselves instead of via the OS handler - **Branding**: Apply per-domain favicon override in root metadata (#585) - **Settings**: Load the trusted-senders address book on the settings page so the count isn't 0 - **Setup**: Clone source when `setup.sh` runs detached from a checkout (#518) - **Server**: Use a callable `.get` to detect `Headers` in `pickRequestHost` ## 1.7.6 (2026-06-28) ### Breaking Changes - **S/MIME**: The built-in S/MIME implementation has been removed from core and re-delivered through the new generic crypto plugin hooks (privileged same-origin plugin tier). S/MIME signing, encryption, decryption, certificate management, and the related settings UI now live in a plugin rather than the main app. Deployments that relied on built-in S/MIME must install the S/MIME crypto plugin to retain those features. ### Features - **Plugins**: Privileged same-origin plugin tier with a crypto API surface - **Plugins**: Plugin hooks for email details, headers, and source - **Mail**: Option to hide the total message count on folders (#498) ### Fixes - **Mail**: Hide the server scheduled folder when the virtual one is shown (#495) - **Mail**: Stop the unified mailbox from mutating client-returned email objects - **Composer**: HTML-escape sender and subject in the reply/forward quote header (#482) - **Calendar**: Send calendar invites by setting `organizerCalendarAddress` - **Identity**: Sync the default identity (`preferredPrimaryId`) to server settings (#507) - **Auth**: Support MFA login via the structured auth endpoint - **Admin**: Show all built-in themes in the admin theme controls (#496) - **i18n**: Add missing translation keys across 19 locales ## 1.7.5 (2026-06-24) ### Features - **Mail**: Cross-account "All accounts" views with full group/shared-account support - **Mail**: Per-account "All Mail" folder selection - **Mail**: "Download all" button to bundle attachments into a zip (#466) - **Mail**: Return to the list after deleting or marking the open message unread — configurable (default on) - **Mail**: Collapse-all-threads action in thread-list selection - **Calendar**: Option to disable the calendar - **Composer**: Send-now button on scheduled/delayed messages - **Composer**: Email a contact or group via the in-app composer - **Composer**: Split a pasted address list into recipient chips - **Contacts**: "New address book" creation UI (#415) - **OAuth**: `OAUTH_AUTHORIZE_URL` to override the authorize endpoint - **i18n**: Farsi (fa) locale — complete (2654 strings) - **i18n**: Romanian (ro) locale ### Fixes - **Composer**: Keep HTML signature styling in the editor and on send - **Composer**: Guard Send against double-submit - **Composer**: Strip display names from the `EmailSubmission` envelope addresses - **Calendar**: Disable iMIP scheduling on calendar import (#411) - **Mail**: Localize special-folder names by JMAP role (#404) - **Mail**: Block remaining email tracking vectors (#457) - **Mail**: Route counter and unread updates to the email's own account in aggregate views - **Mail**: Fix blank space in plain-text emails - **Mail**: Fix toolbar re-render when opening emails - **Mail**: Truncate long subjects so they don't overlap the timestamp - **Mail**: Strip reply/forward prefixes followed by a full-width colon - **Mail**: Add breathing room between the unread dot and the avatar - **Mail**: Isolate per-account state snapshots from leakage and mutation - **Mail**: Cap filename tokens at the full 200-char limit - **Spam**: Fetch mailboxes with `accountId` in `markAsSpam` - **Filters**: Load mailboxes when opened directly (#485) - **Settings**: Surface server errors on password change and TOTP toggle - **Send now**: Gate the toolbar label and translate `send_now` across locales - **Directory**: Fix fetching display names - **Push**: Reap only relay-confirmed-dead leftover subscriptions - **i18n**: Add the missing fa locale to the client `IntlProvider` messages map - **i18n**: Add missing translation keys across 19 locales ## 1.7.4 (2026-06-15) ### Features - **Mail**: New "All Mail" view across folders and accounts - **Mail**: Edit contact directly from the email viewer contact sidebar - **Calendar**: Recurrence editor, set-default calendar, and timezone-aware calendar queries - **Calendar**: Agenda plugin sidecar - **Composer**: Email display name support - **Composer**: Drag-and-drop recipient chips between To/CC/BCC fields, with the address shown in the drag preview - **Composer**: Avatars in recipient autocomplete suggestions, including directory users - **Files**: JMAP file/folder sharing in the Files app (#408) - **Auth**: QR-code SSO login and device pairing between webmail and the mobile app - **Auth**: Require re-authentication for device pairing and SSO - **Accounts**: Manage shared/group account settings from the Accounts page - **Setup**: Opt-in telemetry in the web setup wizard - **Mail**: Persist the email detail sidebar state ### Fixes - **Mail**: Preserve line breaks in the generated `text/plain` alternative (#421) - **Mail**: Fix inconsistent threading of email messages in the inbox and folders - **Mail**: Stop draft emails from being marked as unread - **Mail**: Prevent wide email tables from rendering with rotated headers (#409) - **Mail**: Preserve the folder list when a mailbox refetch hits the concurrent-request limit - **Mail**: Correct dark-mode background-image inversion and height clipping in the email viewer - **Calendar**: Dedupe scheduling emails and use Stalwart-compatible calendar filters - **Calendar**: Redesign the custom recurrence editor to match the modal UI - **Files**: Don't send the connected-account key as the JMAP `accountId` when sharing files (#408) - **Routing**: Strip the build-time `basePath` from `router.push` redirects after login (#390) - **Nav**: Open recent contact emails at `/` instead of 404ing on `/mail` - **Nav**: Hide the Add App button when `sidebarAppsEnabled` is false - **Settings**: Move the "Plain Text Only" setting from Reading to Composing (#422) - **Privacy**: Make telemetry opt-in - **UI**: Fix the context menu being invisible on first right-click after page load - **Admin**: Remove the JMAP status from the admin dashboard - **i18n**: Add missing translation keys across 17 locales ## 1.7.3 (2026-06-04) ### Features - **Mail**: Inline attachment preview — reliable MIME detection with inline PDF on desktop and mobile - **Mail**: Preview composer attachments inline (click to open) - **Mail**: Preview `.eml` (`message/rfc822`) attachments like an email - **Mail**: Read receipts (MDN, RFC 8098) - **Mail**: Editable, layout-preserving quote island when replying - **Mail**: Surface the most severe SPF result and hide the "via" badge on spoofed mail - **Calendar**: Per-viewer colors for shared calendars (#345) - **Filters**: Extended filter rules — attachment field and multi-value conditions - **Settings**: New built-in themes — Aurora Glass and Elastic - **Settings**: Theme cards render as a mini mailbox mockup from theme colors, with light/dark variant chips - **Plugins**: Localizable sandboxed plugins (manifest locales + `api.i18n.t`) - **Plugins**: `/api/translate` proxy and email body exposed to plugins - **Admin**: Toggle for search-engine indexing (robots) - **Admin**: `passwordHashFile` in `admin.json` - **Admin**: `sessionSecretFile` and `oauthClientSecretFile` for file-based secrets in JSON config - **PWA**: Configurable install screenshots (per-domain) - **i18n**: Hungarian locale support ### Fixes - **Files**: Store Files as real `FileNode` hierarchy, migrate legacy flat-named files on load, and list folders via `FileNode/get` so they are visible (#379) - **Files**: Treat a blob-less `FileNode` as the only folder signal and migrate legacy dir-markers - **Mail**: Empty Trash for shared and group folders (#387) - **Mail**: Move mail from a shared group inbox to a personal inbox (#375) - **Mail**: Preserve the HTML signature when sending a quick reply - **Mail**: Stop body clipping under the fold when the email sets `html`/`body` `height: 100%` - **Mail**: Drop single-letter `R:`/`I:` subject prefix tokens and deduplicate localized reply/forward prefixes - **Mail**: No more 404 console spam for missing sender favicons - **Auth**: Discover OIDC metadata server-side to avoid CORS failures (#382) - **Send**: Route the Sent copy to the shared-mailbox account on per-identity send - **Routing**: Honour `basePath` in the plugin sandbox, `http.post` proxy, and branding - **i18n**: Localize the PWA install prompt, reply/forward quote header (incl. sender address), ``, and per-locale `` description; add missing `settings.folders.role_memos` key - **Themes**: Plugin slot iframes inherit host font and color tokens - **Theme**: Gate preview "open in new tab" on inline-safe MIME types - **Appearance**: Move Themes settings into the Appearance category with a distinct tab icon; clicking the active theme is a no-op - **UI**: Fix invisible dark-mode borders (border token collided with secondary) - **UI**: Remove the 16px empty strip beside the collapsed sidebar - **UI**: Align top bars to a uniform `h-14` height and the account selector header to the search/reply toolbars - **UI**: Close pane gaps by centering the resize handle on the seam - **Settings**: Fix section gears permanently hijacking the active tab ## 1.7.2 (2026-05-28) ### Features - **Mail**: Scheduled send and send delay (#322) - **Mail**: Drag emails out to the file explorer as `.eml` - **Mail**: Import emails from `.zip` archives - **Mail**: "Move to Trash and mark as read" delete action (#323) - **Mail**: Include group inboxes in the unified mailbox view (#328) - **Mail**: Locale-aware date format in the email list with a preset picker (#331) - **Mail**: Allow drag-and-drop into shared mailboxes - **Composer**: Ctrl/Cmd+Enter sends the open draft - **Settings**: New Downloads tab with template editor for `.eml` and attachment filenames - **Settings**: Filename transform settings and an ASCII-only "date (from-to) subject" template - **Settings**: Post-export action (keep / archive / trash) - **Settings**: Template for multi-email `.zip` filenames - **Admin**: Per-domain branding editor with overrides on `/api/config`, manifest, and PWA icon (#332) - **Admin**: Policy-controlled push relay URL with optional user lock - **i18n**: `NEXT_PUBLIC_DEFAULT_LOCALE` for fallback UI locale (#243) ### Fixes - **Mail**: Editable HTML signature in new mail; clean state on every compose entry (#329) - **Mail**: Report real upload progress with XHR progress events (#333) - **Mail**: Restore `blob:` in `object-src` and `frame-src` CSP for PDF/HTML previews - **Mail**: Match user-avatar treatment on quick reply - **Email viewer**: Stop shattering table cells with `word-break: break-word` - **Composer**: Scope Ctrl/Cmd+Enter send to the focused composer - **Composer**: Stop closing the form when editing any field - **Pro**: Keep the empty viewer pane visible in the split layout - **Pro**: Prevent an empty main pane when reordering tabs across panes - **Mobile**: Collapse focus mail layout to multi-line - **Mobile**: Keep a gutter on bare-HTML and plain-text emails - **Calendar**: Align continued multi-week events with the week's left edge - **Calendar**: Show the end date in the event popover for multi-day events (#318) - **Calendar**: Convert `recurrenceRules` to singular in batch create - **Calendar**: Handle malformed event dates (#316) - **Files**: Stop URL-encoding drag-out filenames and preserve Unicode letters - **Routing**: Prefix remaining ``, favicon, and WebDAV URLs with `basePath` (#319) - **Routing**: Prefix hand-written URLs with `basePath` for subpath deployments - **Auth**: `OAUTH_ALLOW_PRIVATE_ENDPOINTS` for split-DNS setups ### i18n - Add missing translation keys across 16 locales ## 1.7.1 (2026-05-22) ### Features - **Admin**: Expose PWA branding fields in the admin Branding tab - **Pro**: Hide empty-state placeholder and collapse the viewer pane in Pro mode so the mail list fills the space ### Fixes - **Mail**: Preserve inline images when replying (#163) - **Filters**: Use the canonical `INBOX` mailbox in Sieve filter paths (#313) - **Mail**: Resolve destination account id to the local namespace on cross-account mailbox drop ## 1.7.0 (2026-05-21) > **New: Pro mode (experimental).** Opt-in tabbed multi-pane interface for power users. Open multiple mail, calendar, contacts, and file views side-by-side, drag tabs to reorder or split panes at the edges, and work across all logged-in accounts in one shell - cross-account email moves, a unified inbox with search, account-split calendar/contacts/files sidebars, and a per-account "From" dropdown in the composer. Enable from Settings → Appearance; the `proInterface` preference is per-device and not synced. ### Breaking Changes - **Plugins**: Plugins now run inside a null-origin iframe sandbox and talk to the host over a postMessage RPC bridge. The in-process plugin runtime is gone; the bundled in-tree plugins have been migrated. Third-party plugins built against the old in-process API need to be ported to the sandboxed runtime. - **Plugins**: Server-managed bundles must be Ed25519-signed by the host and approved by an admin before they load. The host public key is served from `/api/plugin-signing-pubkey` and each bundle response carries the signature in the `X-Bundle-Signature` header. User-uploaded bundles still load unsigned, but managed marketplace and dev-folder bundles do not. - **Plugins**: `bundleHash` is now a full SHA-256 over the bundle. Legacy short hashes are migrated on first load; any out-of-band tooling that pinned the old hash format needs to be updated. ### Features - **Pro**: Tabbed shell with drag-to-reorder, drag-to-edge to split, side-by-side panes, and pane-aware responsive layout with a scoped sidebar overlay - **Pro**: Auto-redirect to the Pro shell when Pro mode is on; `proInterface` is kept per-device instead of syncing - **Pro**: Multi-account mail sidebar with client routing and a per-account mailbox cache - **Pro**: Unified mailbox always visible, with full-text search - **Pro**: Cross-account email moves - **Pro**: Multi-account calendar sidebar split into owned vs shared per account - **Pro**: Multi-account contacts and a cross-account file picker - **Pro**: Composer From dropdown grouped by account - **Plugins**: Per-plugin admin approval workflow with Ed25519 bundle signing verified on load - **Plugins**: Marketplace update flow for installed plugins and themes - **Setup**: Allow the setup wizard over plain HTTP with a dismissable warning gate - **Setup**: Warn when the JMAP URL points at a local-only host - **Account**: List and reorder logged-in accounts from settings (#282) - **Mail**: Mobile handoff page with JMAP authentication verification for cross-device OAuth - **Mail**: Pluggable reply/forward quote header (#295) - **Calendar**: Support multiple flexible event reminders (#170) - **Admin**: Expose PWA, app identity, and extension directory keys in the JSON config (#312) - **Admin**: Surface OAuth scope settings and wire up orphaned admin policy gates ### Security - **Plugins**: Pin parent origin in the iframe bridge to block cross-frame postMessage - **Plugins**: Ignore plugin-supplied `target` in `ui.openExternalUrl` to block host-frame hijack - **Plugins**: Validate plugin/theme id in marketplace install to block path traversal - **Plugins**: Prevent plugin config from leaking to non-admin users - **Admin**: Gate admin routes against cross-origin CSRF - **Auth**: Bind Stalwart auth context to the credential, not the cookie-claimed username - **Auth**: Validate OAuth discovery endpoints against SSRF - **Mail**: Tighten HTML sanitization at plain-text email, signature, and i18n render sites - **Mail**: Block script-bearing MIME types from inline attachment preview - **Mail**: Escape print-window fields and re-sanitize body to block XSS - **S/MIME**: Stop persisting passphrases in `sessionStorage` - **API**: Correct regex for valid API POST path validation ### Fixes - **Mail**: Serialize draft autosave with send to stop replies stalling in Drafts (#303) - **Mail**: Omit empty cc/bcc from `Email/set` so the server does not emit a bare `Cc:` header (#301) - **Mobile**: Allow adding contacts from the mail recipient popover (#306) - **Mobile**: Prevent dual-scroll and use full width for mail content - **Mobile**: OAuth handoff flow - **Calendar**: Scope iCal subscriptions per JMAP account; fix refresh and clear - **Calendar**: iCal subscription refresh, rollback, and URL normalization - **Calendar**: Show avatars in the calendar/address book sharing menu - **Contacts**: Normalize malformed contact photo data URIs (#307) - **Identity**: Clear identity signature fields when emptied - **Identity**: Show size cap on identity signature fields - **Identity**: Allow table-based layouts in the HTML signature sanitizer - **Plugins**: Load `globals.css` and Geist font in the plugin sandbox iframe - **Plugins**: Sync plugin slot iframe height with reported content height - **Plugins**: Use plugin slot offer snapshots for `useSyncExternalStore` - **Plugins**: Trust the directory version on marketplace install and update - **Filters**: Prevent duplication of Bulwark rules with literal braces in values - **Setup**: Defer setup wizard HTTP detection to avoid hydration mismatch - **Routing**: Anchor unmatched URLs into `main` so 404 renders - **Routing**: Respect server-resolved locale on first visit (#309) - **Routing**: Split app into `(main)`/`(sandbox)` route groups so the plugin iframe hydrates properly - **Files**: Stop parent directory navigation from jumping to root - **Build**: Stop pulling `node:dns` into the client bundle via OAuth discovery - **UI**: Toggle recipient popover when clicking the name again - **UI**: Remove white halo around photo avatars ### i18n - Add missing translation keys across 16 locales ## 1.6.7 (2026-05-17) ### Features - **Contacts**: vCard 4.0 parsing and generation support - **Admin**: Master-user impersonation route with `app-top-banner` plugin slot rendered on every authenticated page - **Admin**: Allow admin password overwrite during setup recovery - **Setup**: HTTPS requirement warning in the setup wizard - **Mobile**: Show details toggle and expandable panel for sender info ### Performance - **Calendar**: Speed up calendar invitation banner load ### Security - **Mail**: Sandbox thread email HTML in `srcDoc` iframe with a CSP `` tag - **Admin**: Redact sensitive config secrets from the admin API response - **Admin**: Make impersonation cookies session-only ### Fixes - **Auth**: Read `OAUTH_SCOPES` at runtime instead of build time - **Auth**: Use a relative `Location` header in redirects - **Auth**: Adopt orphan session cookie on first SPA load - **Mail**: Per-account push subscriptions so multi-account notifications work (#298) - **Mail**: Close attachment preview when clicking outside the content area - **Mail**: Pin quick reply to the bottom for short emails - **Mail**: Show "no body content" instead of an infinite skeleton for bodyless emails - **Mail**: Show contact popup when clicking the sender name in the email header - **Mail**: Prevent long addresses from overflowing email details columns (#297) - **Mobile**: Align quick reply with the mobile bottom toolbar - **Mobile**: Respect safe-area insets on mobile bottom bars - **Mobile**: Pad `safe-area-inset-top` - **UI**: Apply dark background to the email content wrapper in dark mode - **UI**: Improve dark mode background colors in the email viewer - **UI**: Add viewport export with `initialScale: 1` - **UI**: Strip the Stalwart master-user `%` suffix from the displayed account - **Plugins**: Warn and block install when the app version is below the plugin's `minAppVersion` - **Plugins**: Register `app-top-banner` in plugin-store `SLOT_NAMES` - **Plugins**: Carry `configSchema` + `settingsSchema` through marketplace install - **Build**: Add `outputFileTracingExcludes` to reduce Turbopack memory tracing ### i18n - Add missing translation keys across 16 locales ## 1.6.6 (2026-05-15) ### Features - **Mail**: Sync onboarding completion state across devices so the welcome flow only runs once per account (#285) - **Mail**: Distinct icons for Shared, Important, Memos, Scheduled, and Snoozed folders (#288) - **Compose**: Raise HTML identity signature length cap to 50,000 characters - **Compose**: Allow `` tags in HTML identity signatures for inline logos and banners ### Fixes - **Files**: Hide Files settings entry and sidebar nav when the `filesEnabled` policy is off (#291) - **Admin**: Honor the `cookieSameSite` admin config override instead of always defaulting (#284) - **UI**: Standardize punctuation in tooltips and inline comments across locales ### i18n - Add Danish localization - Clean up Danish locale wiring and sort the language picker alphabetically (#286) ## 1.6.5 (2026-05-13) ### Features - **Protocol**: Register as the system handler for `mailto:` and `webcal:` links from a new protocol handler settings page - **Protocol**: Account picker for protocol links when multiple accounts are connected - **Protocol**: Import-or-subscribe choice for detected webcal calendars - **Protocol**: Reuse the open PWA/session for `mailto:` links instead of always opening a new tab - **UI**: Route account avatars through the shared `Avatar` component for consistent fallbacks (#278) ### Fixes - **Calendar**: Support HTTP basic auth in iCal subscription URLs (#275) - **Admin**: Honor admin-uploaded favicon in root metadata (#274) - **Admin**: Honor `NEXT_PUBLIC_BASE_PATH` in admin sidebar nav links (#271) - **UI**: Broaden body font stack so Thai (and other non-Latin scripts) render correctly in subjects, sender names, and other chrome (#265) ## 1.6.4 (2026-05-11) ### Web Setup Wizard First-launch web setup wizard. New installs no longer need to hand-edit `.env.local` - point a browser at the container and the wizard probes the JMAP server(s), configures OAuth/OIDC, generates the session secret, accepts branding uploads, and provisions the initial admin password. Admin storage is now split into `ADMIN_CONFIG_DIR` (operator-authored, mountable read-only after setup) and `ADMIN_STATE_DIR` (runtime audit log and login timestamps); the legacy `ADMIN_DATA_DIR` keeps working for existing installs. ### Features - **Setup**: Web setup wizard with multi-step flow: Server, Auth, Security, Logging, Branding, Review, Admin - **Setup**: Admin config/state directory split with optional `ADMIN_CONFIG_READONLY` for immutable deployments (#226) - **Setup**: File uploads on the wizard branding step - **Setup**: Redesigned review step with grouped summary and an advanced toggle for the full config - **Setup**: Require explicit confirmation when JMAP probe finds no session - **Mail**: Drag attachments out of the viewer to the local file system (#267) - **Mail**: Reading Pane at Bottom mail layout (#262) - **Mail**: Configurable signature position - above or below quoted text (#266) - **Mail**: Signature position is now searchable from the email behavior settings - **Mail**: Show avatar in Focused list for compact density and above - **Mail**: Align Focused list preview with other layout previews - **Compose**: From-header override in the composer with catch-all auto-reply, replies to an alias on a domain you own pre-fill the alias as the sender even when it isn't a configured identity (#246) ### Performance - **Mail**: Prefetch initial email data on login - **Auth**: Parallelize login round-trips and drop redundant JMAP re-verify ### Fixes - **Auth**: Skip upstream JMAP reverify for trusted URLs (#237) - **Auth**: Show account identity in the switcher header instead of the sending alias - **Compose**: Fall back to the primary identity signature on reply - **Setup**: Drop redundant first-login banner about removing `ADMIN_PASSWORD` (#222) - **UI**: Consistent notice cards for server probe results ### i18n - Add missing translation keys across 15 locales ## 1.6.3 (2026-05-08) ### Features - **Mail**: Lift 5-account cap on HTTP/2 - **Mail**: Import `.eml` files via folder right-click menu ### Fixes - **Mail**: Trim leading whitespace from email list preview - **Mail**: Fall back when only the truncation indicator remains in email preview - **Mail**: Hide files/contacts nav items when JMAP server lacks support - **Viewer**: Preserve emoji colors in dark mode - **Viewer**: Prevent white-on-white in dark mode for nested `bgcolor` containers - **Viewer**: Render plain-text-only emails as text, not HTML - **Viewer**: Render HTML-only emails and redesign external content prompt - **Viewer**: Pad Word/Outlook HTML email rendering - **Compose**: Redesign quick reply to match sender/banner layout - **Compose**: Disable StarterKit's bundled link/underline to avoid duplicate extensions - **Sharing**: Request `shareWith` explicitly so calendar/address book shares survive a re-login (#257) - **UI**: Strip leading punctuation when computing avatar initials - **Mobile**: Hide email hover actions ### i18n - Add missing translation keys across 15 locales ## 1.6.2 (2026-05-06) ### Features - **Plugins**: Hot-reload and dev-folder loading for live plugin development - **Plugins**: On-demand `src/` bundling via esbuild - **Plugins**: New `http:fetch` permission and `httpOrigins` manifest field - **Plugins**: `onBeforeEmailSend` hook with `fromEmail` exposed on `OutgoingEmail` - **Plugins**: Project `EmailReadView` for the email-banner slot and expose auth results - **Plugins**: Ingest icon, banner, and screenshots from the source repo - **Plugins**: Restrict plugin and theme install/uninstall to the admin dashboard - **Mail**: Multi-server JMAP support - **Settings**: Fulltext search across the settings sidebar - **Settings**: Sub-result rows with highlight in settings search - **Settings**: Surface plugin settings as search sub-results - **Settings**: Remove experimental tags from themes, plugins, and sender favicons - **Viewer**: Redesigned external-mail banner above attachments - **Calendar**: Calendar invitation banner expands on row click - **Calendar**: Calendar invitation banner is now collapsible ### Fixes - **Admin**: Collapse admin panel into a single tabbed page - **Plugins**: Inline plugin configure panel to avoid dev-mode hang - **Plugins**: Resolve `PLUGIN_DEV_DIR` plugins in admin config route - **Plugins**: Add missing body type assertion in `createPluginAPI` fetch options - **Plugins**: Propagate `settingsSchema` - **Settings**: Highlight plugin and theme cards in search results - **Settings**: Open plugin card on first click of a setting sub-result - **Settings**: Drop ghost sub-results from account and language search - **Settings**: Improve search highlight styling - **Viewer**: Show notification banners above attachments - **Viewer**: Rework S/MIME banner to match calendar invitation - **Viewer**: Close PDF preview on Escape before email viewer - **Viewer**: Render PDF previews via `` with `blob:` in object-src CSP (#253) - **Calendar**: Align invitation icon with sender avatar column - **Calendar**: Fix invitation picker clipping (#250) - **Auth**: Read `activeAccountId` from authStore in account selectors - **UI**: Adjust toast item border radius and progress bar styles - **UI**: Remove fly-in animation from context menu submenus - **i18n**: Add missing Czech flag icon ### i18n - Add missing translation keys across 15 locales ## 1.6.1 (2026-05-04) ### Features - **Updates**: Update-available detection with non-dismissible notice and dev-reload refresh - **Plugins**: New plugin hooks for compose, attachments, search, lifecycle, and routing - **Sharing**: Share indicators for calendars and contacts, updated JMAP capabilities (#244) - **Mail**: Auto-add recipients to trusted senders when replying - **Identity**: Sanitize identity display name to prevent invalid `From` headers ### Fixes - **Mobile**: Synchronize mobile submenu view with browser history for better navigation - **Viewer**: Update email viewer styles to improve overflow handling - **Auth**: Ensure `cookieSlot` consistency during account updates in auth store - **Auth**: Thread per-account cookie slot through OAuth flows - **Calendar**: Square the colored left marker on calendar events - **About**: Show git commit in About instead of "unknown" ### i18n - Update mailbox context menu translations across 12 locales ## 1.6.0 (2026-05-01) ### Features - **Deployment**: Subpath deployment support via `NEXT_PUBLIC_BASE_PATH` environment variable - **Mail**: Image attachment thumbnails and preview chips - **Mobile**: Reworked mobile mail viewer toolbar - **Mobile**: Mobile-friendly settings panel - **Mobile**: Mobile-friendly admin panel - **Mail**: Redesigned expanded details panel - **Mailbox**: Show full path in mailbox context menu header with intelligent path shortening ### Fixes - **Viewer**: Respect per-email dark mode toggle when "always show in light mode" is on - **Navigation**: Scroll apps list in navigation rail to prevent overflow - **Context menu**: Clamp submenu inside viewport - **Context menu**: Prevent context menu from clipping below viewport - **Context menu**: Prevent jump and animation on open - **Mail**: Stop silently destroying emails when trash mailbox isn't found (#195) - **Mail**: Preserve list scroll position when tagging an email - **Mail**: Render below-header overflow popup outside clipped row - **Mail**: Collapse below-header attachments to single row with overflow pill - **Push**: Fix push preview JMAP query - **Tour**: Navigate tour to mailbox when starting from another page - **i18n**: Add `useTranslations` for "selected emails" and "cancel" on email list batch operations ### i18n - Translate SPF/DKIM/DMARC tooltips - Add missing keys across 14 locales ## 1.5.4 (2026-05-01) ### Features - **PWA**: Web push notifications for new inbox mail (#233), with click-through to open the message - **Composer**: Insert and edit tables in rich-text emails (#236) - **Mail**: Configurable sub-addressing delimiter character (#239) - **i18n**: Turkish localization - **i18n**: Missing keys filled in across 15 locales ### Fixes - **Mail**: Set In-Reply-To and References headers on replies (#234) - **Mail**: Persist htmlBody in drafts to preserve rich formatting (#236) - **Auth**: Pin JMAP auth verification to the configured server URL (#237) - **Auth**: Evict unrecoverable basic-auth accounts on reload - **Notifications**: Scope new-mail notifications to genuine inbox deliveries - **Notifications**: Extend PushVerification timeout and clean up leftover subscriptions - **Viewer**: Smooth out body load to prevent flicker on first render - **Viewer**: Prevent iframe flash when loading images or trusting the sender - **Viewer**: Pad bare HTML emails like plain-text mails for consistent layout - **Viewer**: Light-mode override now only affects body content - **Viewer**: Detect `