Free iCalendar Viewer
Open or paste an .ics file to see its events as an agenda, expand recurring ones, and check it before importing.
What is an iCalendar Viewer?
iCalendar is the standard file format for calendar data, saved as .ics and used by Google Calendar, Apple Calendar, Outlook and booking systems to share events. This viewer opens an .ics file, lists its events as an agenda, and checks it before you import or publish it.
It parses calendars with ical.js, registers any time zones the file defines, and expands recurring events to their first five occurrences. Times are shown exactly as the file writes them, with their zone, and the check finds what makes calendars import badly: missing UIDs, undefined time zones, events that end before they start and rules that contradict themselves.
Key Features
Agenda View
Every event, occurrence and to-do in date order, with location and repeat marks.
Recurring Events
RRULEs expanded to their next five dates, using the file’s own time zones.
Event Details
Start, end, zone, location, organiser, attendee count and the rule.
Import Check
UIDs, DTSTAMPs, time zones, impossible times and RRULE conflicts.
jCal Output
The calendar as JSON, ready for code that reads RFC 7265.
Perfect for everyone
- Event organisers
- Developers building calendar feeds
- Anyone checking an invite before adding it
How to Use the iCalendar Viewer
Open an .ics file from an email invite, a booking site or a calendar export, or paste its text. The agenda, event list, check and jCal all read the same file, so you can see what your calendar app will import.
Open the File
Choose an .ics file or paste text starting BEGIN:VCALENDAR.
Read the Agenda
See every event and occurrence in date order.
Check the Details
Confirm times, zones and repeat rules event by event.
Fix and Import
Fix problems in the file, then import or publish it.
Calendar Files, Opened and Checked
Each row is an .ics file of the kind calendar apps, booking sites and invites produce, from a team calendar to files with mistakes. Each answer is this tool’s agenda HTML, its event list or its check.
“BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Harbour Goods//Team Calendar//EN X-WR-CALNAME:Harbour Goods team BEGIN:VTIMEZONE TZID:Europe/London BEGIN:STANDARD DTSTART:19701025T020000 TZOFFSETFROM:+0100 TZOFFSETTO:+0000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU END:STANDARD BEGIN:DAYLIGHT DTSTART:19700329T010000 TZOFFSETFROM:+0000 TZOFFSETTO:+0100 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT UID:standup@harbourgoods.example DTSTAMP:20261020T120000Z DTSTART;TZID=Europe/London:20261102T093000 DTEND;TZID=Europe/London:20261102T094500 RRULE:FREQ=WEEKLY;BYDAY=MO,WE;COUNT=6 SUMMARY:Design stand-up LOCATION:Studio 2 END:VEVENT BEGIN:VEVENT UID:launch@harbourgoods.example DTSTAMP:20261020T120000Z DTSTART;VALUE=DATE:20261114 DTEND;VALUE=DATE:20261115 SUMMARY:Lantern launch day END:VEVENT BEGIN:VEVENT UID:review@harbourgoods.example DTSTAMP:20261020T120000Z DTSTART:20261105T140000Z DTEND:20261105T150000Z SUMMARY:Supplier review ORGANIZER:mailto:mira@harbourgoods.example ATTENDEE;CN=Ravi Shah:mailto:ravi@ferrystreetbakery.example ATTENDEE;CN=Wei Lin:mailto:w.lin@northern.example END:VEVENT BEGIN:VTODO UID:catalogue@harbourgoods.example DTSTAMP:20261020T120000Z DUE;VALUE=DATE:20261110 SUMMARY:Send winter catalogue to print END:VTODO END:VCALENDAR”
“BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Harbour Goods//Team Calendar//EN X-WR-CALNAME:Harbour Goods team BEGIN:VTIMEZONE TZID:Europe/London BEGIN:STANDARD DTSTART:19701025T020000 TZOFFSETFROM:+0100 TZOFFSETTO:+0000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU END:STANDARD BEGIN:DAYLIGHT DTSTART:19700329T010000 TZOFFSETFROM:+0000 TZOFFSETTO:+0100 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT UID:standup@harbourgoods.example DTSTAMP:20261020T120000Z DTSTART;TZID=Europe/London:20261102T093000 DTEND;TZID=Europe/London:20261102T094500 RRULE:FREQ=WEEKLY;BYDAY=MO,WE;COUNT=6 SUMMARY:Design stand-up LOCATION:Studio 2 END:VEVENT BEGIN:VEVENT UID:launch@harbourgoods.example DTSTAMP:20261020T120000Z DTSTART;VALUE=DATE:20261114 DTEND;VALUE=DATE:20261115 SUMMARY:Lantern launch day END:VEVENT BEGIN:VEVENT UID:review@harbourgoods.example DTSTAMP:20261020T120000Z DTSTART:20261105T140000Z DTEND:20261105T150000Z SUMMARY:Supplier review ORGANIZER:mailto:mira@harbourgoods.example ATTENDEE;CN=Ravi Shah:mailto:ravi@ferrystreetbakery.example ATTENDEE;CN=Wei Lin:mailto:w.lin@northern.example END:VEVENT BEGIN:VTODO UID:catalogue@harbourgoods.example DTSTAMP:20261020T120000Z DUE;VALUE=DATE:20261110 SUMMARY:Send winter catalogue to print END:VTODO END:VCALENDAR”
“BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Harbour Goods//Team Calendar//EN X-WR-CALNAME:Harbour Goods team BEGIN:VTIMEZONE TZID:Europe/London BEGIN:STANDARD DTSTART:19701025T020000 TZOFFSETFROM:+0100 TZOFFSETTO:+0000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU END:STANDARD BEGIN:DAYLIGHT DTSTART:19700329T010000 TZOFFSETFROM:+0000 TZOFFSETTO:+0100 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT UID:standup@harbourgoods.example DTSTAMP:20261020T120000Z DTSTART;TZID=Europe/London:20261102T093000 DTEND;TZID=Europe/London:20261102T094500 RRULE:FREQ=WEEKLY;BYDAY=MO,WE;COUNT=6 SUMMARY:Design stand-up LOCATION:Studio 2 END:VEVENT BEGIN:VEVENT UID:launch@harbourgoods.example DTSTAMP:20261020T120000Z DTSTART;VALUE=DATE:20261114 DTEND;VALUE=DATE:20261115 SUMMARY:Lantern launch day END:VEVENT BEGIN:VEVENT UID:review@harbourgoods.example DTSTAMP:20261020T120000Z DTSTART:20261105T140000Z DTEND:20261105T150000Z SUMMARY:Supplier review ORGANIZER:mailto:mira@harbourgoods.example ATTENDEE;CN=Ravi Shah:mailto:ravi@ferrystreetbakery.example ATTENDEE;CN=Wei Lin:mailto:w.lin@northern.example END:VEVENT BEGIN:VTODO UID:catalogue@harbourgoods.example DTSTAMP:20261020T120000Z DUE;VALUE=DATE:20261110 SUMMARY:Send winter catalogue to print END:VTODO END:VCALENDAR”
“BEGIN:VCALENDAR VERSION:2.0 BEGIN:VEVENT SUMMARY:Board meeting DTSTART;TZID=America/New_York:20261201T100000 DTEND;TZID=America/New_York:20261201T090000 RRULE:FREQ=MONTHLY;COUNT=3;UNTIL=20270301T000000Z END:VEVENT END:VCALENDAR”
“BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Example//EN BEGIN:VEVENT UID:yoga@example.com DTSTAMP:20261020T120000Z DTSTART:20261103T070000Z DURATION:PT1H RRULE:FREQ=DAILY;INTERVAL=2;COUNT=4 SUMMARY:Morning yoga END:VEVENT END:VCALENDAR”
“BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Example//EN BEGIN:VEVENT UID:rent@example.com DTSTAMP:20261020T120000Z DTSTART;VALUE=DATE:20261101 RRULE:FREQ=MONTHLY;BYMONTHDAY=1 SUMMARY:Pay rent END:VEVENT END:VCALENDAR”
“BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Example//EN BEGIN:VEVENT UID:a@example.com DTSTAMP:20261020T120000Z DTSTART:20261110T090000 SUMMARY:Floating time call END:VEVENT BEGIN:VEVENT UID:a@example.com DTSTAMP:20261020T120000Z DTSTART:20261111T090000 SUMMARY:Same UID again END:VEVENT END:VCALENDAR”
“BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Example//EN BEGIN:VTODO UID:tax@example.com DTSTAMP:20261020T120000Z DUE;VALUE=DATE:20270131 SUMMARY:File tax return END:VTODO END:VCALENDAR”
“BEGIN:VCARD VERSION:4.0 FN:Not a calendar END:VCARD”
“BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Example//EN BEGIN:VEVENT UID:offsite@example.com DTSTAMP:20261020T120000Z DTSTART;TZID=Europe/Berlin:20261120T090000 DTEND;TZID=Europe/Berlin:20261120T170000 SUMMARY:Team offsite LOCATION:Hamburg harbour ORGANIZER;CN=Mira:mailto:mira@harbourgoods.example ATTENDEE:mailto:ravi@ferrystreetbakery.example END:VEVENT END:VCALENDAR”
Common iCalendar Properties
An .ics file is a set of components such as VEVENT and VTODO, each a list of properties. These are the properties calendar apps rely on most, and what each one controls when the file is imported or synced.
UID
A unique, permanent identifier, so later updates replace the right event.
“What happens without a stable UID?”
DTSTAMP
When the event data was created, required in every event.
“Is DTSTAMP optional?”
DTSTART
The start, with a TZID, in UTC with Z, or as a date for all-day events.
“How is an all-day event written?”
DTEND
The end, which is exclusive: an all-day event ends the next day.
“When does a one-day event end?”
DURATION
A length such as PT1H, instead of DTEND.
“What does PT1H mean?”
RRULE
The repeat rule, such as FREQ=WEEKLY;BYDAY=MO,WE.
“Which part sets the days?”
SUMMARY
The event title.
“What does SUMMARY hold?”
LOCATION
Where the event happens, as text.
“Is LOCATION a map link?”
ORGANIZER
The organiser, usually as a mailto: address.
“What format does it use?”
ATTENDEE
One line per guest, with CN for their name.
“How are guests listed?”
How Times and Time Zones Work
Most calendar bugs are time-zone bugs. iCalendar has three ways to write a time, and each behaves differently when the file moves between apps and countries, so it pays to know which one a file is using.
UTC Times
A time ending in Z is the same instant everywhere and converts cleanly.
Zoned Times
A TZID ties the time to a place, so daylight saving is applied correctly.
Floating Times
No Z and no TZID means the same clock time wherever the reader is.
VTIMEZONE
A zoned file should include the zone’s definition; apps without it may guess.
All-Day Events
Dates without times aren’t shifted by zones at all.
Reading Repeat Rules
An RRULE packs a whole schedule into one line. Reading it is easier once you know its parts, and expanding it, as the event list does here, is the surest way to see which dates it really produces.
FREQ
How often it repeats: DAILY, WEEKLY, MONTHLY or YEARLY.
INTERVAL
INTERVAL=2 skips every other period, such as every two weeks.
BYDAY and BYMONTHDAY
Pick the weekdays or dates, such as MO,WE or the 1st.
COUNT or UNTIL
End after a number of times or on a date, never both.
Exceptions
EXDATE removes single dates, and a RECURRENCE-ID event changes one.
When to Use an iCalendar Viewer
Whenever an .ics file needs checking before it lands in someone’s calendar, or you are building software that writes calendar feeds.
Email Invites
Open an attached invite to see its time and zone first.
Calendar Feeds
Check a booking or class schedule feed before publishing.
Migrations
Inspect an export before moving to another calendar app.
Debugging Sync
Find the duplicate UID or zone behind a sync problem.
Building Apps
Check the .ics your code generates against the standard.
iCalendar Pitfalls
Mistakes that make events appear at the wrong time, twice, or not at all once a calendar app imports the file.
Changing UIDs
A new UID on every export makes apps add duplicates instead of updating.
Missing VTIMEZONE
Zoned times without a definition may shift by an hour or more.
Inclusive All-Day Ends
Ending a one-day event on the same date makes it zero days long.
COUNT and UNTIL Together
The standard forbids both, and apps disagree on which wins.
Floating Times by Accident
Leaving off Z or TZID makes times move with the reader.
Long Lines
Lines over 75 octets must be folded with a leading space.