ICS calendar generator and inspector
Time and date
Loading
Loading tool
The tool is loaded only when you open it.
All processing for this tool happens in your browser. Your input is not sent to a server.
About this tool
Generate local iCalendar from a JSON event array, or inspect a supported ICS profile, then preview occurrences, exclusions and overlaps.
Common uses
- Prepare bounded recurring events without giving calendar access.
- Inspect supported ICS text and identify exclusions or potential overlaps.
How to use it
- 1.Load an example or enter an event JSON array and UTC generation stamp; alternatively paste ICS.
- 2.Generate or inspect, then review time axes, excluded instances, warnings and overlap pages.
- 3.Review complete normalized ICS and request its download; choose any calendar import separately.
Executed calendar examples
Daily exceptions and overlap
20260105T090000Z–100000Z; FREQ=DAILY;COUNT=4; EXDATE=20260106T090000Z; second event 20260107T093000Z–103000Z
4; 1
COUNT forms four starts before the January6 exception; three remain, plus one other event. January7 has one same-UTC overlap.
Month-end dates
20260131–20260201; FREQ=MONTHLY;COUNT=4
20260131, 20260331, 20260531, 20260731
February, April and June lack day31 and are skipped without consuming COUNT. End is exclusive.
Floating weekly events
20260105T090000–100000; FREQ=WEEKLY;COUNT=3;BYDAY=MO,WE
20260105T090000, 20260107T090000, 20260112T090000
Floating wall times recur Monday/Wednesday without resolving a timezone; January5,7,12 are retained.
Limits and notes
- Supported subset, not a general RFC conformance verdict: VCALENDAR VERSION 2.0 / PRODID and VEVENT with UID, UTC DTSTAMP, SUMMARY, explicit positive-duration DTSTART/DTEND, optional DESCRIPTION, LOCATION, RRULE and EXDATE. DATE, UTC and floating time only. TZID / VTIMEZONE, alarms, attendees, organizers, URL, RDATE, DURATION, overrides and other fields/components are unsupported and rejected. No automatic calendar import.
- Limits: 256 KiB UTF-8 per source/output; 40 events; years 1900–2100; UID 200, summary 200, location 500 and description 2000 UTF-16 units; 500 rule occurrences per event, 500 exception entries, 2000 aggregate occurrences BEFORE exclusions, 100000 candidate steps and 2000 overlaps. Inspection: 6000 physical lines. Exceeding any limit rejects the complete operation.
- Finite RRULE only: FREQ=DAILY/WEEKLY/MONTHLY/YEARLY; INTERVAL 1–366; exactly one COUNT 1–500 or inclusive UNTIL of the same time type. WEEKLY supports non-ordinal BYDAY=MO,TU,… and WKST (default MO); BYDAY must include the start weekday. Other rule parts are rejected. Invalid monthly/yearly dates are skipped without consuming COUNT. EXDATE removes starts after COUNT; excluded instances are not replaced. Unmatched exceptions produce a warning.
- UTC (Z), floating wall time and all-day dates are separate comparison axes. Floating time follows the importing calendar zone; no IANA/DST conversion is performed. Cross-axis occurrence pairs are not compared. End is exclusive; touching intervals are not overlaps. Same-series overlaps are included. Preview describes only this bounded profile, not personal availability. Normalized output uses CRLF, escaped TEXT and physical lines of at most 75 UTF-8 bytes; input folding/newline warnings are reported separately. Export contains all event text and UIDs. Check the intended calendar before importing; imports may create or update events with matching UIDs.
- Browser-local only: no upload, storage, external references, invitation, calendar access or automatic import. Event content and UIDs can contain private information and are included in the exported ICS.
Frequently asked questions
Does accepted mean every ICS is supported?
Supported subset, not a general RFC conformance verdict: VCALENDAR VERSION 2.0 / PRODID and VEVENT with UID, UTC DTSTAMP, SUMMARY, explicit positive-duration DTSTART/DTEND, optional DESCRIPTION, LOCATION, RRULE and EXDATE. DATE, UTC and floating time only. TZID / VTIMEZONE, alarms, attendees, organizers, URL, RDATE, DURATION, overrides and other fields/components are unsupported and rejected. No automatic calendar import.
How are COUNT and EXDATE combined?
Finite RRULE only: FREQ=DAILY/WEEKLY/MONTHLY/YEARLY; INTERVAL 1–366; exactly one COUNT 1–500 or inclusive UNTIL of the same time type. WEEKLY supports non-ordinal BYDAY=MO,TU,… and WKST (default MO); BYDAY must include the start weekday. Other rule parts are rejected. Invalid monthly/yearly dates are skipped without consuming COUNT. EXDATE removes starts after COUNT; excluded instances are not replaced. Unmatched exceptions produce a warning.
Does this detect personal availability?
UTC (Z), floating wall time and all-day dates are separate comparison axes. Floating time follows the importing calendar zone; no IANA/DST conversion is performed. Cross-axis occurrence pairs are not compared. End is exclusive; touching intervals are not overlaps. Same-series overlaps are included. Preview describes only this bounded profile, not personal availability.