urn:oximail:params:jmap:tasks alongside the standard shape), with tasks as JSTask objects (RFC 8984 family). The same items are served as VTODOs over CalDAV.
Objects and methods
Behaviours worth knowing
- Create without
taskListIdsfiles the task into the account’s default list — resolved before the write transaction, so it is fast even under load. - Recurrence and progress follow JSTask: recurring tasks expand through the same occurrence authority as calendar events; per-occurrence completion is representable. A task carries one recurrence rule, under the same closed profile and stored normalised like an event’s (recurrence): a second rule, or a bound outside the profile, is refused
invalidPropertiesonTask/set(it used to beserverFail) and403over CalDAV, including a VTODO with twoRRULElines. - Alerts support offset and absolute triggers; an absolute alert does not require a due date. Firing is server-side with per-occurrence deduplication. An alert keeps
acknowledgedandrelatedTo(both used to be dropped on write),Task/setvalidatesacknowledgedat create, and the task scheduler honours it like the calendar one. - “Later” is
Task/snoozeAlert {accountId, id, alertId, until}. The server writes the RFC 8984 §4.5.2 snooze throughTask/set: the fired alert acknowledged, a child absolute alert atuntil(a future UTCDateTime, at most 7 days ahead) that rings once and replaces any earlier snooze of the same alert. Errors and rules are those ofEvent/snoozeAlert. nullpatches erase. A JMAP update patch setting a property tonullclears it (RFC 8620 §5.3) —descriptionandpriorityincluded.- Dependencies and time tracking (
dependsOn, time fields) are modelled on the task object. - A task carries its
timeZone(RFC 8984 §4.7.1). ADUE:…Zwritten by CalDAV anchors inEtc/UTCrather than floating, aTZIDis normalised to IANA and the anchor ofDUEwins; the alert scheduler honours the task’s own anchor before the principal → organization chain, so a reminder fires at the task’s instant, not the principal’s wall clock. A row from before the column stays floating, its historical meaning; a template instantiation too. - Sharing is one rule.
TaskListRightsismayReadItems,mayWriteOwn,mayWriteAll(requiresmayWriteOwn),mayShare,mayDelete.TaskList/getfilters the lists a cross-account reader may read and computes theirmyRightsthrough the same calculation as mailboxes and calendars;Task/getandTask/queryare scoped to readable lists,Task/setconsults the rights per list, and a grant or a revocation notifies the grantee (sharing). - The trash is two-stage (ADR-035):
isTrashed: trueon an update trashes,falserestores,trashedAtis server-set. The trash sweep destroys what has been trashed longer than the tenant’s horizon, itstasks.trash_retention_daysoverride or else[tasks] trash_retention_days(30 by default, floor 1; an override of0purges nothing), through the Drive’s exit: legal holds respected, theDestroyedchange announced (per-tenant horizons). - A note can point at a task. A
Note.linksentry of typetaskkeeps the page a task came from; the link is a reference, not a constraint (notes). - VTODO round-trip: CalDAV clients see task lists as collections; VTODO
VALARMs (including absoluteTRIGGER;VALUE=DATE-TIME) import into alerts and re-emit on GET; ETags are content hashes, so concurrent edits from two protocols conflict loudly (412) instead of overwriting silently. Duplicate rows from repeated imports are repaired withoximail account dedupe-tasks(migration).
tasklinks) and templates are advertised as OxiMail capability objects, so a generic JMAP client can feature-detect them. Strictness rules are identical to the mail surface.