Parses a calendar into JSON — one object per event, with attendees as an array and dates as ISO 8601 strings. For anything that needs to read a calendar programmatically without pulling in an iCalendar library.
The shape you get
uid, summary, description, location, start, end, allDay, tz, organizer, attendees, categories, status, rrule, url, created and lastModified. Every key is always present, so consuming code never has to check.
Dates are ISO 8601. A timed event gives 2026-08-17T09:00:00 with the zone in tz; a UTC event ends in Z; an all-day event is a bare 2026-09-01 with allDay: true.
Organiser and attendees keep the display name alongside the address — Ada Lovelace <ada@example.com> — because dropping the name loses information the file had.
The line-folding problem this solves
Folding is undone before anything else happens, along with the escaping (\n, \,, \;) that the format layers on top.
Recurrence is passed through, not expanded
rrule field holds the rule exactly as written — FREQ=WEEKLY;BYDAY=MO,WE. Expanding it correctly means handling UNTIL, COUNT, BYSETPOS, EXDATE exceptions and moved instances, which is a library rather than a conversion. Handing you the rule intact lets you use one if you need it.Other names for this
Also searched as “icalendar to json”, “parse ics file”.
Questions
- Are recurring events expanded into occurrences?
- No. The repeat rule is passed through in the
rrulefield so you can expand it with a library that handles exceptions properly. - How are all-day events represented?
- As a bare date with
allDay: true. That is genuinely different from an event starting at midnight, and conflating the two causes off-by-one-day bugs. - Are to-dos included?
- No — only VEVENT. If the file contains VTODO or VJOURNAL entries you are told how many were skipped.
- Is my file uploaded?
- No. Everything runs in this tab. That matters more here than almost anywhere else on the site — a calendar is your movements, an address book is other people’s personal data, and a GPS track is where you live and where you run. None of it is sent anywhere.