Commands

Complete reference for every cal command, flag, and option.

Overview

cal provides commands for managing macOS Calendar events and calendars. Every command that displays data supports --output (-o) with table, json, or plain formats.

CommandDescription
cal calendarsList all calendars
cal calendars create [title]Create a new calendar
cal calendars update [name]Update a calendar (rename, recolor)
cal calendars delete [name]Delete a calendar and all its events
cal listList events in a date range
cal todayToday’s events
cal upcomingEvents in next N days
cal show [# or id]Show event details
cal add [title]Create an event
cal update [# or id]Update an event
cal delete [# or id]Delete an event
cal search [query]Search events
cal exportExport events (JSON/CSV/ICS)
cal import [file]Import events (JSON/CSV)
cal versionShow version info
cal completionGenerate shell completions

Global Flags

These flags are available on all commands:

FlagShortDefaultDescription
--output-otableOutput format: table, json, plain
--no-colorfalseDisable color output (also respects NO_COLOR)

cal calendars

Manage calendars. Running without a subcommand lists all calendars.

cal calendars
cal cals
cal calendars -o json

Displays the calendar name, source (iCloud, Google, etc.), type, color, and read-only status. Useful for finding the exact calendar name to pass to -c and discovering available sources for creating new calendars.


cal calendars create

Create a new calendar. Requires --source to specify the account.

# Create with flags
cal calendars create "Projects" --source iCloud --color "#FF6961"

# Interactive mode
cal calendars create -i

Flags

FlagShortDescription
--title-TCalendar title
--source-sAccount source — required (e.g., “iCloud”)
--colorCalendar color (hex, e.g., “#FF6961”)
--interactive-iInteractive mode with guided prompts

Run cal calendars to see available sources from existing calendars.


cal calendars update

Update an existing calendar (rename or recolor).

# Update by name
cal calendars update "Projects" --title "Archived" --color "#8295AF"

# Interactive mode (guided form)
cal calendars update "Projects" -i

# Interactive picker (no argument)
cal calendars update -i

Flags

FlagShortDescription
--title-TNew calendar title
--colorNew calendar color (hex, e.g., “#42D692”)
--interactive-iInteractive mode with guided prompts

Subscribed and birthday calendars cannot be updated (immutable).


cal calendars delete

Permanently delete a calendar and all its events.

# Delete by name (with confirmation)
cal calendars delete "Projects"

# Skip confirmation
cal calendars delete "Projects" --force

# Interactive picker (no argument)
cal calendars delete

Flags

FlagShortDescription
--force-fSkip confirmation prompt

Subscribed and birthday calendars cannot be deleted (immutable).


cal list

List events within a date range.

cal list -f "next monday" -t "next friday"
cal list -f today -t "in 7 days" -c Work

Flags

FlagShortDescription
--from-fStart date (natural language)
--to-tEnd date (natural language)
--calendar-cFilter by calendar name
--exclude-calendarExclude calendar (repeatable)
--limit-nMaximum number of results
--sortSort by: title, time, calendar

Events are displayed with row numbers (#1, #2, …) that can be used with show, update, and delete. The row mapping is cached to ~/.cal-last-list so subsequent commands can reference events by number.

# List, then act on event #2
cal list -f today -t "next friday"
cal show 2

cal today

Show today’s events. A convenience shortcut for cal list -f today -t today.

cal today
cal today -c Work
cal today -o json

Flags

FlagShortDescription
--calendar-cFilter by calendar name
--exclude-calendarExclude calendar (repeatable)

cal upcoming

Show events for the next N days (default: 7).

cal upcoming
cal upcoming -d 30
cal upcoming -d 14 -c Work --exclude-calendar Birthdays

Flags

FlagShortDefaultDescription
--days-d7Number of days to look ahead
--calendar-cFilter by calendar name
--exclude-calendarExclude calendar (repeatable)
--limit-nMaximum number of results
--sortSort by: title, time, calendar

cal show

Display detailed information about a single event.

# Interactive picker (no argument)
cal show

# By row number from last listing
cal show 2

# By event ID
cal show 577B8983-DF44-4665-B0F9-ABCD1234

Event Selection

Events can be selected three ways:

  1. Interactive picker — Run with no argument to get a searchable list
  2. Row number — Use #N from the last list, today, or upcoming output
  3. Event ID — Pass a full or partial eventIdentifier (for scripting)

The show command displays title, calendar, start/end times, location, notes, alerts, recurrence rules, URL, and attendees.


cal add

Create a new calendar event.

# With flags
cal add "Team Standup" -s "tomorrow 9am" -e "tomorrow 9:30am" -c Work

# Interactive guided form
cal add -i

Flags

FlagShortDescription
--start-sStart time (natural language)
--end-eEnd time (natural language)
--calendar-cCalendar to add to
--location-lEvent location
--all-dayCreate an all-day event
--alertAdd alert before event (repeatable)
--timezoneTimezone (e.g., America/New_York)
--repeatRecurrence: daily, weekly, monthly, yearly
--repeat-daysDays for weekly recurrence (repeatable)
--repeat-untilRecurrence end date
--interactive-iUse guided interactive form

Examples

# All-day event
cal add "Company Holiday" -s 2026-03-15 --all-day -c Work

# With location and multiple alerts
cal add "Dinner" -s "friday 7pm" -e "friday 9pm" \
  -l "The Restaurant, 123 Main St" --alert 1h --alert 15m

# Weekly recurring event
cal add "Weekly Sync" -s "next monday 10am" -e "next monday 11am" \
  --repeat weekly --repeat-days mon -c Work

# Recurring with end date
cal add "Daily Standup" -s "tomorrow 9am" -e "tomorrow 9:15am" \
  --repeat daily --repeat-until "2026-12-31" -c Work

# With timezone
cal add "NYC Meeting" -s "tomorrow 2pm" -e "tomorrow 3pm" \
  --timezone "America/New_York" -c Work

Interactive Mode

The -i flag launches a guided form where you fill in each field step by step. The form uses the Catppuccin theme and supports calendar selection from a dropdown.


cal update

Update an existing event.

# Interactive picker + guided form
cal update -i

# Update by row number
cal update 2 --title "New Title"

# Reschedule
cal update 3 -s "tomorrow 2pm" -e "tomorrow 3pm"

# Update future occurrences of recurring event
cal update 1 --span future --title "New Series Name"

Flags

FlagShortDescription
--titleNew title
--start-sNew start time (natural language)
--end-eNew end time (natural language)
--calendar-cMove to different calendar
--location-lNew location
--all-dayToggle all-day status
--alertReplace alerts (repeatable)
--timezoneNew timezone
--repeatNew recurrence pattern
--repeat-daysNew recurrence days
--repeat-untilNew recurrence end date
--spanApply to: this or future occurrences
--interactive-iUse guided interactive form

cal delete

Delete an event with a confirmation prompt.

# Interactive picker with confirmation
cal delete

# Delete by row number
cal delete 3

# Skip confirmation
cal delete 3 -f

# Delete future occurrences of recurring event
cal delete 2 --span future

Flags

FlagShortDescription
--force-fSkip confirmation prompt
--spanApply to: this or future occurrences

Search events by title and description.

cal search "standup"
cal search "meeting" -c Work -f "1 month ago" -t "in 1 month"

Flags

FlagShortDescription
--from-fStart date (natural language)
--to-tEnd date (natural language)
--calendar-cFilter by calendar name
--exclude-calendarExclude calendar (repeatable)
--limit-nMaximum number of results
--sortSort by: title, time, calendar

cal export

Export events to a file or stdout.

# Export to JSON
cal export -f 2026-01-01 -t 2026-12-31 --format json > events.json

# Export to CSV
cal export -c Work --format csv --output-file work-events.csv

# Export to ICS (RFC 5545)
cal export --format ics --output-file calendar.ics

Flags

FlagShortDefaultDescription
--formatjsonExport format: json, csv, ics
--from-fStart date filter
--to-tEnd date filter
--calendar-cFilter by calendar
--output-fileSave to file (default: stdout)

Formats

  • JSON: Full event data including IDs, timestamps, recurrence rules
  • CSV: Tabular format suitable for spreadsheets
  • ICS: RFC 5545 iCalendar format, compatible with any calendar app

cal import

Import events from a JSON or CSV file.

cal import events.json
cal import events.csv -c Personal
cal import events.json --dry-run

Flags

FlagShortDescription
--calendar-cTarget calendar for imported events
--dry-runPreview import without creating events

The format is auto-detected from the file extension (.json or .csv).


cal version

Display the installed version of cal.

cal version

cal completion

Generate shell completion scripts.

# Bash
cal completion bash > /usr/local/etc/bash_completion.d/cal

# Zsh
cal completion zsh > "${fpath[1]}/_cal"

# Fish
cal completion fish > ~/.config/fish/completions/cal.fish

After generating, restart your shell or source the completion file to activate.