# IndieICS

> Inspect a calendar file locally to explain event times, recurrence, and unresolved timezones.

Drop a calendar file. Understand its times, repeats, and date problems.

The canonical page is https://indieics.com/.

## Use the tool

Open [IndieICS](https://indieics.com/) to complete the job. The questions below describe the supported input, result, and limits. Every answer names its source next to it.

Source: [Your calendar file and RFC 5545](https://www.rfc-editor.org/rfc/rfc5545.html).

## Questions and limits

### What is an ICS file?

An `.ics` file is a calendar in the iCalendar format from [RFC 5545](https://www.rfc-editor.org/rfc/rfc5545.html). It is plain text: a `VCALENDAR` wrapper around one or more `VEVENT` components, each with a start, an end or duration, a unique id, and optional repeat rules. Booking confirmations, invitations, and calendar downloads all use it. IndieICS reads one file and explains what each event says about its time.

### Why does my calendar event show the wrong time?

Usually the timezone. A start written as `20260908T100000Z` is UTC and lands correctly everywhere. A time with a `TZID` parameter depends on that zone being defined, and a time with neither is a floating time that every reader places in its own local zone. IndieICS labels each event's start as UTC, all-day, floating, defined in the file, or unresolved, and never guesses a conversion for you.

### What does an unresolved TZID mean?

The event names a timezone, such as `TZID=Europe/Berlin`, but the file carries no `VTIMEZONE` component that defines it. RFC 5545 asks for one per zone the file uses. Many calendar apps recognize the name anyway and fall back to their own zone table, but that is a guess on the reader's side, and a misspelled or vendor-specific name fails. Add the `VTIMEZONE` block, or write the time in UTC.

### How do I read an RRULE?

An `RRULE` is the repeat rule: `FREQ=WEEKLY;BYDAY=MO,WE;COUNT=10` means every week on Monday and Wednesday, ten times. IndieICS turns the rule into a sentence and previews the first ten occurrences from the event's `DTSTART`, after any `EXDATE` exclusions, within a ten year horizon. The preview is a sample, not a total count.

A rule with an unsupported field, or an event with recurrence overrides, gets no preview and a note saying why.

### What does needs attention mean in the result?

The check found a field that breaks the format or makes the event ambiguous: a missing `UID`, `DTSTAMP`, or `DTSTART`, an end before the start, an all-day start paired with a timed end, both `DTEND` and `DURATION`, a rule with both `COUNT` and `UNTIL`, a duplicate `UID`, or an unresolved timezone. Each item names the field, so you can fix it in the software that produced the file and inspect again.

### What does IndieICS not check?

It inspects `VEVENT` components only. Tasks, journal entries, free/busy blocks, and alarms are skipped and named as skipped. It is not a complete RFC 5545 validator, and it cannot promise how Google Calendar, Outlook, or Apple Calendar will display a given file. One calendar at a time, up to 256 KiB and fifty events, with ten previewed occurrences per event.

## Promises

- The core is free: no account, no card, no premium plan, no upgrade nag, no hidden paywall.
- Private lookup activity is never published.
- Analytics is currently off. Private lookup activity is never published or sent to a tracker. No lookup history becomes public inventory.

## More

- [Notes](https://indieics.com/blog.md): posts by the maker, newest first
- [More tools](https://indieics.com/tools.md): the other tools by turushan
- [security.txt](https://indieics.com/.well-known/security.txt): how to report a vulnerability

Made by turushan, https://twitter.com/turushan.
