install
source · Clone the upstream repo
git clone https://github.com/ComeOnOliver/skillshub
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/LeoYeAI/openclaw-master-skills/caldav-calendar" ~/.claude/skills/comeonoliver-skillshub-caldav-calendar && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/LeoYeAI/openclaw-master-skills/caldav-calendar" ~/.openclaw/skills/comeonoliver-skillshub-caldav-calendar && rm -rf "$T"
manifest:
skills/LeoYeAI/openclaw-master-skills/caldav-calendar/SKILL.mdsource content
CalDAV Calendar (vdirsyncer + khal)
vdirsyncer syncs CalDAV calendars to local
.ics files. khal reads and writes them.
Sync First
Always sync before querying or after making changes:
vdirsyncer sync
View Events
khal list # Today khal list today 7d # Next 7 days khal list tomorrow # Tomorrow khal list 2026-01-15 2026-01-20 # Date range khal list -a Work today # Specific calendar
Search
khal search "meeting" khal search "dentist" --format "{start-date} {title}"
Create Events
khal new 2026-01-15 10:00 11:00 "Meeting title" khal new 2026-01-15 "All day event" khal new tomorrow 14:00 15:30 "Call" -a Work khal new 2026-01-15 10:00 11:00 "With notes" :: Description goes here
After creating, sync to push changes:
vdirsyncer sync
Edit Events (interactive)
khal edit is interactive — requires a TTY. Use tmux if automating:
khal edit "search term" khal edit -a CalendarName "search term" khal edit --show-past "old event"
Menu options:
→ edit summarys
→ edit descriptiond
→ edit datetime ranget
→ edit locationl
→ delete eventD
→ skip (save changes, next match)n
→ quitq
After editing, sync:
vdirsyncer sync
Delete Events
Use
khal edit, then press D to delete.
Output Formats
For scripting:
khal list --format "{start-date} {start-time}-{end-time} {title}" today 7d khal list --format "{uid} | {title} | {calendar}" today
Placeholders:
{title}, {description}, {start}, {end}, {start-date}, {start-time}, {end-date}, {end-time}, {location}, {calendar}, {uid}
Caching
khal caches events in
~/.local/share/khal/khal.db. If data looks stale after syncing:
rm ~/.local/share/khal/khal.db
Initial Setup
1. Configure vdirsyncer (~/.config/vdirsyncer/config
)
~/.config/vdirsyncer/configExample for iCloud:
[general] status_path = "~/.local/share/vdirsyncer/status/" [pair icloud_calendar] a = "icloud_remote" b = "icloud_local" collections = ["from a", "from b"] conflict_resolution = "a wins" [storage icloud_remote] type = "caldav" url = "https://caldav.icloud.com/" username = "your@icloud.com" password.fetch = ["command", "cat", "~/.config/vdirsyncer/icloud_password"] [storage icloud_local] type = "filesystem" path = "~/.local/share/vdirsyncer/calendars/" fileext = ".ics"
Provider URLs:
- iCloud:
https://caldav.icloud.com/ - Google: Use
storage typegoogle_calendar - Fastmail:
https://caldav.fastmail.com/dav/calendars/user/EMAIL/ - Nextcloud:
https://YOUR.CLOUD/remote.php/dav/calendars/USERNAME/
2. Configure khal (~/.config/khal/config
)
~/.config/khal/config[calendars] [[my_calendars]] path = ~/.local/share/vdirsyncer/calendars/* type = discover [default] default_calendar = Home highlight_event_days = True [locale] timeformat = %H:%M dateformat = %Y-%m-%d
3. Discover and sync
vdirsyncer discover # First time only vdirsyncer sync