RRULE explained: recurring calendar events in plain English

6 min read

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=DAILY is every day
  • FREQ=WEEKLY is every week
  • FREQ=MONTHLY is every month
  • FREQ=YEARLY is 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=2 is every other week
  • FREQ=MONTHLY;INTERVAL=3 is every quarter
  • FREQ=DAILY;INTERVAL=14 is 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,TH is every Tuesday and Thursday
  • FREQ=WEEKLY;BYDAY=MO,WE,FR is 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=1MO is the first Monday of every month
  • FREQ=MONTHLY;BYDAY=-1FR is 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=20260731T000000Z stops on July 31, 2026
  • COUNT=10 stops 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.

Try the RRULE builder.

Questions

Or skip reading. Try it.

Type a schedule. Calfeed builds the calendar.