ICS file generator
Create downloadable .ics calendar events with reminders, recurrence, attendees, and timezones.
An .ics file is a small plain-text document in the iCalendar format, and every calendar application on every platform knows how to open one. This page builds a single-event file from a form: title, date and time, location, an optional timezone, a repeat rule with an optional end count, up to two reminders, attendee addresses, a category, a priority and a URL. Press Generate and the actual file contents appear so you can read the VEVENT before you commit to it — useful when you are pasting the result into an email template or a web page rather than just opening it yourself. Only the title and the start date are required; every other field is left out of the file entirely when empty, which keeps the output clean and valid.
Key facts about ICS file generator
| Format produced | iCalendar (RFC 5545) VERSION 2.0, one VEVENT per file, CRLF line endings, METHOD:PUBLISH |
|---|---|
| Properties written | UID, DTSTAMP, DTSTART, DTEND, SUMMARY, DESCRIPTION, LOCATION, URL, CATEGORIES, PRIORITY, CLASS, ATTENDEE, RRULE and VALARM |
| Timezone handling | Default is floating local time with no timezone at all, which means the event lands at the same wall-clock time wherever it is opened. Choosing one of the 9 zones writes TZID on DTSTART and DTEND plus X-WR-TIMEZONE |
| No VTIMEZONE block | The TZID names an IANA zone without embedding its rules. Google, Apple and Outlook resolve it from the name; a strict parser may not |
| All-day events | Written as DTSTART;VALUE=DATE with DTEND set to the day after the last day, because the iCalendar end date is exclusive |
| Recurrence | RRULE with FREQ daily, weekly, monthly or yearly, and an optional COUNT. Leave the count blank for a series that never ends |
| Reminders | Up to two VALARM blocks with ACTION:DISPLAY, offset at the event time, 5, 10, 15 or 30 minutes, 1 or 2 hours, or 1 day before |
| Attendees | One ATTENDEE line per address, written as CN plus a mailto value. Adding them does not send anything — see the FAQ |
| Categories and priority | 8 category values from MEETING to HOLIDAY, and PRIORITY 1, 5 or 9 for high, medium and low |
| Private flag | Adds CLASS:PRIVATE, which shared calendars use to hide the detail while still showing the busy block |
| Presets | 6 starting points — team meeting, lunch break, birthday, workshop, sprint review and an all-day conference day |
| File name | Your event title with spaces replaced by underscores, plus .ics |
| Text escaping | Line breaks in the description are escaped, but commas and semicolons are written through as typed — a strict parser can read a comma in a location as a value separator |
What happens to your file
The file is built and saved entirely in your browser. Each property is pushed onto an array of strings, joined with CRLF, wrapped in a Blob with the text/calendar media type and handed to a temporary download link — no server sees the event. That is worth knowing because an invitation carries real information: who is attending, where you will be, and often a meeting link in the description. None of it is transmitted, none of it is stored, and the attendee addresses you type are used for nothing except the ATTENDEE lines in the file you download. Reloading the page clears the form. The event UID is generated locally from the current time and a random string.
About this tool
- 1
Start from a preset or a blank form
The six presets fill the title, times, repeat rule and reminder for a common shape of event and set the date to today. Everything stays editable, so they are a faster starting point than an empty form.
- 2
Enter the title and start date
These two are required — the generator refuses without them, because an event with no summary or no start is not a usable calendar entry. Tick all-day if there is no meaningful time, and the file switches to date-only values.
- 3
Decide about the timezone
Leave it as local and the event floats: it will appear at the time you typed no matter where it is opened, which is right for a personal reminder. Choose a zone and it is pinned to that zone, which is right for anything scheduled across regions.
- 4
Add recurrence and reminders
Pick a repeat frequency and, if the series should stop, a count. Two reminders are available — a common pairing is one day before and fifteen minutes before.
- 5
Fill in the optional detail
Description, location, URL, attendees, category and priority are all optional and all omitted from the file when blank. The private flag adds CLASS:PRIVATE for shared calendars.
- 6
Generate, read, then download
Press Generate to see the actual file contents, check the DTSTART line is what you meant, then download it or copy the text to paste into an email or a web page.
| Standard | RFC 5545 iCalendar; the .ics extension and the text/calendar media type |
|---|---|
| Scope | One event per file — there is no multi-event export and no VTODO or VJOURNAL |
| Opens in | Google Calendar (import, or open the file), Outlook desktop and web, Apple Calendar on macOS and iOS, Thunderbird, Fantastical, Proton Calendar and most Android calendar apps |
| Line folding | Not applied. RFC 5545 asks for lines to be folded at 75 octets; long descriptions produce longer lines, which mainstream clients accept |
| Time resolution | Minutes — the form uses native date and time inputs |
| Character set | UTF-8, so accented characters and non-Latin scripts survive |
| Preview | The raw file text is shown before download and can be copied instead of saved |
| Network | None after page load; the download is an in-memory blob |
- Set an all-day event's end date to the last day you mean, not the day after. The generator already adds the extra day for you, because the iCalendar end date is exclusive — doing it yourself gives you an event one day too long.
- For anything involving people in more than one country, choose a timezone. A floating event opens at 09:00 for everyone, which sounds convenient and is exactly how meetings get missed.
- Put the meeting link in the URL field rather than burying it in the description. Several clients surface a URL as a join button; none of them parse a link out of free text reliably.
- Keep commas and semicolons out of the title and location if the file is going to an unknown calendar. They are written through literally, and a strict parser treats them as separators.
- A recurring event with no count repeats forever. That is fine for a birthday and awkward for a project standup — set a count so the series stops on its own.
- Test an important file by opening it yourself before you send it. One click in your own calendar catches a wrong year or a missing timezone faster than any validator.
- Downloading the file does not invite anyone. Attendee lines are metadata inside the file; a real invitation has to be sent by a calendar server.
- For an event embedded in an email or on a web page, copy the text instead of downloading and attach it as calendar.ics — many mail clients then offer an add-to-calendar button automatically.
- RFC 5545 single-event output
- All-day and timed events
- Daily, weekly, monthly and yearly recurrence with an optional count
- Two display reminders per event
- Attendee, category, priority and private class fields
- Nine timezone options or floating local time
- Raw file preview before download
- Copy the text or save the .ics
- Send a client a calendar file for a booked appointment instead of asking them to add it manually.
- Publish a download link for a webinar or a class so attendees can add it in one click.
- Create a recurring reminder for a task your calendar app makes awkward to set up.
- Attach a dated event to an email campaign or a landing page.
- Produce a test .ics file while building an integration that has to parse one.
- Move a single event between two calendar systems that do not share an account.
Related tools
View allWorks well with this4
More in Calendar1
Updated