Calendar tool
Turn a repeat pattern into a readable schedule, the next occurrence dates, and an ICS calendar file that uses a real RRULE.
Every week on Monday at 4:00 AM UTC
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//timekit//Recurring Event Generator//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Team planning
X-WR-CALDESC:Every week on Monday at 4:00 AM UTC
BEGIN:VTIMEZONE
TZID:UTC
END:VTIMEZONE
BEGIN:VEVENT
UID:recurring-20260805T040000000Z@timekit
DTSTAMP:20260804T043118Z
DTSTART:20260805T040000Z
DTEND:20260805T043000Z
SUMMARY:Team planning
DESCRIPTION:Every week on Monday at 4:00 AM UTC
RRULE:FREQ=WEEKLY;BYDAY=MO
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
Calendar recurrence rules are compact, but they are not friendly to write by hand. This generator keeps the controls close to the way people describe a schedule: every week, every other Tuesday and Thursday, on the first day of the month, or once a year on the same date. The output is a normal VCALENDAR file, so you can download it and import it into calendar apps that understand ICS recurrence.
Use the timezone selector for the place where the event happens, then check the next ten dates before copying the file. That preview catches common mistakes like choosing Friday instead of Thursday or ending after too few occurrences. The share URL stores only the visible choices in the query string, which makes it practical to send a draft to a teammate before publishing a company calendar, class series, workout plan, or recurring reminder.
For one-off dates, use the countdown maker. For comparing meeting times across cities, use the meeting scheduler.
Each combination of controls maps to one line in the exported file. A few concrete pairings show the shape of the syntax:
| You choose | The file carries |
|---|---|
| Every week on Monday | RRULE:FREQ=WEEKLY;BYDAY=MO |
| Every other week on Tuesday and Thursday | RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,TH |
| Monthly on day 15 | RRULE:FREQ=MONTHLY;BYMONTHDAY=15 |
| Yearly on 15 March | RRULE:FREQ=YEARLY;BYMONTHDAY=15;BYMONTH=3 |
| Daily, 30 occurrences | RRULE:FREQ=DAILY;COUNT=30 |
Two details keep the output predictable: INTERVAL only appears when it is greater than one, and weekday lists are always written in Monday-first order regardless of the order you clicked them. Reading the generated line against this table is a quick way to learn the notation well enough to sanity-check any calendar file.
A monthly rule pinned to day 29, 30, or 31 skips the months that lack that date, so a day-31 event fires only seven times a year. An every-other-week rule counts its two-week blocks from the start date, which means moving the first occurrence by a week silently moves the entire future schedule. And because occurrences are computed as local wall times in the chosen IANA timezone, a weekly 09:00 event stays at 09:00 through daylight saving changes while its UTC instant moves by an hour. All three of these surprises are visible in the preview before anything reaches a calendar, which is the reason it lists real dates instead of restating the rule. The tool caps the count field at 366 occurrences and the interval at 12, wide enough for anything from daily standups to a biennial review.