DayDAV
approvedby haoenz
在日记中创建和编辑日程,在任意笔记中插入日程链接,并通过 Full Calendar Remastered 与 CalDAV 双向同步。 - This plugin has not been manually reviewed by Obsidian staff.
DayDAV
Edit ordinary calendar events as readable lines in Obsidian Daily Notes and synchronize them through Full Calendar Remastered to a CalDAV calendar.
DayDAV does not provide another calendar view and does not implement its own CalDAV login. Full Calendar Remastered remains the calendar client and the remote CalDAV collection remains the source of truth.
[!CAUTION] Test DayDAV with a disposable calendar before using it with important data. Keep backups of both your Vault and calendar.
Why
The plugin is for people who plan and journal in Markdown but use a dedicated calendar app for calendar views and system reminders. An event can be written once in a Daily Note, then synchronized to the phone through CalDAV.
Requirements
- Obsidian 1.13.0 or later.
- Full Calendar Remastered with a writable CalDAV calendar source.
- Obsidian's Daily Notes core plugin, or Daily Note paths that follow a Moment-style date format.
Do not also configure Full Calendar Remastered's Daily Note calendar for the same event lines. That is a separate local source and would create duplicate event ownership.
Daily Note format
When the Daily Notes core plugin is enabled, DayDAV reads its folder and date-format settings automatically. Nested formats are supported. For example, a folder of 日记 and a format of YYYY/MM/YYYY-MM-DD resolve to 日记/2026/09/2026-09-10.md.
Add this toolbar block to the Daily Note template:
## Events
```daydav
```
The code block renders New event and Sync now buttons. Events are ordinary list items under the configured heading, using a DayPlanner-style format inspired by Full Calendar's Daily Note Calendar:
- 09:00 - 10:00 [Project discussion](obsidian://daydav?key=example&rev=abc123) [location:: Meeting room]
- 14:30 - 15:00 [Dentist](obsidian://daydav?key=example-2&rev=def456) [description:: Bring insurance card]
- [Public holiday](obsidian://daydav?key=example-3&rev=ghi789)
The title link opens the edit/delete dialog. Its key query parameter is the sole stable event identity. The short opaque rev value identifies the remote version on which that line was based, so a Vault-synchronized edit can be checked safely on another device. It is not a UID and can change after a successful sync. No separate [uid::] field or hidden HTML metadata is written.
References from any note
Run DayDAV: Insert event from any Markdown editor. The picker keeps New event at the top and lists existing events below it; search matches event title, date, time, and location. Selecting an existing event inserts a standalone reference at the cursor. Selecting New event opens the create dialog, writes the event to the matching Daily Note, and inserts the same reference after creation.
📅 2026-09-10 09:00–10:00 [Project discussion](obsidian://daydav?key=example)
The Daily Note remains the local event projection and other notes contain references only, so inserting a reference does not create a second synchronized copy.
Create
- Click New event in a Daily Note, run
DayDAV: New event for current Daily Note, or choose New event fromDayDAV: Insert eventin any Markdown note. - You can also type a new event list item under the configured heading. A line without a bridge title link is created remotely on the next sync.
Edit
Click the event title to open the edit dialog, or change the title, time, location, description, or move the entire managed line to another Daily Note. The change is merged into the current remote event so calendar fields that are not represented in Markdown remain intact.
The create/edit dialog also has an Enable reminder toggle and a Minutes before field. Enabling it writes a CalDAV VALARM with ACTION:DISPLAY. Opening an existing event reads its current alarm; saving without touching the reminder controls preserves all existing alarms exactly.
Delete
Put the cursor on a managed event line and run DayDAV: Mark event for deletion. This adds [delete:: true]; the next sync deletes the remote event and removes the line.
Simply deleting a line is intentionally not treated as a remote deletion. It will be restored from CalDAV. This protects against accidental note edits, template replacement, sync conflicts, and formatters.
Setup
- Install and enable Full Calendar Remastered.
- Configure and test its writable CalDAV source.
- Install and enable DayDAV.
- Open Settings → DayDAV and click 授权.
- Review the Full Calendar permission request and grant event read/write plus provider read/refresh scopes.
- Select the CalDAV-backed calendar source.
- Confirm the Daily Notes path detected from the core plugin, then configure the events heading. Manual folder and date-format fields are used only as a fallback when no enabled core configuration is found.
- Add the toolbar shown above to your Daily Note template. No marker comments are needed.
- Run Sync now.
The Full Calendar access token is saved in Obsidian SecretStorage. This plugin never receives the CalDAV URL, username, or password.
Synchronization model
- CalDAV is authoritative for remote existence and fields not shown in Markdown.
- To locate Daily Notes, DayDAV enumerates file paths only within the configured Daily Notes folder tree, or at the Vault root when Daily Notes are stored there. It reads and writes only files whose paths match the configured Daily Notes date format.
- Existing Daily Notes receive remote events for their date.
- Missing Daily Notes are not created unless the option is explicitly enabled. When enabled, creation is limited to events within 90 days of today.
- Create, edit, and delete actions update the Daily Note immediately and enter a durable local outbox. Slow or unavailable CalDAV does not block the dialog.
- The outbox, base snapshots, and retry state are stored in the plugin's
data.json; CalDAV credentials remain in Full Calendar/Obsidian SecretStorage. - Pending operations retry on immediate background sync, manual sync, startup sync, and the configured periodic sync.
- A remote event must be missing on two consecutive successful sync passes before its line is removed.
- Concurrent edits use a three-way comparison of the base, local, and current remote event. Changes to different fields merge automatically.
- If both sides changed the same field, or an event was changed on one side and deleted on the other, the operation pauses without overwriting either side. Use 处理冲突 in the Daily Note toolbar, settings, or command palette to choose the local or remote version.
- Full Calendar's CalDAV provider applies conditional creation and ETag-protected updates. Deletes compare the saved and freshly fetched ETag before invoking Full Calendar, in addition to comparing event fields.
- Exact date/title/time/location/description matches are reconciled before creating a new event, reducing duplicates when metadata was removed.
Current limitations
- The current release targets ordinary single-day VEVENTs. A recurring master is currently projected only on its start date; occurrences are not expanded into every matching Daily Note.
- Multi-day events are projected on their start date.
- Existing RRULE, timezone, and provider-specific fields are preserved by merge updates but are not editable in the Markdown syntax yet.
- A single display reminder can be created or changed in the event dialog. Multiple or non-display alarms are preserved while the reminder controls remain untouched, but are not individually editable yet.
- Full Calendar Remastered's current public delete API does not expose an atomic conditional-delete option. The bridge refreshes and checks the ETag immediately before deletion, but a server edit in the very small interval after that check cannot be detected atomically.
- The plugin relies on Full Calendar Remastered's public API. A breaking API change may require an update to this plugin.
- Automatic sync runs only while Obsidian is open. Your phone's calendar app remains responsible for background synchronization and notifications.
- If a phone edit has reached neither the Vault nor CalDAV, no other device can know about it yet. Once either copy arrives, the saved base revision and CalDAV ETag prevent an unnoticed stale overwrite.
Development
pnpm install
pnpm run check
Copy main.js, manifest.json, and styles.css into:
<Vault>/.obsidian/plugins/daydav/
Reload Obsidian and enable the plugin.
Releases
- If the release needs a newer Obsidian API, update
minAppVersioninmanifest.json. - Update the plugin version in
package.json. - Run
pnpm run version. The script copies the plugin version tomanifest.jsonand records its minimum Obsidian version inversions.json. - Commit the changes and tag the commit with the exact version, without a
vprefix, for example1.0.0. - Push the tag. GitHub Actions verifies the compatibility map, builds the plugin, and attaches
main.js,manifest.json, andstyles.cssto the release.
For the first Community Plugins submission, append a matching entry to obsidianmd/obsidian-releases:
{
"id": "daydav",
"name": "DayDAV",
"author": "haoenz",
"description": "在日记中以文字行创建和编辑日程,并通过 Full Calendar Remastered 与 CalDAV 双向同步。",
"repo": "haoenz/obsidian-daydav"
}
Privacy and network use
DayDAV itself does not make network requests. It asks Full Calendar Remastered to read or mutate the selected calendar through a scoped JavaScript API. See SECURITY.md.
License
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.