Issue Description
A CalDAV account configured with the native iOS account setup is accepted during setup, but afterwards appears as “Inactive” and no calendars are synchronized.
The server is Stalwart 0.16.17 and the client is iOS 26.6 (23G71).
The account has MFA enabled, so a Stalwart application password is used for CalDAV. Authentication with the application password works correctly.
The issue was reproduced with a clean iOS setup after removing all existing Stalwart CalDAV and CardDAV accounts and rebooting the iPhone.
HTTP logging shows that iOS successfully performs CalDAV discovery, reaches the authenticated principal URL and receives a successful OPTIONS response advertising calendar-access. After that response, iOS stops and never requests the calendar-home-set.
Independent curl tests confirm that the principal, calendar home and actual calendar collection are accessible.
Expected Behavior
After successful CalDAV discovery, iOS should continue querying the authenticated principal, obtain the calendar-home-set, discover the available calendar collections and activate the CalDAV account.
Actual Behavior
The account setup completes without an authentication error, but the CalDAV account is then shown as “Inactive” in iOS Settings.
No calendar becomes available.
The request sequence from iOS stops immediately after a successful authenticated OPTIONS request to the discovered principal URL.
No subsequent PROPFIND for calendar-home-set is sent by iOS.
Reproduction Steps
- Use a Stalwart account with CalDAV available.
- Enable MFA for the account.
- Create a Stalwart application password.
- On an iPhone running iOS 26.6, add a CalDAV account.
- Enter the Stalwart HTTPS hostname as server.
- Enter the account email address as username.
- Use the Stalwart application password.
- Enable SSL on port 443.
- Save the account.
- The setup completes without an authentication error.
- Open the account again in iOS Settings.
- The account is shown as “Inactive” and no calendar is synchronized.
The issue was also reproduced after deleting all existing Stalwart CalDAV and CardDAV accounts from the iPhone and rebooting it before creating the CalDAV account again.
Manually setting the account URL to the calendar home or directly to the default calendar did not resolve the problem.
Relevant Log Output
Client:
iOS 26.6 (23G71)
User-Agent: iOS/26.6 (23G71) accountsd/1.0
Observed request sequence:
PROPFIND /.well-known/caldav
→ HTTP 307
→ Location: /dav/cal
PROPFIND /dav/cal
→ HTTP 207 Multi-Status
OPTIONS /dav/pal/user%40example[.]com/
→ HTTP 200 OK
After this OPTIONS request, no further CalDAV request is sent by iOS.
The OPTIONS response includes:
DAV: 1, 2, 3, access-control, extended-mkcol, calendar-access, calendar-auto-schedule, calendar-no-timezone, addressbook
Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, COPY, MOVE, MKCALENDAR, MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, REPORT, ACL
The PROPFIND on /dav/cal returns:
<?xml version="1.0" encoding="UTF-8"?><D:multistatus xmlns:D=“DAV:”>
<D:response>
<D:href>/dav/cal/</D:href>
<D:propstat>
<D:prop>
<D:current-user-principal>
<D:href>/dav/pal/user%40example[.]com/</D:href>
</D:current-user-principal>
<D:resourcetype>
<D:collection/>
</D:resourcetype>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
<D:propstat>
<D:prop>
<D:principal-URL/>
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
</D:propstat>
</D:response>
</D:multistatus>
iOS clearly extracts the current-user-principal from this response because its next request is:
OPTIONS /dav/pal/user%40example[.]com/
That request receives HTTP 200 and advertises calendar-access, after which iOS stops.
Independent authenticated curl tests confirm that these resources are accessible:
/dav/pal/user%40example[.]com/
/dav/cal/user%40example[.]com/
/dav/cal/user%40example[.]com/default/
A PROPFIND on the principal correctly returns the calendar-home-set, and a Depth: 1 PROPFIND on the calendar home returns the actual calendar collection.
Stalwart Version
v0.16.x
Installation Method
Binary (Linux)
Database Backend
MySQL
Blob Storage
MySQL
Search Engine
MySQL
Directory Backend
Internal
Additional Context
The mail server is a production Stalwart installation and mail services themselves are working normally.
The CalDAV problem is limited to the native iOS CalDAV account setup.
Authentication is not the issue:
- The normal account password is correctly rejected because MFA is enabled.
- The Stalwart application password authenticates successfully.
- The same application password works in authenticated curl DAV tests.
The issue was reproduced with all other Stalwart DAV accounts removed from the iPhone, so concurrent CardDAV traffic can be excluded.
Caddy does not rewrite or filter DAV methods. The real iOS OPTIONS request reaches Stalwart and the successful HTTP 200 response, including the DAV capability headers, reaches the iPhone.
Security headers such as Content-Security-Policy and X-Frame-Options were also investigated. They do not block the native DAV requests.
The CalDAV hierarchy itself is functional when tested directly:
- current-user-principal is returned
- calendar-home-set is returned from the principal
- the calendar home is accessible
- the default calendar collection is accessible
- calendar resources can be read
The unusual point is that iOS stops immediately after the successful OPTIONS request to the principal instead of continuing with a PROPFIND for calendar-home-set.
I have reviewed the documentation and FAQ and confirm that my issue is NOT addressed there.
on
I have searched this support forum (open and closed topics) and confirm this is not a duplicate.
on