Issue Description
An existing calendar event was modified through JMAP (CalendarEvent/set update:
changed start time and duration; client: Bulwark webmail). The JMAP view reflects the change, but the CalDAV representation of the same event is frozen: both a GET on the resource and a calendar-query REPORT keep returning the pre-edit iCalendar content, and the getetag remains unchanged.
Since CalDAV clients detect changes via the ETag, they never learn about edits made through JMAP clients - the change is invisible on the entire CalDAV protocol surface.
Possibly related to my other report about calendar-query returning empty calendar-data for JMAP-created events: both look like the JMAP/JSCalendar store and the CalDAV/iCalendar view not being kept in sync.
Expected Behavior
After a JMAP update, GET and calendar-query REPORT on the corresponding CalDAV resource return the updated event, and the ETag changes so CalDAV sync clients pick up the modification.
Actual Behavior
JMAP CalendarEvent/get (after the edit):
start=2026-08-01T11:00:00, duration=PT5M, showWithoutTime=false (new state)
CalDAV GET on the same event’s resource:
DTSTART;VALUE=DATE;TZID=Europe/Berlin:20260801 (all-day, old state)
DTSTAMP from before the edit
ETag before edit == ETag after edit (“1282476642”) — unchanged in GET, PROPFIND and REPORT. The calendar-query REPORT also returns the old content.
Reproduction Steps
- Create a (recurring) event via CalDAV PUT (iCalendar resource) or have an existing CalDAV-stored event.
- Modify the event via JMAP, e.g. change start/duration:
curl -u user:pass https://mail.example.com/jmap/
-H ‘Content-Type: application/json’
-d ‘{“using”:[“urn:ietf:params:jmap:core”,“urn:ietf:params:jmap:calendars”],
“methodCalls”:[[“CalendarEvent/set”,{“accountId”:“”,
“update”:{“”:{“start”:“2026-08-01T11:00:00”,
“duration”:“PT5M”,“showWithoutTime”:false}}},“c1”]]}’
- Verify via JMAP CalendarEvent/get that the change is stored.
- GET the CalDAV resource / run a calendar-query REPORT / PROPFIND the getetag.
- Observe: old iCalendar content, unchanged ETag.
Stalwart Version
v0.16.x
Installation Method
Binary (Linux)
Database Backend
RocksDB
Blob Storage
RocksDB
Search Engine
Internal
Directory Backend
Internal
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
I understand that topics in this category are triaged by a bot first but a human reply will follow up. If I’d prefer a human-only reply, I’ll add the no-ai tag to my topic.
on