josecoelho2k downloadsBidirectional sync between tasks and CalDAV servers.
Bidirectional sync between obsidian-tasks and any CalDAV server (Nextcloud, Radicale, Baïkal, Fastmail, etc.).
Works with the obsidian-tasks plugin — syncs task status, dates, priorities, recurrence, tags, and notes as standard VTODO items.

#tag and CalDAV CATEGORIES)RRULE round-trips between CalDAV and obsidian-tasks formatAvailable in the Obsidian community plugin directory:
josecoelho/obsidian-tasks-caldav and click Add PluginBRAT will also handle future updates automatically.
main.js, manifest.json, and styles.css (if present) from the latest releaseVaultFolder/.obsidian/plugins/obsidian-tasks-caldav/Open Settings → Tasks CalDAV Sync. Add one or more calendars, each with:
| Setting | Description |
|---|---|
| Tag | Only tasks with this tag are synced — on both sides (Obsidian tags and CalDAV CATEGORIES must match) |
| Calendar name | Name of the calendar on the server |
| Server URL | CalDAV server endpoint |
| Username / Password | CalDAV credentials |
Global settings:
| Setting | Description | Default |
|---|---|---|
| Sync interval | Auto-sync period in minutes | 5 |
| New tasks destination | File where incoming CalDAV tasks are created | Inbox.md |
| New tasks section | Optional heading within the destination file | — |
| Sync completed tasks | Include completed tasks in sync | off |
| Delete behavior | What happens when a task is deleted on one side | ask |
Two modes:
Open the command palette (Ctrl/Cmd + P) to access:
| Command | Description |
|---|---|
| Sync with CalDAV now | Run an immediate sync |
| Preview sync (dry run) | See what would change without applying |
| View sync status | Show last sync time and any conflicts |
| Inject task IDs | Add unique IDs to selected tasks |
| Validate task IDs | Check document for valid/invalid task IDs |
Each synced task needs a unique ID. The plugin uses the obsidian-tasks native format:
- [ ] Buy groceries 🆔 20260213-a1b
Use the "Inject task IDs" command to add IDs to existing tasks, or the plugin will assign them automatically during sync.
| Obsidian | CalDAV | Direction |
|---|---|---|
| Task text | SUMMARY | ↔ |
| Indented bullets | DESCRIPTION | ↔ |
📅 due date |
DUE | ↔ |
🛫 start date |
DTSTART | ↔ |
✅ done date |
COMPLETED | ↔ |
🔁 recurrence |
RRULE | ↔ |
| Priority emoji | PRIORITY (1-9) | ↔ |
| Tags | CATEGORIES | ↔ |
| Status (done/cancelled) | STATUS | ↔ |
Indented bullet points below a task are synced as the VTODO DESCRIPTION field:
- [ ] Plan vacation 🆔 20260213-x2c
- Research flights
- Book hotel
- Pack list
These notes round-trip to/from CalDAV clients like Thunderbird or Tasks.org.
The Tag setting is a hard filter on both sides, not just routing:
#tag are pushedCATEGORIES include that tag are pulledIf your server tasks have no matching CATEGORIES, sync completes successfully but pulls nothing ("No tasks"). To sync everything regardless of category, leave the Tag field empty.
getTasks() method, which is not part of the official public API. Future obsidian-tasks updates could break this integration.| Server | Coverage |
|---|---|
| Radicale | Automated E2E suite |
| Nextcloud | Automated E2E suite |
| Vikunja | Automated E2E suite |
| Baïkal (SabreDAV) | Automated E2E suite |
| Fastmail | Manually verified |
Should work with any CalDAV server that supports VTODO, such as Synology.
iCloud Reminders is not supported directly — Apple does not expose it as a standard CalDAV/VTODO backend, so sync fails at later steps even with the correct server URL (#74).
Workaround: sync Obsidian with a standards-compliant CalDAV account (e.g. fruux) and add that same account to the iOS Reminders app. Reported working by @Jane2100117.
npm i # install dependencies
npm run dev # watch mode
npm run build # production build with type checking
npm test # run all tests (unit + E2E, requires Docker for Radicale)
npm run test:wdio # run Obsidian smoke tests (requires Docker + downloads Obsidian binary on first run)
See CLAUDE.md for architecture details and testing guidelines.
MIT