— Developer Tools

Free iCalendar Viewer

Open or paste an .ics file to see its events as an agenda, expand recurring ones, and check it before importing.

— Samples
Items 4Problems 0Valid
Live

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.

1

Open the File

Choose an .ics file or paste text starting BEGIN:VCALENDAR.

2

Read the Agenda

See every event and occurrence in date order.

3

Check the Details

Confirm times, zones and repeat rules event by event.

4

Fix and Import

Fix problems in the file, then import or publish it.

Worked Examples

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.

REF_001A team calendar as an agenda

“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”

REF_002The same calendar, event by event

“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”

REF_003The same calendar, checked

“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”

REF_004An event with six problems

“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”

REF_005Every other day, four times

“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”

REF_006Monthly with no end, as an agenda

“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”

REF_007Floating times and a duplicate UID

“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”

REF_008A to-do with a due date

“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”

REF_009A contact file by mistake

“BEGIN:VCARD VERSION:4.0 FN:Not a calendar END:VCARD”

REF_010A zone with no VTIMEZONE, checked

“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”

Property Reference

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.

01 / UID

UID

A unique, permanent identifier, so later updates replace the right event.

“What happens without a stable UID?”

02 / DTSTAMP

DTSTAMP

When the event data was created, required in every event.

“Is DTSTAMP optional?”

03 / DTSTART

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?”

04 / DTEND

DTEND

The end, which is exclusive: an all-day event ends the next day.

“When does a one-day event end?”

05 / DURATION

DURATION

A length such as PT1H, instead of DTEND.

“What does PT1H mean?”

06 / RRULE

RRULE

The repeat rule, such as FREQ=WEEKLY;BYDAY=MO,WE.

“Which part sets the days?”

07 / SUMMARY

SUMMARY

The event title.

“What does SUMMARY hold?”

08 / LOCATION

LOCATION

Where the event happens, as text.

“Is LOCATION a map link?”

09 / ORGANIZER

ORGANIZER

The organiser, usually as a mailto: address.

“What format does it use?”

10 / ATTENDEE

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.

Tip 01

FREQ

How often it repeats: DAILY, WEEKLY, MONTHLY or YEARLY.

Tip 02

INTERVAL

INTERVAL=2 skips every other period, such as every two weeks.

Tip 03

BYDAY and BYMONTHDAY

Pick the weekdays or dates, such as MO,WE or the 1st.

Tip 04

COUNT or UNTIL

End after a number of times or on a date, never both.

Tip 05

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.

Tip 01

Changing UIDs

A new UID on every export makes apps add duplicates instead of updating.

Tip 02

Missing VTIMEZONE

Zoned times without a definition may shift by an hour or more.

Tip 03

Inclusive All-Day Ends

Ending a one-day event on the same date makes it zero days long.

Tip 04

COUNT and UNTIL Together

The standard forbids both, and apps disagree on which wins.

Tip 05

Floating Times by Accident

Leaving off Z or TZID makes times move with the reader.

Tip 06

Long Lines

Lines over 75 octets must be folded with a leading space.

Frequently Asked Questions