caldav-cli

Verified·Scanned 2/17/2026

Provides a CLI to manage CalDAV calendars (iCloud, Google, Yandex) with account and event commands. Stores OAuth refresh tokens in the OS keychain and saves OAuth2 client credentials in ~/.config/caldav-cli/config.json, and uses endpoints like https://apidata.googleusercontent.com/caldav/v2.

from clawhub.ai·veb86917·5.0 KB·0 installs
Scanned from 0.1.3 at eb86917 · Transparency log ↗
$ vett add clawhub.ai/cyberash-dev/caldav-cli

caldav-cli

A CalDAV CLI client. Manages multiple accounts with secure OS keychain storage. Supports iCloud, Google (OAuth2), Yandex, Fastmail, Nextcloud, Baikal, and any custom CalDAV server.

Installation

Requires Node.js >= 18.

npm install -g caldav-cli

After installation the caldav-cli command is available globally.

Quick Start

caldav-cli account add          # Interactive wizard: pick provider, enter credentials
caldav-cli events list          # Show events for the next 7 days
caldav-cli events create        # Interactive wizard: create a new event

Account Management

Add account (interactive wizard — prompts for provider, credentials, tests connection):

caldav-cli account add

List configured accounts:

caldav-cli account list

Remove an account:

caldav-cli account remove <name>

View Events

caldav-cli events list                           # Next 7 days (default)
caldav-cli events list --from 2026-02-10 --to 2026-02-20
caldav-cli events list -a work                   # Specific account
caldav-cli events list -c "Team Calendar"        # Filter by calendar name
caldav-cli events list -a work -c Personal --from 2026-03-01 --to 2026-03-31

JSON output (for scripting):

caldav-cli events list --json
caldav-cli events list --json --from 2026-02-10 --to 2026-02-20

Create Events

Interactive wizard (prompts for all fields):

caldav-cli events create

Non-interactive (all options via flags):

caldav-cli events create \
  --title "Team standup" \
  --start "2026-02-10T10:00" \
  --end "2026-02-10T10:30" \
  --account work \
  --calendar "Team Calendar" \
  --description "Daily sync" \
  --location "Room 42"

Partial flags (wizard prompts for the rest):

caldav-cli events create --title "Lunch" --account work

JSON output after creation:

caldav-cli events create --json --title "Event" --start "2026-02-10T10:00" --end "2026-02-10T11:00"

Supported Providers

ProviderAuthServer URL
Apple iCloudBasic (app-specific password)https://caldav.icloud.com
Google CalendarOAuth2 (Client ID + Secret)https://apidata.googleusercontent.com/caldav/v2
Yandex CalendarBasic (app password)https://caldav.yandex.ru
FastmailBasic (app password)https://caldav.fastmail.com/dav/calendars
NextcloudBasicUser provides URL
BaikalBasicUser provides URL
CustomBasicUser provides URL

Google Calendar Setup

Google requires OAuth2. Before running caldav-cli account add:

  1. Go to https://console.cloud.google.com/
  2. Create a project, enable CalDAV API
  3. Create OAuth client ID (Desktop app type)
  4. Note the Client ID and Client Secret

The wizard will ask for these, then open a browser for authorization. The refresh token is stored securely in the OS keychain.

Data Storage

  • Passwords and OAuth2 refresh tokens: OS keychain (macOS Keychain, Linux libsecret, Windows Credential Vault) via @napi-rs/keyring. Never written to disk in plaintext.
  • Account metadata (name, provider ID, username, server URL): ~/.config/caldav-cli/config.json
  • OAuth2 client credentials (Client ID, Client Secret, Token URL): also stored in ~/.config/caldav-cli/config.json in plaintext. These are per-user credentials that the user creates themselves in Google Cloud Console. They are not bearer tokens and cannot access data without the refresh token (which is in the keychain).

Protect ~/.config/caldav-cli/config.json with appropriate file permissions if you store OAuth2 client credentials.

Flag Reference

events list

FlagShortDescriptionDefault
--account <name>-aAccount namedefault account
--from <date>Start date (YYYY-MM-DD)today
--to <date>End date (YYYY-MM-DD)today + 7 days
--calendar <name>-cFilter by calendar nameall calendars
--jsonOutput as JSONfalse

events create

FlagShortDescription
--title <title>-tEvent title
--start <datetime>-sStart (YYYY-MM-DDTHH:mm)
--end <datetime>-eEnd (YYYY-MM-DDTHH:mm)
--account <name>-aAccount name
--calendar <name>-cCalendar name
--description <text>-dEvent description
--location <text>-lEvent location
--jsonOutput as JSON

All events create flags are optional. Omitted values trigger interactive prompts.