explainer
How .ics and .vcf Files Work: Calendar Events and Contacts Explained
By the LazyTools team · Published 2026-08-02 · Updated 2026-08-23 · 6 min read
Two plain-text formats sit behind everyday actions you never think about: .ics is the file behind
every “Add to Calendar” button, and .vcf (vCard) is the file behind every saved contact. Both are
just text — but both have quirks that trip people up: escaping, line-folding, and iCalendar’s
notorious exclusive all-day end date. Here’s how each works, with a browser-based
ICS generator and
VCF↔CSV converters that keep your data on your device.
The .ics calendar file
Open one and you’ll see a nested, line-based structure:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//LazyTools//ICS Generator//EN
BEGIN:VEVENT
UID:abc123@lazytools.io
DTSTAMP:20240101T000000Z
DTSTART:20240603T093000
DTEND:20240603T103000
SUMMARY:Team Sync
LOCATION:Room 4
RRULE:FREQ=WEEKLY;COUNT=5
END:VEVENT
END:VCALENDAR
An event is a VEVENT block with a start (DTSTART), usually an end (DTEND), a SUMMARY (the
title), and optional LOCATION, DESCRIPTION and a repeat rule (RRULE). Save that as .ics and any
calendar app offers to add it. The wrapping VCALENDAR container carries the VERSION (always 2.0
for iCalendar) and a PRODID that names the software that wrote the file.
Here are the fields you’ll meet most often:
| Property | What it holds | Example |
|---|---|---|
UID | A unique ID so updates replace, not duplicate | abc123@lazytools.io |
DTSTAMP | When the file was created (UTC) | 20240101T000000Z |
DTSTART | Event start | 20240603T093000 |
DTEND | Event end (exclusive for all-day) | 20240603T103000 |
SUMMARY | The event title | Team Sync |
LOCATION | Where it happens | Room 4 |
RRULE | Repeat pattern | FREQ=WEEKLY;COUNT=5 |
A few subtleties are worth knowing. A time like 20240603T093000 with no trailing Z is floating
local time — it happens at 9:30 on whatever clock the viewer’s device shows. Append Z
(20240603T093000Z) and it’s fixed to UTC; add a TZID parameter and it’s pinned to a named zone.
The RRULE in the example above (FREQ=WEEKLY;COUNT=5) produces five weekly occurrences; swap COUNT
for UNTIL=20240930T000000Z to repeat until a date instead.
The three things hand-writing gets wrong
- Text escaping. Commas, semicolons and backslashes are structural in iCalendar, so a title like
Lunch, then demomust be writtenLunch\, then demo. Line breaks become\n. - Line folding. Lines longer than 75 octets must be wrapped onto continuation lines that start with a space. Skip this and strict parsers reject the file.
- The exclusive all-day end. For an all-day event,
DTENDis the day after it ends. A single day on June 25 isDTSTART;VALUE=DATE:20250625andDTEND;VALUE=DATE:20250626. This off-by-one is the single most common.icsbug.
The ICS generator handles all three automatically.
The .vcf contact file
A vCard is even simpler — a BEGIN:VCARD … END:VCARD block per person:
BEGIN:VCARD
VERSION:3.0
FN:Ada Lovelace
N:Lovelace;Ada;;;
EMAIL;TYPE=INTERNET:ada@example.com
TEL;TYPE=CELL:+1-555-0100
END:VCARD
FN is the display name; N is the structured name (Last;First;Middle;Prefix;Suffix); EMAIL and
TEL can repeat with type parameters. One .vcf file can hold one contact or your entire address
book, stacked block after block.
Two version numbers dominate in the wild. vCard 3.0 (RFC 2426) is what most phones export today and is
the safest for broad compatibility; vCard 4.0 (RFC 6350) is the current standard and adds cleaner
handling of things like time zones and multiple addresses. The TYPE parameter labels each value —
TEL;TYPE=CELL, EMAIL;TYPE=WORK, ADR;TYPE=HOME — so an app knows which number is the mobile and
which address is home. Common properties beyond name and contact details include ORG (organization),
TITLE (job title), ADR (a structured postal address), BDAY (birthday), URL and NOTE.
The two formats are close cousins — both descend from the same 1990s vCard/vCalendar lineage, so they share the escaping and line-folding rules while describing very different things:
| Aspect | .ics (iCalendar) | .vcf (vCard) |
|---|---|---|
| Standard | RFC 5545 | RFC 6350 (v4), RFC 2426 (v3) |
| Describes | Calendar events, to-dos | People and organizations |
| Top container | BEGIN:VCALENDAR | BEGIN:VCARD |
| Repeats as | VEVENT blocks | VCARD blocks |
| Common apps | Apple/Google Calendar, Outlook | iPhone, Android, Google Contacts |
| Classic gotcha | Exclusive all-day DTEND | FN vs structured N mismatch |
VCF ↔ CSV: contact migration
Phones and address books speak .vcf; spreadsheets and many CRMs speak CSV. Moving between them is the
core of contact migration:
- VCF → CSV turns each vCard into a spreadsheet row (name, email, phone, organization) — for editing, deduping or importing into a CRM.
- CSV → VCF turns each row back into a vCard — to load a spreadsheet of contacts onto a phone or into Outlook/Google Contacts.
The conversion has to unfold wrapped lines, decode vCard escaping, and quote CSV values with commas —
the same class of details as the .ics format.
Why do this in the browser
Both file types are personal. An .ics can contain a private meeting link or your home address; a
.vcf contains other people’s names, numbers and emails — data you have a duty to handle carefully.
Uploading either to a random converter hands that data to a stranger. Every LazyTools tool here builds
and converts the files in your browser, so they never leave your device and work offline.
The bottom line
.ics and .vcf are simple text formats with sharp edges: escape the special characters, fold long
lines, and remember the all-day end date is exclusive. Generate calendar events with the
ICS generator and migrate contacts with the
VCF→CSV and CSV→VCF converters — all locally, because event
and contact data is exactly the kind you shouldn’t hand to someone else’s server.
Frequently asked questions
What is an .ics file?
An .ics file is a plain-text iCalendar file (defined by RFC 5545) that describes a calendar event — its title, start and end time, location, description and any repeat rule. It's the universal 'add to calendar' format that Apple Calendar, Google Calendar and Outlook all understand, and it's the attachment behind those 'Add to Calendar' buttons in event emails.
How do I create an .ics file?
Write the event fields into the iCalendar structure (BEGIN:VEVENT … END:VEVENT), escaping special characters and formatting the dates correctly, then save it with a .ics extension. The LazyTools ICS Calendar Event Generator does this from a simple form in your browser — fill in the details and download the .ics.
What is a .vcf file?
A .vcf file is a vCard (RFC 6350) — a plain-text contact card holding a person's name, emails, phone numbers, organization and more. It's the standard export/import format for address books, so iPhone, Android, Outlook and Google Contacts can all read each other's .vcf files. One .vcf can hold a single contact or hundreds.
How do I convert a VCF file to CSV (or CSV to VCF)?
To read contacts in a spreadsheet, convert the .vcf to CSV — each vCard becomes a row with name, email and phone columns. To import a spreadsheet into a phone, convert the CSV back to .vcf — each row becomes a vCard. The LazyTools VCF↔CSV converters do both in your browser, without uploading your address book.
Why is the all-day event end date one day later than I expect in an .ics?
Because iCalendar's all-day DTEND is exclusive — it marks the day after the event ends. A one-day event on June 25 is written as DTSTART 20250625 and DTEND 20250626. Forgetting this off-by-one is a classic .ics bug; a good generator adds the extra day for you.
Are these calendar and contact files processed privately?
With the LazyTools tools, yes — the .ics generator and the VCF↔CSV converters all run entirely in your browser. Event details (including private meeting links) and contact lists (other people's personal data) never leave your device, and the tools work offline.