A recurring event is one YAML file plus an RFC 5545 RRULE. Reads (agenda, next, list --expand) expand occurrences. The file stays one definition.

Helpers

calkit add --title "Standup" --scope business \
  --start 2026-08-24T09:00 --end 2026-08-24T09:15 \
  --repeat weekly --byday MO,WE --json
FlagMeaning
--repeatdaily | weekly | monthly | yearly | hourly
--intervalEvery N periods
--bydaye.g. MO,WE
--countHow many occurrences
--untilInclusive end date
--until is a plain date; the whole day is included.

Raw RRULE

calkit add --title "On-call" --start 2026-08-24T09:00 --end 2026-08-24T09:30 \
  --rrule "FREQ=WEEKLY;BYDAY=MO,WE;INTERVAL=1" --json
Use raw RRULE when helpers cannot express the rule (different weekdays at different hours, BYSETPOS, etc.). Do not mix --rrule with --repeat on the same add. Exclude specific dates via exdates in the event YAML (or re-import). Prefer edit / import over hand-editing unless you know the schema (calkit schema --event --json).