CalDAV¶
What it is¶
CalDAV (Calendaring Extensions to WebDAV) is an internet standard allowing a client to access scheduling information on a remote server. It extends the WebDAV (Web Distributed Authoring and Versioning) protocol and uses the iCalendar format for data exchange. As of July 2026, it remains the primary open standard for cross-vendor calendar synchronization in sovereign AI stacks.
What problem it solves¶
It provides an open, standardized protocol for calendar synchronization, enabling interoperability between different calendar clients (e.g., Apple Calendar, Thunderbird, Android apps) and servers (e.g., Nextcloud, Radicale, Baïkal, Google Calendar) without vendor lock-in. It allows users to own their scheduling data while maintaining cross-device availability.
Where it fits in the stack¶
Infrastructure / Protocol. It serves as the underlying "language" for calendar synchronization between self-hosted services and client applications.
Typical use cases¶
- Multi-Device Sync: Keeping your personal schedule in sync across phone, laptop, and tablet.
- Shared Calendars: Coordinating schedules within a family or team using a self-hosted server.
- Automation Triggers: Using n8n or custom scripts to watch a CalDAV calendar and trigger actions.
- Task Management: Many CalDAV servers also support VTODO (tasks), allowing for synchronized todo lists via the same protocol.
- Agentic Scheduling: Giving AI agents the ability to read and write to your schedule via standardized MCP 3.0 servers.
Strengths¶
- Sovereignty: Complete control over your private schedule when self-hosted.
- Interoperability: Works with nearly every major calendar application.
- Open Standard: Not dependent on the survival or pricing changes of a single company.
- Simplicity: Based on HTTP and XML, making it relatively easy to debug with standard web tools.
- Task Support: Native support for task synchronization (VTODO) alongside events.
Limitations¶
- Discovery Complexity: Finding the correct URL for a specific calendar can be frustrating (varies by server).
- Sync Conflict Resolution: Can be less robust than proprietary protocols (like Exchange/ActiveSync) in complex multi-user scenarios.
- Authentication: Modern OAuth2 flows can be difficult to implement for some legacy CalDAV clients.
When to use it¶
- When building a self-hosted "sovereign" personal cloud using Nextcloud or Radicale.
- When you need to integrate calendar data into custom automation workflows.
- When you want to avoid proprietary "walled garden" calendar services like Google Calendar.
When not to use it¶
- If your entire organization is already on Google Workspace or Microsoft 365 and you don't need external integration.
- If you need advanced "room booking" or complex enterprise resource scheduling features not well-supported by basic CalDAV.
Getting started¶
The most common way to start with CalDAV is to deploy a dedicated server like Radicale.
# Deploy Radicale using Docker
docker run -d --name radicale \
-p 5232:5232 \
-v ~/radicale/data:/data \
tomsun/radicale
Once running, you can connect clients by pointing them to http://localhost:5232/user/calendar.ics/.
CLI examples¶
1. Discovery via Curl¶
Use PROPFIND to discover the display name and description of calendars.
curl -u 'user:password' -X PROPFIND \
-H "Depth: 1" \
-H "Content-Type: application/xml; charset=utf-8" \
-d '<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop><D:displayname /><C:calendar-description /></D:prop>
</D:propfind>' \
https://caldav.example.com/remote.php/dav/calendars/user/
2. Verify Storage (Radicale)¶
Check the internal storage consistency of a Radicale server.
docker exec -it radicale radicale --verify-storage
3. Fetching iCal Data¶
Retrieve the raw iCalendar data for a specific calendar.
curl -u 'user:password' https://caldav.example.com/remote.php/dav/calendars/user/personal.ics
API examples¶
Python Integration (caldav library)¶
Programmatic access is essential for building autonomous scheduling agents.
import caldav
from datetime import datetime
client = caldav.DAVClient(
url="https://caldav.example.com/remote.php/dav/",
username="user",
password="password"
)
principal = client.principal()
calendars = principal.calendars()
if calendars:
calendar = calendars[0]
# Fetch events for today
events = calendar.date_search(
start=datetime(2026, 7, 21),
end=datetime(2026, 7, 22)
)
for event in events:
print(f"Summary: {event.vobject_instance.vevent.summary.value}")
Related tools / concepts¶
- Nextcloud: Suite that includes a robust CalDAV server.
- Vikunja: Task manager that can sync via CalDAV.
- Google Calendar: Cloud provider supporting CalDAV access.
- n8n: Automate CalDAV interactions.
- Paperless-ngx: Trigger calendar events from documents.
- Home Assistant: Scheduling automation.
- Authentik: SSO for CalDAV servers.
- Radicale: Lightweight CalDAV/CardDAV server.
- Model Context Protocol (MCP): Standard for tool use including scheduling.
Sources / references¶
- RFC 4791: CalDAV Specification
- CalDAV.org
- Radicale Documentation
- MCP 3.0 Task Protocol for Calendaring
Contribution Metadata¶
- Last reviewed: 2026-07-21
- Confidence: high