CalDAV CLI tool. Full CRUD for calendar events. Works with any CalDAV server — tested primarily against iCloud.
"DAV it" — just do it.
- Deno 2
- CalDAV server credentials (for iCloud: app-specific password from appleid.apple.com)
deno task install # → ~/.deno/bin/davitConfig file at ~/.config/davit/config.toml. Safe to track in dotfiles —
passwords are resolved from environment variables, never stored in the file.
default_server = "icloud"
default_calendar = "iCloud"
[servers.icloud]
url = "https://caldav.icloud.com"
username = "your@apple-id.com"
# Password resolved from DAVIT_ICLOUD_PASSWORD env varPasswords are resolved per server in this order:
DAVIT_{SERVER_NAME}_PASSWORDenv var (e.g.DAVIT_ICLOUD_PASSWORD)passwordfield in config (not recommended — use env vars)- Error
Set the env var in your shell profile or ~/.env:
export DAVIT_ICLOUD_PASSWORD="your-app-specific-password"default_server = "icloud"
[servers.icloud]
url = "https://caldav.icloud.com"
username = "your@apple-id.com"
[servers.fastmail]
url = "https://caldav.fastmail.com/dav/calendars"
username = "your@fastmail.com"If no config file exists, davit falls back to these env vars:
export CALDAV_BASE_URL="https://caldav.icloud.com"
export CALDAV_USERNAME="your@apple-id.com"
export CALDAV_PASSWORD="your-app-specific-password"# Calendars
davit calendar list
# List events (natural language or ISO 8601)
davit event list --from today --to "next friday"
davit event list --from "2026-03-17T00:00:00Z" --to "2026-03-23T23:59:59Z"
davit event list --calendar iCloud --format json
# Show event details
davit event show <uid> --calendar iCloud
# Create (natural language dates)
davit event create "Meeting" \
--start "tomorrow at 4pm" --end "tomorrow at 4:30pm" \
--desc "Notes" --location "Room 42" --url "https://meet.google.com/abc" \
--calendar iCloud
# Update
davit event update <uid> --title "New Title" --desc "Updated" --location "New Room"
# Delete
davit event delete <uid> --calendar iCloudAll commands support --format json|table (default: table). show, update,
delete accept --calendar <name> to narrow the search.
deno task dev # Run in dev mode
deno task test # Unit tests
deno task test:integration # Integration tests (requires credentials)
deno task checks # fmt + lint + check + test
deno task compile # Build standalone binary → dist/davit
deno task install # Install globally → ~/.deno/bin/davitPre-commit hook enforces: fmt --check → lint → check → test.
deno task setup-git-hooks # Activate hooks after cloning