Calendar File (.ics) Generator
Putting a date in an email means somebody retypes it and gets the year wrong. An .ics file is the fix, and writing one by hand is half an hour of looking up which fields are mandatory, how a repeat rule is spelled, and why a line over 75 characters breaks some clients. This writes one, and then reads it back to check it survived.
What this generator does
Assembles the calendar file field by field, folds every line to the length the format allows, escapes the punctuation that would otherwise break it, and then parses the finished file back to compare against what you typed. Several events go into one file under a single calendar wrapper, each keeping its own identifier.
How to use this tool
- Type what the event is, when it starts and how long it runs.
- Add a place, notes, a repeat or a reminder if you need them.
- For a whole schedule, add the event and fill the form again — every event you add goes into the same file.
- Press Write the file to see the .ics and the checks it passed, then download it or attach it to an email.
Understanding the controls
- What is it
- The title a calendar will show. Commas and semicolons are escaped for you, so type it as you would say it.
- Date
- The day the event starts, written as year, month and day. A date that does not exist, such as 30 February, is refused rather than quietly rolled forward.
- Start time
- When it begins, on a 24-hour clock. Ignored when the event is marked as all day.
- How long, in minutes
- The length, from a single minute up to thirty days. The end time is worked out from it, and carries correctly over midnight and over a month end.
- Where
- Optional location. This is the field most likely to contain a comma or a semicolon, which is exactly what the escaping is for.
- Repeats
- Daily, weekly, fortnightly, monthly on the same date, or yearly. This becomes the repeat rule that calendars understand natively.
- How many times in total
- How many occurrences the repeat runs for, counting the first. Zero leaves it running with no end date.
- Reminder
- How long before the start a client should alert. This is written as an alarm inside the event rather than as a note.
- Notes
- Optional longer description. Line breaks are preserved through the encoding, which is not true if you paste text into most hand-written files.
- All day, with no start time
- Marks the event as covering whole days rather than a span of hours, which changes how the dates must be written.
- Add this event and start another
- Puts the event into the file and leaves the form so you can fill it in again. Every event you add goes into the same file, under one calendar wrapper, and each keeps its own identifier.
Common use cases
- Sending a meeting or a class as a file people can just open
- Sending a whole term's fixtures, or a conference programme, as one file somebody opens once
- Putting a recurring rehearsal or fixture into everybody's calendar at once
- Adding an all-day event without it landing on the wrong two days
- Attaching a date to a newsletter or a booking confirmation
- Testing how an application handles a calendar file
How this generator works
Three things go wrong in a hand-written calendar file, and each is checked rather than assumed. Lines longer than 75 octets must be folded onto a continuation line beginning with a space, and the fold must not cut a multi-byte character in half. Commas, semicolons, backslashes and line breaks inside a value must be escaped. And an all-day event's end date is the day after the last day it covers, not the last day itself. The finished file is unfolded, parsed back into fields and unescaped, then compared with what you typed — a round trip rather than an inspection. A file holding several events can go wrong in two further ways, and both are checked too. The obvious way to make one is to write each event separately and paste the results together, which gives a file with several calendar headers in it that most clients read as one event and a lot of rubbish; so the wrapper is written once and the blocks are confirmed to be opened and closed in the right order, with any alarm nested inside the event it belongs to. And two events sharing an identifier fails quietly — a calendar treats the second as an edit of the first and shows one event where there should be two — so every identifier is confirmed to be different.
Randomness and fairness
One thing is random: the unique identifier the event carries, drawn from your browser's cryptographic random source so that re-sending an event never overwrites an unrelated one. Everything else follows from what you type.
For how randomness is produced across the whole site, see how Generate Random works.
Limitations and good to know
- Times are written without a time zone, so a client reads them in whatever zone it is set to — which is what you want for a local meeting and not for an international call.
- Attendees and invitations are not written; this produces an event, not a meeting request that tracks replies.
- Monthly repeats fall on the same date, so a repeat starting on the 31st skips the short months, which is how the format behaves.
- Events in one file are independent of each other. Nothing checks that two of them do not overlap, because a calendar file is a statement of what is happening rather than a claim that it is possible.
Privacy and your data
The file is assembled in your browser. What you type as a title, place or note stays on the device and is never uploaded.
Related generators
- Cron Schedule CalculatorReads a cron expression and lists the next runs, including the day-of-month and day-of-week rule people misread.
- Event Countdown PlannerWorks backwards from the date to tell you when each job has to start, and says plainly when the plan does not fit.
- QR Code GeneratorTurns text or a link into a QR code, then reads the finished grid back the way a scanner does to prove it works.
- Exam Timetable GeneratorFits a set of exams into as few slots as possible while guaranteeing no student is ever sitting two at the same time.