Recurring events are the reason calendar files are not just lists of dates. A weekly piano lesson is not 40 separate events. It is one event with a rule that says "repeat every week on Mondays at 4 PM until June."
That rule lives on one line in a calendar file. The line is called an RRULE. Reading one is harder than writing one. Here is the whole grammar.
The shape of an RRULE
A simple recurring rule looks like this.
RRULE:FREQ=WEEKLY;BYDAY=MO;UNTIL=20260601T000000Z
Three parts. Each part is a key, an equal sign, and a value. Parts are separated by semicolons.
Read it left to right. FREQ is "how often". BYDAY is "which days of the week". UNTIL is "when to stop". That rule says "every week, on Mondays, until June 1, 2026."
FREQ
FREQ is the only required field. It controls the unit of recurrence.
FREQ=DAILYis every dayFREQ=WEEKLYis every weekFREQ=MONTHLYis every monthFREQ=YEARLYis every year
Most schedules are WEEKLY. A weekly class, a weekly meeting, a weekly practice. The other three are less common but work the same way.
INTERVAL
INTERVAL controls "how many of the unit". The default is 1.
FREQ=WEEKLY;INTERVAL=2is every other weekFREQ=MONTHLY;INTERVAL=3is every quarterFREQ=DAILY;INTERVAL=14is every two weeks expressed as days
Drop INTERVAL if it is 1.
BYDAY
BYDAY pins the recurrence to specific weekdays. Days are two-letter codes.
MO TU WE TH FR SA SU
A typical weekly schedule uses BYDAY with two or three days.
FREQ=WEEKLY;BYDAY=TU,THis every Tuesday and ThursdayFREQ=WEEKLY;BYDAY=MO,WE,FRis Mondays, Wednesdays, Fridays
For monthly rules, BYDAY can include a position. 1MO is "first Monday of the month". -1FR is "last Friday".
FREQ=MONTHLY;BYDAY=1MOis the first Monday of every monthFREQ=MONTHLY;BYDAY=-1FRis the last Friday of every month
UNTIL and COUNT
UNTIL is "stop on this date". COUNT is "stop after this many events". You use one or the other, not both.
UNTIL=20260731T000000Zstops on July 31, 2026COUNT=10stops after 10 occurrences
UNTIL uses the iCalendar timestamp format. Year, month, day, "T", hours, minutes, seconds, "Z" for UTC. The "Z" is what trips people up. Calendar apps convert it back to local time.
If you skip both UNTIL and COUNT, the rule repeats forever. Avoid that. Audiences with forever-events in their calendar do not love it.
EXDATE
EXDATE is "skip this specific date". It lives on a separate line, not inside the RRULE.
RRULE:FREQ=WEEKLY;BYDAY=TU,TH;UNTIL=20260731T000000Z
EXDATE:20260630T120000Z,20260702T120000Z
This is the "every Tuesday and Thursday except the week of July 4" pattern. You write the rule once, then list the exceptions.
What Calfeed does for you
Calfeed reads sentences like "every Tuesday and Thursday from 11:45 to 12:45, June 9 through July 31, except the week of July 4" and writes the rule above. You stay in plain English. The compiled RRULE lives in the calendar file Calfeed publishes.
If you edit the rule later (move the end date, add a day, skip a different week), Calfeed rewrites the RRULE for you. You never type the syntax.
Read this once and you will understand what is in your calendar file. You do not need to write it.