ICS RRULE Builder
Build an iCalendar RRULE string from frequency, interval, count or until, and BYDAY.
Overview
The ICS RRULE Builder constructs a recurrence-rule string in the format used by iCalendar (.ics) files, Google Calendar, Outlook, and most CalDAV servers. Pick a frequency (daily, weekly, monthly, yearly), an interval, a stop condition (count or until), and optional BYDAY weekday list — the tool emits a single RRULE: line you can paste into any RFC 5545 compliant calendar app.
Useful for developers building calendar integrations, ops teams scripting recurring incident drills, productivity tool authors generating subscribable .ics feeds, and anyone debugging why a Google Calendar event is firing on the wrong weekday.
How it works
The output follows RFC 5545 section 3.3.10, the iCalendar standard published by the IETF and supported by every major calendar app. The grammar is FREQ=<freq>;INTERVAL=n;[COUNT=n|UNTIL=date];[BYDAY=...], with FREQ as one of DAILY, WEEKLY, MONTHLY, or YEARLY, and BYDAY as a comma-separated list of two-letter weekday codes (MO, TU, WE, TH, FR, SA, SU).
UNTIL values are formatted as UTC timestamps with the Z suffix (e.g. 20271231T235959Z), which is the only form universally honoured across clients — local-time UNTILs are technically valid but interpreted inconsistently. The builder enforces "either COUNT or UNTIL, never both," matching the RFC.
Examples
Every Monday for 10 weeks
→ RRULE:FREQ=WEEKLY;BYDAY=MO;COUNT=10
First day of every quarter
→ RRULE:FREQ=MONTHLY;INTERVAL=3;BYMONTHDAY=1
Every weekday until end of year
→ RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;UNTIL=20261231T235959Z
Every 2 years on Feb 29 (or Feb 28 if not a leap year)
→ RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=2;BYMONTHDAY=29
FAQ
Why use UNTIL in UTC?
RFC 5545 says UNTIL must be in UTC unless the DTSTART is a floating value. Most clients reject local-time UNTILs or interpret them inconsistently, so UTC is the safe choice.
Can I combine BYDAY and BYMONTHDAY?
Yes, with care. FREQ=MONTHLY;BYDAY=MO;BYMONTHDAY=15 means "Monday the 15th of each month" — usually rare. Most builders stick to one or the other.
How is "last weekday of the month" expressed?
Use a negative ordinal in BYDAY: BYDAY=-1FR means the last Friday. 1MO means the first Monday, 2WE the second Wednesday, and so on.
Does it support exceptions like skipping July?
Standalone RRULE does not — for exceptions, add a separate EXDATE: line in the .ics body. RRULE only describes the positive recurrence pattern.
Will the output work in Google Calendar?
Yes — Google Calendar honours the full RFC 5545 RRULE grammar for imported events. Outlook accepts the same form but ignores some less-common BYxxx fields.