1. Your calendar file
An .ics export from any calendar, a booking system, an events plugin or a script.
Choose a file or paste the text, then click Check calendar.
Result
Fixed file
The rules, and what they leave out
- Required: VCALENDAR with VERSION:2.0 and PRODID; every VEVENT with UID, DTSTAMP and DTSTART (unless it is a scheduling message with METHOD).
- Times: dates must be real (no 30 February), DTEND not before DTSTART, DTSTART and DTEND the same type, never both DTEND and DURATION. For all-day events DTEND is the day after the last day.
- Recurrence: FREQ required, COUNT and UNTIL not together, UNTIL the same type as DTSTART and in UTC when DTSTART has a time zone.
- Time zones: a TZID with no VTIMEZONE is warned about. Floating times (no Z, no TZID) are noted, not condemned.
- Fixed automatically: missing VERSION and PRODID, a stable UID and a DTSTAMP for events without them, a zero-length all-day DTEND, lines refolded at 75 octets, CRLF line endings.
- Never guessed: which of two clashing end times is right, VTIMEZONE rules, which duplicate UID to keep.
- Not checked: whether a given app will accept the file, scheduling (iTIP) methods, attachments, alarms in detail. Read from memory of RFC 5545; confirm against the current standard.
Common questions
Why does my .ics file fail to import into Google Calendar or Outlook?
The usual causes are a missing UID, DTSTAMP, VERSION or PRODID, an event that ends before it starts, a recurrence rule with both COUNT and UNTIL, a time zone named without its VTIMEZONE definition, or a file whose lines were broken without the leading space that marks a continuation. This tool reports each one with its line number.
What does a TZID without a VTIMEZONE do?
The file says the time is in, for example, America/New_York but does not define that zone. Some apps know the name already; others, Outlook in particular, are commonly reported to show the event at the wrong hour. Writing times in UTC (ending in Z) or including the VTIMEZONE block avoids the question. The tool warns about it but does not invent transition rules.
Why is my all-day event not showing or one day short?
For all-day events (VALUE=DATE) the end date is exclusive: a one-day event on 10 February has DTEND of 11 February. A DTEND equal to DTSTART means zero length. The tool moves it forward one day when you apply the fixes.
What does the fixed file change?
Only things it can prove: adds VERSION and PRODID when missing, adds a stable UID and a DTSTAMP to events that lack them, moves a zero-length all-day DTEND forward a day, refolds lines to 75 octets and writes CRLF line endings. Everything else is left exactly as it was and listed as a finding.
Is my calendar uploaded anywhere?
No. The page reads the file in your browser and a test in the code asserts there are no network calls.
What does this not check?
Whether a particular app will accept the file, free/busy and scheduling methods (iTIP), attachments, alarms in detail, or the correctness of VTIMEZONE rules. It reads the standard calendar and event properties.