❌

Lees weergave

v1.11.2 - Docker Fix

1.11.2 (2026-09-26)

1.11.2 fixes the Docker image and the standalone tarballs of 1.11.1, which did not start. It contains all the security fixes from 1.11.1, so please update.

Thank you for your donations:

One-time

Monthly

Fixes

  • Docker: The server starts again. 1.11.1 excluded data/ from the standalone build with a pattern that also dropped Next.js's own metadata modules, so the Docker image and the bulwark-standalone-* tarballs failed on startup. npm start and Bulwark Lite were not affected

  •  

v1.11.1 - Security Hardening, Tasks in Month View & Multi-Account Fixes

1.11.1 (2026-09-26)

1.11.1 is a security and bug-fix release. It fixes four reported vulnerabilities, two of them critical, and the findings of a security audit. Please update.

Thank you for your donations:

One-time

Monthly

Security

  • Admin: Only a Stalwart superuser gets into the admin dashboard. The admin probe accepted Stalwart's default tenant-admin role, so the administrator of a single tenant was signed into a dashboard that configures the whole instance (GHSA-v6hr-cmxm-pv73, thanks @douwezijlstra-frl)
  • Admin: Admin status is only taken from an admin-configured server. A context cookie minted while custom JMAP endpoints were allowed let a user-chosen server keep answering the admin probe after the switch was turned off (GHSA-j867-89p4-v8hm, thanks @Vip3r-MC)
  • API: Cross-origin writes are refused on the JMAP passthrough and every other cookie-authenticated /api/ route, not only /api/auth/*. A page on a same-site sibling origin could run arbitrary JMAP as the signed-in user. The gate also decides on the decoded path, so /api/%61uth/... no longer skips it (GHSA-9mvj-98f5-9q6g, thanks @kah-ja)
  • Admin: Admin sign-in attempts are also capped at 50 per 15 minutes across all clients, because a forged X-Forwarded-For got a fresh per-IP budget when no reverse proxy is in front (GHSA-7pj2-232x-6698, thanks @richardweinberger)
  • Admin: Impersonation no longer puts the Stalwart master password into the session cookie. The webmail creates an app password on the target mailbox that expires after 8 hours and is revoked on sign-out, and a used impersonation link is refused after a restart or on another replica
  • Mail: A sender can no longer fake a DMARC or DKIM pass in the security badges, with a crafted envelope address or an Authentication-Results header of their own
  • Mail: Opening an SVG attachment's thumbnail on its own no longer runs the sender's script in the webmail origin
  • Mail: Remote content stays blocked in the mobile conversation view, the .eml attachment preview, the quoted original of a reply or forward, the print view, and for URL spellings the filter missed (backslashes, CSS escapes, image-set())
  • Mail: Links in image maps (<area>) no longer keep window.opener
  • Mail: A mailto: unsubscribe goes to the single address in the link, and the confirmation shows recipient, subject and body before sending
  • Mail: A crafted winmail.dat no longer freezes the tab
  • Composer: A sender name containing a quote can no longer add a recipient to a draft
  • Filters: Rule names, header names and sizes are escaped, so rules from plugins or imported filter sets cannot add commands such as redirect to the Sieve script
  • Plugins: Hooks and slots need a declared permission, like the host API does. http.post can no longer reach the JMAP passthrough, /api/admin/*, /api/settings or other credentialed routes, and plugin storage is kept per account and deleted on sign-out
  • Themes: The theme CSS sanitizer no longer lets remote resources through (url(//host), CSS escapes, image-set(), @font-face sources), and theme CSS can only target :root and .dark, also when a plugin transforms it
  • Files: WOPI file downloads are always served as inert attachments, so a blob typed text/html cannot run script in the webmail origin
  • Server: The SSRF guard also blocks loopback beyond 127.0.0.1, CGNAT, benchmark, multicast and reserved ranges, and NAT64, 6to4 and Teredo addresses that wrap an internal IPv4 address. Telemetry targets are checked at connect time, and OAuth token and revocation requests never follow redirects
  • Auth: Synced settings are keyed on the account a bearer token belongs to, so on a multi-domain server john@b.example can no longer read the settings of john@a.example
  • Auth: Wrong passwords tried through the login pre-check are limited, so the route can no longer be used as a password oracle or trip Stalwart's ban against the webmail itself
  • Auth: Signing out ends office editor sessions opened in that browser, and a full sign-out clears search history, open tabs, Files recents, staged plugin uploads and the other accounts' leftovers, also in other open tabs
  • Auth: Signing out when another account's restore had failed no longer leaves that account resumable
  • Auth: The failed TOTP login no longer passes on a user-chosen server's error body
  • Server: Visitors who are not signed in no longer get detailed health data, the pending advisory text, the plugin list, the full admin policy or every server's domain list
  • Server: The setup token is passed in the URL fragment, so it stays out of access logs, referers and history
  • Server: Not-found pages outside the app tree cannot be framed, ALLOWED_FRAME_ANCESTORS never applies to the admin dashboard or setup, and sibling subdomains can no longer widen the sidebar-app frame-src
  • Server: Favicons are only served as raster images
  • Docker: Runtime state and secrets (data/, local-data/, .env) stay out of the standalone build and the image, and the mock JMAP server can no longer be switched on in a release build
  • Lite: Sign-out revokes the refresh token, and a failed token login no longer keeps the password in sessionStorage
  • Lite: Every static page gets a CSP that allows only its own inline scripts, the Stalwart bundle refuses to run inside a foreign frame, and the Stalwart install instructions use a tagged release with a published .sha256 instead of releases/latest

Features

  • Calendar: Tasks with a due date show in the month view (#1107)

Changes

  • Plugins: Hooks that change outgoing mail need email:send, and display takeovers need email:render-takeover. Plugins that don't declare them lose those hooks
  • Themes: Theme CSS keeps only :root and .dark rules plus @font-face, @keyframes, @media and @supports. Every url() except a #fragment is removed
  • Admin: Impersonated sessions end after 8 hours, and sessions minted by earlier versions are signed out
  • Server: /api/health?detailed=true needs a session

Fixes

  • Mail: The inbox keeps rendering when a message has an unparsable date (#1099)
  • Mail: A folder no longer switches back to the unified inbox while it loads (#1102, thanks @guisea)
  • Mail: Replies in the unified inbox come from the identity of the account that received the mail (#1104)
  • Mail: Mail deleted during a list refresh no longer reappears (#966)
  • Mail: The message list no longer jumps while attachment chips load
  • Mail: Scrolling the unified inbox, cross-account views, tag views and "All folders" search no longer skips messages
  • Mail: A failed message-list read keeps the list on screen instead of showing an empty folder
  • Mail: Marking read, starring, tagging, emptying a folder and cancelling a scheduled send report it when the server refuses them
  • Mail: Tagging and pinning write only the keywords that change, so they no longer mark mail unread that was read on another device
  • Mail: New mail and folder changes keep arriving for users with seven or more shared accounts
  • Send: A dropped connection can no longer send a message twice
  • Send: Undo and edit of a message sent from a group identity act in the group's own account
  • Composer: A reply draft stays in its thread when it is re-opened or undone
  • Composer: An open draft stays on its own account across an account switch
  • Accounts: Quick account switches no longer mix up identities, so replies go out with the right From address
  • Accounts: Folders, filters and the account security page no longer show the previous account's data after a switch
  • Accounts: Settings sync turns back on after signing out of one of several accounts
  • Push: A notification opens its message in the account it came from
  • Calendar: Events you declined show struck through (#1110)
  • Calendar: Daily recurring events keep going past a DST gap
  • Calendar: iCal subscriptions stay with the login that created them, so refreshing or removing one no longer touches a calendar of another login
  • Auth: SSO sign-in behind nginx no longer fails with a 502 when the cookies would overflow its header buffer (#1096)
  • Auth: Sign-in and addresses work on internationalized domains (#1100)
  • Lite: A rate-limited token endpoint no longer signs you out
  • i18n: The dark/light mode titles and the "Themes" settings tab are translated in every language (#1105, #1106, thanks @dulinux), and so is the themes settings panel
  • i18n: Updated Portuguese (Brazil) translation (#1106, thanks @dulinux)

  •  

Release 2026.09.26

Docker Images

Docker images have been built and pushed:

Docker Hub:

  • alexta69/metube:latest
  • alexta69/metube:2026.09.26

GitHub Container Registry:

  • ghcr.io/alexta69/metube:latest
  • ghcr.io/alexta69/metube:2026.09.26

Changes

  • chore: upgrade Python and frontend dependencies (f5e5ab3)
  • fix: say when an add is skipped because the video is in the download archive (98b0b10)
  • feat: Auto audio format and a Tags choice for what gets written into the file (ee2bb0b)
  • docs: reword the contribution guidance (d959cbc)
  • ci: warn when the README passes a 15,000-byte budget (04ebfb8)
  • docs: restructure the README as a landing page and variable reference (d310bcc)
  • docs: state in SECURITY.md that MeTube does not request CVEs (f319b26)

  •  

v2.14.0

Note

This release adds bulk actions for vulnerability findings, a redesigned risk-based security view, container process visibility, and search in the template selector.
It also improves update workflows, Compose handling, backups, Easy Join, and activity processing while resolving several access and configuration issues.

Security and vulnerability management

  • Added bulk ignore and restore actions for vulnerability findings β€” 8dd49f1ac48b6dc1a17c960e08287338934eb33f (#4158) (@kmendell)
  • Redesigned the risk-based security view β€” cac682df3161e4228b5217fc3c9361700485c280 (#4204) (@kmendell)
  • Improved the risk score model β€” 0238e1414138788e1b674b1ae9d1ffc5b65adc38 (#4205) (@kmendell)
  • Fixed environment-admin resource pages requesting globally protected data β€” 91825a6865e1e3a5a5913c0dfb938dc4093dbfe6 (#4151) (@kmendell)
  • Accepted Safari’s unrequested appid=false value during passkey assertions β€” a7db1aeafd3aff1e5e3161780dd37d117ac0084a (#4208) (@kmendell)

Containers, projects, and updates

  • Added a container processes tab β€” bbc70f7d6007b3532c1bc103e30e1cb9222ef6fe (#4187) (@kmendell)
  • Routed container updates through the activity system β€” 2e35dfda39ed51e692fb4b00c944fd1ba6ceb6e5 (#4167) (@kmendell)
  • Resolved pending update status consistently across containers, projects, and the dashboard β€” aaac10a0d5e1105edfa01a0708f4cdbaf6e96375 (#4189) (@kmendell)
  • Preserved Compose formatting when applying tag updates β€” b9d64a9f116f700f64fa30ebc04d5816e3174f20 (#4172) (@kmendell)
  • Recreated namespace dependents when updating Compose services β€” 33216715407a75a2b2ce499d228dab68a847ac87 (#4179) (@kmendell)
  • Preserved pinned Compose tags unless enabled by the updater strategy β€” 72532defe45ac340d07aaf01b6d6a9e393972d87 (#4180) (@kmendell)
  • Continued checking for updates for containers excluded from automatic updates β€” 4eeb7d43d3c4aea469803ea6f94645ab94f8de1c (#4181) (@kmendell)
  • Logged project updates during Git sync only when content changed β€” 439aee51db0e19769928e68454d610f2cb53cfcd (#4206) (@kmendell)
  • Skipped symlinked external bind sources when preparing project updates β€” bcaa9d447b5aa044c60a9aa657179b8000dfa2d7 (#4207) (@kmendell)
  • Kept the project Save action mounted to maintain a stable toolbar layout β€” dd37ce953c0e673776f7a843fabff612fa928147 (#4157) (@kmendell)

Environments, backups, and configuration

  • Allowed token re-entry when changing an agent API URL β€” af4dab5f00980e34c3870deffae636eb4a498793 (#4160) (@kmendell)
  • Allowed deleting backup records for missing snapshots β€” b30e617cfa403d91fd6306dfe88bdd2133a8dcb6 (#4161) (@kmendell)
  • Surfaced Docker join errors and added a manager-address override to Easy Join β€” e2312137c99ff400f8473265780816d6bf9cab3f (#4191) (@kmendell)
  • Allowed dots and hyphens in .env variable names β€” 144d7acced1ba23e0661148ce29b3db107732b58 (#4199) (@DominikZublasing)
  • Added search to the template selection dialog β€” 4bbcbfea6274e149a57daa386a57543df688f380 (#4183) (@kmendell)
  • Forwarded proxy configuration to Trivy scan containers β€” 85b9b16baa0d79edc7ab3d01df98dcd3d811a1d1 (#4168) (@kmendell)

Activity processing

  • Isolated activity subscriber payloads to prevent concurrent writes β€” 9fc00866b9107366824b91cdd887de54c8b089d6 (#4159) (@kmendell)

  •  
❌