Skip to main content

ICS file generator

Create downloadable .ics calendar events with reminders, recurrence, attendees, and timezones.

Free & unlimitedWorks offline
Quick start
Event details
Date & time
Quick duration
Repeat & reminders
Attendees
All processing happens in your browser. No data is sent to any server.

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

Key facts about ICS file generator
Format producediCalendar (RFC 5545) VERSION 2.0, one VEVENT per file, CRLF line endings, METHOD:PUBLISH
Properties writtenUID, DTSTAMP, DTSTART, DTEND, SUMMARY, DESCRIPTION, LOCATION, URL, CATEGORIES, PRIORITY, CLASS, ATTENDEE, RRULE and VALARM
Timezone handlingDefault 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 blockThe 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 eventsWritten as DTSTART;VALUE=DATE with DTEND set to the day after the last day, because the iCalendar end date is exclusive
RecurrenceRRULE with FREQ daily, weekly, monthly or yearly, and an optional COUNT. Leave the count blank for a series that never ends
RemindersUp 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
AttendeesOne ATTENDEE line per address, written as CN plus a mailto value. Adding them does not send anything — see the FAQ
Categories and priority8 category values from MEETING to HOLIDAY, and PRIORITY 1, 5 or 9 for high, medium and low
Private flagAdds CLASS:PRIVATE, which shared calendars use to hide the detail while still showing the busy block
Presets6 starting points — team meeting, lunch break, birthday, workshop, sprint review and an all-day conference day
File nameYour event title with spaces replaced by underscores, plus .ics
Text escapingLine 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. 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. 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. 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. 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. 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. 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.

Specs & compatibility
StandardRFC 5545 iCalendar; the .ics extension and the text/calendar media type
ScopeOne event per file — there is no multi-event export and no VTODO or VJOURNAL
Opens inGoogle 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 foldingNot applied. RFC 5545 asks for lines to be folded at 75 octets; long descriptions produce longer lines, which mainstream clients accept
Time resolutionMinutes — the form uses native date and time inputs
Character setUTF-8, so accented characters and non-Latin scripts survive
PreviewThe raw file text is shown before download and can be copied instead of saved
NetworkNone 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.
On desktop, open Google Calendar, go to Settings, choose Import and export, select the downloaded .ics file, pick the calendar it should land in and import. Opening the file from your downloads folder also works if Google Calendar is your default handler. On Android, tapping the file usually offers the calendar app directly. Importing adds the event to your own calendar — it does not notify anyone else, even if the file lists attendees.
No, and this is the part people most often expect to work differently. ATTENDEE lines are data inside the file: they tell a calendar who is supposed to be there, and a client may display them, but nothing here sends an email. Delivering an invitation requires a calendar server that speaks the scheduling protocol — Google Calendar, Exchange, or your own CalDAV service. Use the attendee field to document the guest list, then send the file or create the event in your own calendar and invite people from there.
A floating event has no timezone information at all, so 09:00 means 09:00 wherever it is opened — correct for a daily personal reminder, wrong for a meeting. Choosing a zone writes TZID on the start and end so the event refers to one real instant and shifts correctly for everyone else. This page defaults to floating, so if your event involves anyone outside your own timezone, pick a zone before you download.
Not with this page — it writes one VEVENT per file. The format itself allows many events inside a single VCALENDAR, which is how calendar exports and subscription feeds work, so if you need a set of dates you have two options. Generate the events one at a time and import each file, which is simplest for a handful. Or generate one, then copy everything from BEGIN:VEVENT to END:VEVENT and repeat it inside the same VCALENDAR wrapper, giving each copy its own UID.
In iCalendar, the end date of an all-day event is exclusive — it marks the first day that is not part of the event. A single-day event on the 10th is written as DTSTART 10 and DTEND 11. This page already adds that extra day for you, so if the event looks a day too long, the usual cause is that the end date was set to the day after the last day by hand. Set the end date to the actual last day and let the generator do the arithmetic.
No. The file is assembled as an array of text lines inside this tab, joined, wrapped in a Blob and saved through a temporary link — the bytes never reach a server. No account, no storage, nothing kept after a reload. That matters for calendar files specifically: they carry attendee addresses, locations and often a conference link with an embedded meeting password, which is exactly the sort of thing that should not pass through an intermediary.
View all

Updated

We use anonymous analytics to improve ToolChamp. No personal data is stored or sold. Privacy Policy