[1.0.3] - 2026-11-04
Third-party apps (not the WebUI) need the new Stalwart OAuth scopes. Apps signing in through Stalwart or an external OpenID Connect provider could not manage app passwords, API keys or account settings. This access is now granted by the scopes urn:stalwart:oauth:scope:security, urn:stalwart:oauth:scope:settings and urn:stalwart:oauth:scope:full:
- Apps registered in Stalwart: add the scopes the app needs to its OAuthClient
scopes(only a superuser can allowfull), and have the app request them. - Apps signing in through an external OpenID Connect provider: create the scopes in the provider and assign them to the apps that need them.
- WebUI: no action needed.
Add the new permissions to the default roles (not a breaking change). This release adds new permissions, and default roles are created only on the first start of a new installation, so on an upgraded server they are missing and the features they control stay unavailable. Restart the server once with the environment variable STALWART_UPDATE_ROLE_PERMISSIONS=true to add them, then remove the variable. See Default roles on upgraded servers for details.
Added
- Blob storage:
- Blob encryption at rest. Blobs can be encrypted by the server with symmetric keys (AES-256-GCM or ChaCha20-Poly1305) defined as
SymmetricKeyobjects. - Zstandard compression for blobs (
zstdincompressionAlgorithm). BlobRecodetask, which rewrites stored blobs with a chosen compression and encryption.
- Blob encryption at rest. Blobs can be encrypted by the server with symmetric keys (AES-256-GCM or ChaCha20-Poly1305) defined as
STALWART_UPDATE_ROLE_PERMISSIONSenvironment variable. When set totrue(or1), startup adds to each default role every permission introduced after v1.0.0 that a new install would give that role and that the role is missing.- OAuth: Stalwart scopes
urn:stalwart:oauth:scope:security,urn:stalwart:oauth:scope:settingsandurn:stalwart:oauth:scope:full, so clients signing in through Stalwart or an external OpenID Connect provider can manage app passwords, API keys and account settings.
Fixed
- JMAP:
/copymethods called with the sameaccountIdandfromAccountIdreturn a clear error message.PushSubscriptionobjects created with an emptytypeslist no longer receiveStateChangenotifications, andEmailPushnotifications are delivered regardless oftypes.
- IMAP
SEARCHaccepts up to 32 levels of nested filters, so free-text searches from Apple Mail no longer fail withToo many nested filters. - OIDC: Bearer tokens are routed to the OpenID Connect directory whose issuer matches before the domain in their claims is tried, so a claim naming a domain the server does not host no longer sends the token to the default directory.
- Security: Editing a default role, or a role nested in one, now invalidates the cached access tokens of accounts and groups that use the default role sets.