v0.16.10

RyanCodrai/turbovecv0.16.10Jun 21, 2026by github-actions[bot]

AI Summary

This release focuses on JMAP conformance compliance, adds OAuth profile support, and includes various fixes for IMAP, ACME, and HTTP redirect functionality.

Key Highlights

  • JMAP conformance compliance (passing jmap-test-suite)
  • OAuth Profile for Open Public Clients
  • HTTP redirectRoot option for root path redirection
  • ACME reuseKey option for private key management

New Features

  • International Domain Names (IDN) support
  • OAuth Profile for Open Public Clients
  • Client secret verification for confidential clients
  • HTTP redirectRoot option
  • ACME reuseKey option
  • IMAP Extension for Object Identifiers
  • GETJMAPACCESS command to discover the JMAP session resource URL

Full Release Notes

## [0.16.10] - 2026-06-21

If you are upgrading from v0.16.x, replace the binary (or run `docker pull`). If you are upgrading from v0.15.x and below, please read the [upgrading documentation](https://github.com/stalwartlabs/stalwart/blob/main/UPGRADING/v0_16.md) for more information on how to upgrade from previous versions.

## Added
- International Domain Names (IDN) support (#207).
- OAuth:
  - OAuth Profile for Open Public Clients ([draft-ietf-mailmaint-oauth-public](https://datatracker.ietf.org/doc/draft-ietf-mailmaint-oauth-public/))
  - Client secret verification for confidential clients.
- HTTP: Add `redirectRoot` option to `Http` object to allow redirecting requests to the root path to a different path (e.g. `/account`).
- ACME: `reuseKey` option to allow reusing private keys in renewals.
- IMAP: 
  - IMAP Extension for Object Identifiers ([draft-ietf-mailmaint-imap-objectid-bis](https://datatracker.ietf.org/doc/draft-ietf-mailmaint-imap-objectid-bis/))
  - `GETJMAPACCESS` command to discover the JMAP session resource URL (#2736).

## Changed

## Fixed
- JMAP conformance (pass the [jmap-test-suite](https://github.com/jmapio/jmap-test-suite) tests):
  - Methods are only available if their capability is in `using`.
  - Reject requests that do not specify `application/json` in the `Content-Type` header.
  - Require `accountId` argument on requests.
  - Return unparsable ids in `notFound` / `notUpdated` / `notDestroyed` / `notCopied` instead of dropping them.
  - Default calendars and address books are not subscribed by default.
  - `*/set`: Unchanged immutable `id` property is rejected on update.
  - `*/query` and `*/queryChanges`: null` rejected as `notRequest`.
  - `Email/query`:
    * Improper `anchor` handling.
    * Total miscount when `collapseThreads` is enabled.
    * Wrong sort order on `hasKeyword`, `allInThreadHaveKeyword`, and `someInThreadHaveKeyword` conditions.
    * Non-standard header values are not searchable.
  - `Email/copy`: Take the source message id from the value's `id` property.
  - `Email/set`: Bump reference-resolution max_depth from 1 to 2.
  - `Email/import`: Reject blobs that do not contain valid messages.
  - `EmailSubmission/set`: return `sendAt` and `undoStatus` in the created response.
  - `Mailbox/set`: Return `alreadyExists` instead of `invalidProperties` when creating a mailbox with an existing name.
  - `SearchSnippet/get`: incorrect response structure.
  - `Thread/changes`: emit a container delete when a thread becomes empty.
  - `VacationResponse/set`: incorrect singleton handling.
- IMAP: Discard oversized non-synchronizing literals (#2768).
- DANE: Improper `TLSA` record validation (#2328 - credits to @vdukhovni).
- OIDC: Add default domain name to groups that are not email addresses.
- RocksDB: Enable blob garbage collection to reclaim disk space from deleted blobs.
- Sieve: `include` statements ignore capitalisation of sub-script names (#1643)
- Cache: Invalidate negative email caches when an account is created.
- Troubleshoot tool: Use the configured source IP address when connecting to remote servers (#2867).


<hr />

### Check binary attestation [here](https://github.com/stalwartlabs/stalwart/attestations/32044689)