This tool expands an iCalendar RRULE — the recurrence rule that powers repeating events in .ics calendar files — into the actual list of dates it produces. Paste a rule and a start date, choose how far ahead to look, and see every occurrence, which is invaluable when debugging a calendar feed or confirming exactly when a “second Tuesday of the month” meeting falls.
How it works
An RRULE is a set of KEY=VALUE pairs separated by semicolons, governed by RFC 5545. Expansion works period by period:
- FREQ sets the base cadence — daily, weekly, monthly or yearly — and INTERVAL skips periods (e.g.
INTERVAL=2withFREQ=WEEKLYis every other week). - Within each period, the BY parts select candidate dates.
BYDAYchooses weekdays, optionally with an ordinal:2MOis the second Monday,-1FRis the last Friday.BYMONTHDAYselects days of the month (negative counts from the end), andBYMONTHrestricts yearly rules to specific months. - BYSETPOS then picks particular positions out of that candidate set —
BYSETPOS=-1keeps only the last matching day in the period, which is how “last working day of the month” rules are written. - The walk stops when it reaches COUNT occurrences, passes the UNTIL date, or hits your expansion cutoff, whichever comes first.
WKST defines which weekday a week starts on, which affects how weekly intervals are aligned.
Example
The rule FREQ=MONTHLY;BYDAY=2TU with a DTSTART in January produces the second Tuesday of every month. Change it to FREQ=WEEKLY;BYDAY=MO,WE,FR;INTERVAL=1 and you get every Monday, Wednesday and Friday. Add ;COUNT=10 and only the first ten of those occurrences are returned.
Tips
- Always provide a realistic cutoff date. Open-ended rules (no
COUNTorUNTIL) are infinite, so the cutoff and the max-results cap are what keep the expansion finite. - Date formats accepted are the iCalendar
YYYYMMDDandYYYYMMDDTHHMMSSZforms as well as plain ISO dates like2026-12-31. - If you expect occurrences but see none, check that your
DTSTARTweekday is consistent withBYDAY— a weekly rule only emits the weekdays you list, and aDTSTARTthat does not match any of them simply produces nothing until the next listed day.