Skip to content

Stable releases of October 5, 2026

Everything that shipped on the stable channel on October 5, 2026 — v2.10.3 through v2.10.4, newest first. v2.10.4 is what you install; the versions below it are how you get there.

Stable v2.10.4

  • feat(mail): make design variant 2 the default: brand band, content zone, grey band
  • fix(i18n): name the light logo by its background, as the dark one already is
  • feat(ui): admin profile - login address with password confirmation, explicit operator-contact sync
  • feat(ui): favicon and dark-background logo upload for the panel and for resellers
  • fix(auth): one case-insensitive email check for every account path, SSO included
  • fix(auth): rate-limit the current-password check of signed-in users
  • fix(admin): require the current password to change the login address and tell the old one
  • feat(admin): let the signed-in admin edit their own login address
  • feat(lint): reject colour literals in TS/TSX (ADR-009 rule 4)
  • feat(a11y): gate is strict in both themes by default, baseline removed
  • fix(a11y): pin the fixture to the panel's own server, re-load only on a host network change, init TUNNEL_PID
  • fix(a11y): axe at zero in light and dark; baseline emptied, warning amber moved apart from orange
  • fix(a11y): stop the gate flaking — isolate each run, bypass the rate limit, separate not-tested from violations
  • fix(a11y): name every unlabeled select, input and event checkbox
  • feat(ui): dark theme with system/light/dark switch, antd and stylesheets read the same tokens
  • refactor(ui): replace every colour literal in the TSX with a role variable
  • refactor(ui): replace every colour literal in the stylesheets with a role variable
  • feat(ui): light and dark colour roles from one token file, antd palette read from it
  • fix(mail): drop German success text from the test mail and SMTP save replies
  • fix(i18n): use one word for the test mail within each language
  • fix(i18n): name the recipient on the test-mail buttons in all 15 languages
  • fix(ui): AA-corrected text colours in the shared component stylesheets
  • feat(ui): colour-role token layer and AA-corrected text colours in the stylesheets
  • fix(a11y): make overflowing table scrollers keyboard-reachable and trim the fixed baseline entries
  • fix(a11y): give switches and progress bars an accessible name
  • fix(a11y): name the language select on the public auth pages
  • fix(a11y): make every jsx-a11y rule an error now the backlog is cleared
  • fix(ui): do not flash the default tab title on a branded panel
  • feat(branding): favicon upload, dark logo and a public favicon route
  • fix(branding): drop the redundant embedded-field selector flagged by staticcheck
  • refactor(branding): build branding answers in one place and carry a dark logo field
  • fix(branding): require the white_label feature for a reseller's logo upload

Stable v2.10.3

  • fix(mail): answer unknown SMTP fields with an error code, not English prose
  • feat(settings): sender name field for the panel's emails
  • fix(settings): let the panel settings save the sender name and report ignored keys
  • fix(mail): make the SMTP form talk to the backend and stop sending as enconf
  • fix(notifications): SMTP form drops the dead encryption field, keeps the stored password and shows the server's reason
  • fix(doctor): agent outages no longer double-alert, lists see live findings, 5xx is time-boxed
  • fix(auth): take the white-label logo and title from the domain on every auth page
  • fix(doctor): show the real outcome of a repair instead of a green OK
  • feat(notifications): frame field and draft test mail in the envelope editor
  • feat(mail): return the resolved frame beside the language map and pin the PUT contract
  • feat(mail): add a frame that wraps header, body and footer
  • feat(mail): send a test mail with an unsaved envelope draft, to the caller's own address
  • fix(domains): say when the www alias reaches the certificate and report whether it did
  • fix(container): treat an unreadable container state as unknown, not as missing
  • fix(doctor): fixes report their real outcome, quarantine works, alerts survive an admin view
  • fix(quota): never lock out sites that already use more than their limit
  • fix(lint): pass the request context into the disk quota advisor check
  • fix(quota): enforce the package disk limit on every site and keep it in sync
  • fix(i18n): say Abonnement instead of Subscription throughout the German panel