ICS File Generator
Makes the .ics file and the pre-filled Google and Outlook links — because a downloaded file alone does not work for half your visitors.
Runs in your browser0 bytes uploadedMakes the .ics file and the pre-filled Google and Outlook links — because a downloaded file alone does not work for half your visitors.
Runs in your browser0 bytes uploadedRe-downloading normally updates the existing entry, because the identifier is derived from the title, start and location. If you have changed any of those, paste the old identifier here and raise the sequence — that is the signal calendars use to replace an entry rather than add one.
Give the event a title and a start time. The file and both calendar links appear here as you type — nothing is uploaded.
This is the thing that separates a calendar button that works from one that quietly fails for half your audience, and almost nobody mentions it. There are two mechanisms for getting an event into somebody's calendar, and each covers a different half of the internet.
A downloaded .ics file is the elegant one. On iPhone, on macOS Calendar and in the Outlook desktop app, opening it puts the event straight into a confirmation dialog. Then there is Google Calendar, which does not do that at all — it will not import a file you simply open. A Google Calendar user has to go into Settings, find Import, and pick the file they just downloaded, and in practice they close the tab instead.
So the fix is a pre-filled link. calendar.google.com/calendar/render?action=TEMPLATE…opens a new event with your title, times and location already filled in, one click, no file involved. Outlook Web has an equivalent. Both are produced here alongside the file, carrying exactly the same times, and you put all three on your page.
Write DTSTART:20260812T140000 into a calendar file and you have specified a floating time. It means two o'clock wherever the reader happens to be — two in Stockholm, two in Denver, two in Tokyo. For a webinar that might even be what you meant. For a talk in a room it is wrong, and it is wrong in the least detectable way possible: the person who built the page lives in the right timezone, so it looks perfect to them and to everyone they ask to check it.
Here the time you type is treated as wall-clock time in the zone you select, converted to UTC, and written with a Z. Everybody's calendar then does the local conversion itself and shows the correct moment. The conversion is printed on screen as you type — 14:00 Europe/Stockholm → 12:00 UTC — because it is the one setting that can silently ruin the file, and a number you can see is a number you can check.
Conferences reschedule. Somebody who added your keynote in March and adds it again in May should end up with one entry, updated — not two entries an hour apart. Whether that happens is decided by a single field, UID, and by whether it stayed the same between the two files.
Most generators put a fresh random identifier in every file they produce, which guarantees duplicates. This one derives the identifier from the event itself, so the same event produces the same UID every time with nothing stored anywhere. If you have changed the title or the time — the very things the identifier is built from — paste the previous UID into the field under the advanced section and raise the sequence number. That combination is the actual, specified way to saythis replaces what I sent you before.
In iCalendar, the end of an all-day event is exclusive. A conference on the 12th runs from the 12th to the 13th, and writing the 12th in both fields produces an event that is zero days long — which different calendars then render differently, usually by not showing it. Tick the all-day box and this is handled; the point of mentioning it is that if you are hand-writing these files, this is the bug you have.
A few other specification details are handled quietly because they break real files: a comma inside a description has to be escaped or it reads as a field separator, lines have to be wrapped at 75 octets rather than characters — which matters the moment your venue is called Malmö — and the whole file needs CRLF line endings, which strict parsers enforce.
The file, the links and a snippet of HTML to paste on your page are all produced here in the browser. Nothing is sent anywhere, which is less about secrecy than about the fact that there is no reason for a server to be involved in writing a text file.
The one thing that does travel is a single credit line at the end of the description, pointing back to the calendar tools. It is on by default and the checkbox turns it off, and it is shown in full before you download anything — because it ends up in your visitors' calendars, and finding it there would be a poor way to learn about it. The PRODID field names this tool either way; that field is required by the specification, every calendar file has one, and no calendar application shows it to anybody.
Because a downloaded .ics only works cleanly for about half your visitors. On iOS, macOS Calendar and Outlook desktop, opening the file adds the event in one step. Google Calendar does not do that — it will not import a file you simply open, so an Android user or anyone living in Google Calendar has to go into Settings and import it manually, which almost nobody does. The pre-filled links solve that half: one click opens a new event with everything already filled in.
The time you type is treated as wall-clock time in the timezone you pick, and written into the file as UTC. That means an event at 14:00 in Stockholm shows as 14:00 to someone in Stockholm and 08:00 to someone in New York — which is correct, because it is the same moment. Most free generators write a floating time instead, which means "14:00 wherever you are", and the person who built the page never notices because they live in the right timezone.
Their existing entry is updated rather than duplicated, provided the title, start and location still match — the identifier is derived from those, so the same event produces the same UID every time without anything being stored. If you have changed the time and want to be certain, paste the previous UID into the field and raise the sequence number; that is the signal calendars use to replace an entry instead of adding one.
Yes. Switch to the schedule mode and paste your program as a table, or drop a .csv or .xlsx straight from a spreadsheet. You get one combined file for people who want the lot, and one file per session for individual buttons on each page. The columns are matched by name, so a header row of title, start, end and location is enough to get going.
A one-line credit pointing back here, on by default and removable with the checkbox next to it. It is shown in full before you download anything, because it goes into your visitors' calendars and you should not discover it there. Turning it off changes nothing else about the file. The PRODID field still names this tool either way — that field is required by the spec, every .ics has one, and no calendar shows it to anybody.