RFC 2445

Internet Calendaring and Scheduling Core Object Specification (iCalendar)

๐Ÿ“… published November 1998, from ietf

Internet Calendaring and Scheduling Core Object Specification (iCalendar) โœจ

RFC 2445 ๐ŸŽ€ Network Working Group, November 1998. Written by F. Dawson (Lotus) and D. Stenerson (Microsoft). It's a Standards Track doc. The header doesn't list anything it obsoletes or updates, so no drama there ๐Ÿ’…


Status of this Memo ๐ŸŒธ

Okay so this doc is an Internet standards track protocol for the whole Internet community, and it's literally asking for discussion and suggestions for improvements ๐Ÿซถ If you want to know where this protocol stands in the official standardization state, check the current edition of the "Internet Official Protocol Standards" (STD 1). And distribution of this memo is unlimited, so share it with everyone ๐Ÿ’œ

Copyright (C) The Internet Society (1998). All Rights Reserved. Obviously ๐Ÿ’…

Abstract ๐Ÿฆ‹

Okay bestie, the world really needs calendaring and scheduling that works across the Internet, and it needs it now โœจ Group scheduling and Personal Information Management (PIM) products are already being stretched across the Internet today, but they're doing it in proprietary ways, which is giving chaos ๐Ÿ’€ So this memo is here to define one common format for openly exchanging calendaring and scheduling info ๐Ÿงš

This memo is written up as a registration for a MIME media type per [RFC 2048]. BUT the format is just as usable outside of a MIME message content type, so it's not locked in ๐ŸŒˆ

The proposed media type value is 'text/calendar'. That string labels a media type holding calendaring and scheduling info, encoded as text characters in the way outlined below ๐ŸŽ€

This MIME media type is a standard content type for capturing calendar event, to-do, and journal entry information ๐Ÿ’– It can also carry free/busy time info ๐Ÿ“ The content type can ride along as a MIME message entity over MIME-based email systems, over HTTP, or over some other Internet transport ๐Ÿš€ It's also useful as an object for interactions between desktop apps using the operating system clipboard, drag/drop, or file systems capabilities. Main character energy ๐Ÿ‘‘

This memo is built on the earlier work of the vCalendar specification for exchanging personal calendaring and scheduling info. To avoid mixing it up with that referenced work, this memo goes by the name iCalendar specification โœจ

Now the memo defines the format for specifying iCalendar object methods โญ An iCalendar object method is a set of usage constraints for the iCalendar object. For example, these methods can define scheduling messages that:

  • request an event be scheduled
  • reply to an event request
  • send a cancellation notice for an event
  • modify or replace the definition of an event
  • provide a counter proposal for an original event request
  • delegate an event request to another individual
  • request free or busy time
  • reply to a free or busy time request
  • provide similar scheduling messages for a to-do or journal entry calendar component

The iCalendar Transport-indendent Interoperability Protocol (iTIP) defined in [ITIP] is one such scheduling protocol. Iconic ๐Ÿซถ

Table of Contents ๐Ÿ’–

okay bestie, here's the whole map so you always know where everything lives ๐Ÿ—บ๏ธโœจ no getting lost in this one, promise ๐ŸŽ€

   1 Introduction.....................................................5
   2 Basic Grammar and Conventions....................................6
    2.1 Formatting Conventions .......................................7
    2.2 Related Memos ................................................8
    2.3 International Considerations .................................8
   3 Registration Information.........................................8
    3.1 Content Type .................................................8
    3.2 Parameters ...................................................9
    3.3 Content Header Fields .......................................10
    3.4 Encoding Considerations .....................................10
    3.5 Security Considerations .....................................10
    3.6 Interoperability Considerations .............................11
    3.7 Applications Which Use This Media Type ......................11
    3.8 Additional Information ......................................11
    3.9 Magic Numbers ...............................................11
    3.10 File Extensions ............................................11
    3.11 Contact for Further Information: ...........................12
    3.12 Intended Usage .............................................12
    3.13 Authors/Change Controllers .................................12
   4 iCalendar Object Specification..................................13
    4.1 Content Lines ...............................................13
     4.1.1 List and Field Separators ................................16
     4.1.2 Multiple Values ..........................................16
     4.1.3 Binary Content ...........................................16
     4.1.4 Character Set ............................................17
    4.2 Property Parameters .........................................17
     4.2.1 Alternate Text Representation ............................18
     4.2.2 Common Name ..............................................19
     4.2.3 Calendar User Type .......................................20
     4.2.4 Delegators ...............................................20
     4.2.5 Delegatees ...............................................21
     4.2.6 Directory Entry Reference ................................21
     4.2.7 Inline Encoding ..........................................22
     4.2.8 Format Type ..............................................23
     4.2.9 Free/Busy Time Type ......................................23
     4.2.10 Language ................................................24
     4.2.11 Group or List Membership ................................25
     4.2.12 Participation Status ....................................25
     4.2.13 Recurrence Identifier Range .............................27
     4.2.14 Alarm Trigger Relationship ..............................27
     4.2.15 Relationship Type .......................................28
     4.2.16 Participation Role ......................................29
     4.2.17 RSVP Expectation ........................................29
     4.2.18 Sent By .................................................30
     4.2.19 Time Zone Identifier ....................................30
     4.2.20 Value Data Types ........................................32
    4.3 Property Value Data Types ...................................32
     4.3.1 Binary ...................................................33
     4.3.2 Boolean ..................................................33
     4.3.3 Calendar User Address ....................................34
     4.3.4 Date .....................................................34
     4.3.5 Date-Time ................................................35
     4.3.6 Duration .................................................37
     4.3.7 Float ....................................................38
     4.3.8 Integer ..................................................38
     4.3.9 Period of Time ...........................................39
     4.3.10 Recurrence Rule .........................................40
     4.3.11 Text ....................................................45
     4.3.12 Time ....................................................47
     4.3.13 URI .....................................................49
     4.3.14 UTC Offset ..............................................49
    4.4 iCalendar Object ............................................50
    4.5 Property ....................................................51
    4.6 Calendar Components .........................................51
     4.6.1 Event Component ..........................................52
     4.6.2 To-do Component ..........................................55
     4.6.3 Journal Component ........................................56
     4.6.4 Free/Busy Component ......................................58
     4.6.5 Time Zone Component ......................................60
     4.6.6 Alarm Component ..........................................67
    4.7 Calendar Properties .........................................73
     4.7.1 Calendar Scale ...........................................73
     4.7.2 Method ...................................................74
     4.7.3 Product Identifier .......................................75
     4.7.4 Version ..................................................76
    4.8 Component Properties ........................................77
     4.8.1 Descriptive Component Properties .........................77
       4.8.1.1 Attachment ...........................................77
       4.8.1.2 Categories ...........................................78
       4.8.1.3 Classification .......................................79
       4.8.1.4 Comment ..............................................80
       4.8.1.5 Description ..........................................81
       4.8.1.6 Geographic Position ..................................82
       4.8.1.7 Location .............................................84
       4.8.1.8 Percent Complete .....................................85
       4.8.1.9 Priority .............................................85
       4.8.1.10 Resources ...........................................87
       4.8.1.11 Status ..............................................88
       4.8.1.12 Summary .............................................89
     4.8.2 Date and Time Component Properties .......................90
       4.8.2.1 Date/Time Completed ..................................90
       4.8.2.2 Date/Time End ........................................91
       4.8.2.3 Date/Time Due ........................................92
       4.8.2.4 Date/Time Start ......................................93
       4.8.2.5 Duration .............................................94
       4.8.2.6 Free/Busy Time .......................................95
       4.8.2.7 Time Transparency ....................................96
     4.8.3 Time Zone Component Properties ...........................97
       4.8.3.1 Time Zone Identifier .................................97
       4.8.3.2 Time Zone Name .......................................98
       4.8.3.3 Time Zone Offset From ................................99
       4.8.3.4 Time Zone Offset To .................................100
       4.8.3.5 Time Zone URL .......................................101
     4.8.4 Relationship Component Properties .......................102
       4.8.4.1 Attendee ............................................102
       4.8.4.2 Contact .............................................104
       4.8.4.3 Organizer ...........................................106
       4.8.4.4 Recurrence ID .......................................107
       4.8.4.5 Related To ..........................................109
       4.8.4.6 Uniform Resource Locator ............................110
       4.8.4.7 Unique Identifier ...................................111
     4.8.5 Recurrence Component Properties .........................112
       4.8.5.1 Exception Date/Times ................................112
       4.8.5.2 Exception Rule ......................................114
       4.8.5.3 Recurrence Date/Times ...............................115
       4.8.5.4 Recurrence Rule .....................................117
     4.8.6 Alarm Component Properties ..............................126
       4.8.6.1 Action ..............................................126
       4.8.6.2 Repeat Count ........................................126
       4.8.6.3 Trigger .............................................127

     4.8.7 Change Management Component Properties ..................129
       4.8.7.1 Date/Time Created ...................................129
       4.8.7.2 Date/Time Stamp .....................................130
       4.8.7.3 Last Modified .......................................131
       4.8.7.4 Sequence Number .....................................131
     4.8.8 Miscellaneous Component Properties ......................133
       4.8.8.1 Non-standard Properties .............................133
       4.8.8.2 Request Status ......................................134
   5 iCalendar Object Examples......................................136
   6 Recommended Practices..........................................140
   7 Registration of Content Type Elements..........................141
    7.1 Registration of New and Modified iCalendar Object Methods ..141
    7.2 Registration of New Properties .............................141
     7.2.1 Define the property .....................................142
     7.2.2 Post the Property definition ............................143
     7.2.3 Allow a comment period ..................................143
     7.2.4 Submit the property for approval ........................143
    7.3 Property Change Control ....................................143
   8 References.....................................................144
   9 Acknowledgments................................................145
   10 Authors' and Chairs' Addresses................................146
   11 Full Copyright Statement......................................148

1. Introduction โœจ

Okay so calendaring and scheduling has been blowing up for the last decade, and honestly it makes sense. Enterprise and inter-enterprise business now depends on scheduling events and actions super fast with this tech ๐Ÿ’ผ. The problem is that the long-term growth is kind of stuck, because there aren't Internet standards for the message content types that sit at the heart of these knowledgeware apps ๐Ÿ˜ญ. This memo is here to level up how well different calendaring and scheduling apps can actually talk to each other ๐Ÿซถ. It defines a MIME content type for swapping calendaring and scheduling info ๐Ÿ’œ.

The Internet Calendaring and Scheduling Core Object Specification, aka iCalendar, lets you capture and exchange the stuff a calendaring and scheduling app normally holds, like in a Personal Information Manager (PIM) or a Group Scheduling product ๐Ÿ“….

iCalendar is giving "exchange format between apps or systems" ๐Ÿ’–. Because it's defined as a MIME content type, the object can travel over a bunch of transports, and the list is not limited to these: SMTP, HTTP, a file system, desktop interactive stuff like a memory-based clipboard or drag/drop, point-to-point asynchronous communication, wired-network transport, and even some form of unwired transport like infrared ๐ŸŒˆ. Main character transport energy, no cap โœจ.

The memo also defines iCalendar object methods, which map this content type onto messages for calendaring and scheduling operations. Think requesting, replying to, modifying, and canceling meetings or appointments, to-dos, and journal entries ๐Ÿ—“๏ธ. Those methods can also be used to define other operations, like requesting free/busy time data and replying with it ๐Ÿฆ‹. That whole scheduling protocol lives in the iCalendar Transport-independent Interoperability Protocol (iTIP), which is defined in [ITIP] ๐ŸŽ€.

Last but not least, the memo includes a formal grammar for the content type, based on the Internet ABNF defined in [RFC 2234] ๐Ÿงš. This ABNF is required for building parsers, and it's the definitive reference whenever the descriptive prose is ambiguous or someone has questions ๐Ÿ™ˆ.


2. Basic Grammar and Conventions ๐Ÿ“

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY" and "OPTIONAL" in this document are to be interoperated as described in [RFC 2119] ๐Ÿ”‘.

This memo uses both descriptive prose and a more formal notation to define the calendaring and scheduling format ๐Ÿ’….

That formal notation is the ABNF notation of [RFC 2234]. If you're planning on implementing the format in this memo, you should be familiar with this notation so you can properly interpret the specifications here ๐Ÿค“.

All numeric and hexadecimal values in this memo are given in decimal notation ๐Ÿ”ข.

Here's a tea: all names of properties, property parameters, enumerated property values and property parameter values are case-insensitive ๐Ÿซ–. However, all other property values are case-sensitive, unless otherwise stated ๐ŸŒธ.

Note: All indented editorial notes, such as this one, are intended to provide the reader with additional information. The information is not essential to the building of an implementation conformant with this memo. The information is provided to highlight a particular feature or characteristic of the memo.

The format for the iCalendar object is based on the syntax of the [RFC 2425] content type. The iCalendar object is not a profile of [RFC 2425], but it does reuse a number of the elements from the [RFC 2425] specification ๐Ÿ“.

2.1. Formatting Conventions ๐ŸŽ€

The mechanisms in this memo are defined in prose, and a lot of the terms have everyday meanings that are different from how this memo uses them ๐Ÿ™ƒ. So to reference the calendaring and scheduling model, core objects (this memo) or the interoperability protocol [ITIP], some formatting conventions are used ๐Ÿ’….

Calendaring and scheduling roles get written as quoted strings where each word starts with an uppercase letter. For example, "Organizer" refers to a role of a "Calendar User" within the scheduling protocol defined by [ITIP] ๐Ÿ‘‘.

Calendar components defined by this memo get written as capitalized, quoted strings too, and every one of them starts with the letter "V" ๐ŸŒŸ. For example, "VEVENT" is the event calendar component, "VTODO" is the to-do calendar component, and "VJOURNAL" is the daily journal calendar component ๐Ÿ““.

Scheduling methods defined by [ITIP] are also capitalized, quoted strings. For example, "REQUEST" is the method for requesting that a scheduling calendar component be created or modified, and "REPLY" is the method a recipient uses to update their status with the "Organizer" of the calendar component ๐Ÿ’Œ.

Properties defined by this memo are written as capitalized, quoted strings followed by the word "property". For example, the "ATTENDEE" property is the iCalendar property used to convey the calendar address of a calendar user ๐Ÿงพ.

Property parameters defined by this memo are written as lowercase, quoted strings followed by the word "parameter". For example, the "value" parameter is the iCalendar property parameter used to override the default data type for a property value ๐Ÿ”ง.

Enumerated values defined by this memo are written as capitalized text, either alone or followed by the word "value". For example, the "MINUTELY" value can be used with the "FREQ" component of the "RECUR" data type to specify repeating components based on an interval of one minute or more ๐Ÿ”.

Implementers will need to be familiar with several other memos that, together with this one, form a framework for Internet calendaring and scheduling standards ๐Ÿ•ธ๏ธ. This memo, [ICAL], specifies a core specification of objects, data types, properties and property parameters ๐ŸŒท.

  • [ITIP] - specifies an interoperability protocol for scheduling between different implementations;
  • [IMIP] specifies an Internet email binding for [ITIP].

This memo doesn't try to repeat the concepts or definitions from these other memos. Wherever possible, it points you to the memo that specifies them ๐Ÿซถ.

2.3. International Considerations ๐ŸŒ

Throughout the rest of this document, characters are described in the form "character name (codepoint)", where "codepoint" comes from the US-ASCII character set ๐Ÿ”ค. The "character name" is the authoritative description, and (codepoint) is a reference to that character in US-ASCII or a US-ASCII compatible set, like the ISO-8859-x family, UTF-8, ISO-2022-xx or KOI8-R ๐ŸŒ. If a non-US-ASCII compatible character set is used, the appropriate code point from that character set MUST be chosen instead. Use of non-US-ASCII-compatible character sets is NOT recommended ๐Ÿ™…โ€โ™€๏ธ.


3. Registration Information ๐ŸŽ€

The Calendaring and Scheduling Core Object Specification is meant to be used as a MIME content type. That said, implementing this memo is in no way limited to just being a MIME content type ๐ŸŒˆ.

3.1. Content Type ๐Ÿ’–

The following text is intended to register this memo as the MIME content type "text/calendar" ๐Ÿ’Œ.

To: ietf-types@uninett.no

Subject: Registration of MIME content type text/calendar.

MIME media type name: text

MIME subtype name: calendar

3.2. Parameters ๐Ÿง

Required parameters: none

Optional parameters: charset, method, component and optinfo

The "charset" parameter is defined in [RFC 2046] for other body parts. It's used to identify the default character set used within the body part ๐Ÿ”ก.

The "method" parameter conveys the iCalendar object method or transaction semantics for the calendaring and scheduling information ๐Ÿ“จ. It's also an identifier for the restricted set of properties and values that the iCalendar object consists of ๐Ÿง . This parameter is a guide for applications interpreting the information in the body part, so it SHOULD NOT be used to exclude or require particular pieces of information, unless the identified method definition specifically calls for that behavior ๐Ÿ™…โ€โ™€๏ธ. Unless a particular method definition specifically forbids it, a text/calendar content type can contain any set of properties permitted by the Calendaring and Scheduling Core Object Specification โœจ. The "method" parameter MUST be the same value as the one specified in the "METHOD" component property in the iCalendar object. If one is present, the other MUST also be present ๐Ÿ‘ฏโ€โ™€๏ธ.

The value for the "method" parameter is defined as follows:

method  = 1*(ALPHA / DIGIT / "-")
; IANA registered iCalendar object method

The "component" parameter conveys the type of iCalendar calendar component within the body part ๐Ÿ—‚๏ธ. If the iCalendar object contains more than one calendar component type, then multiple component parameters MUST be specified ๐Ÿซง.

The value for the "component" parameter is defined as follows:

component       = ("VEVENT" / "VTODO" / "VJOURNAL" / "VFREEBUSY"
                / "VTIMEZONE" / x-name / iana-token)

The "optinfo" parameter conveys optional information about the iCalendar object within the body part ๐ŸŽ. This parameter can only specify semantics that are already specified by the iCalendar object and that can otherwise be determined by parsing the body part. On top of that, the optional information this parameter specifies MUST be consistent with the information specified by the iCalendar object ๐Ÿ”’. For example, it can be used to convey the "Attendee" response status to a meeting request ๐Ÿ“ฌ. The parameter value is a string value ๐Ÿงต.

The parameter can be specified multiple times ๐Ÿ”.

This parameter MAY only specify semantics already specified by the iCalendar object and that can otherwise be determined by parsing the body part ๐ŸŒ™.

The value for the "optinfo" parameter is defined as follows:

optinfo = infovalue / qinfovalue

infovalue       = iana-token / x-name

qinfovalue      = DQUOTE (infovalue) DQUOTE

3.3. Content Header Fields ๐Ÿ“‹

Optional content header fields: Any header fields defined by [RFC 2045] ๐Ÿญ.

3.4. Encoding Considerations ๐Ÿซง

This MIME content type can contain 8bit characters, so quoted-printable or BASE64 MIME content-transfer-encodings might be necessary when iCalendar objects get transferred across protocols that are restricted to the 7bit repertoire ๐Ÿ”. Also, a text valued property in the content entity can have its special characters encoded with the BACKSLASH character (US-ASCII decimal 92) escapement technique ๐Ÿชž. Which means content values can end up encoded twice, so keep that in mind ๐Ÿ˜ตโ€๐Ÿ’ซ๐Ÿ’….

3.5 Security Considerations ๐Ÿ”

SPOOFING - - Okay bestie, this one is SERIOUS ๐Ÿ˜ญ. In this memo, the "Organizer" is the only person allowed to make changes to an existing "VEVENT", "VTODO", "VJOURNAL" calendar component and send the updates out to the "Attendees". An iCalendar object that maliciously changes or cancels an existing "VEVENT", "VTODO" or "VJOURNAL" or "VFREEBUSY" calendar component might be built by someone other than the "Organizer" and sent to the "Attendees" ๐Ÿ’€. Also in this memo, besides the "Organizer", an "Attendee" of a "VEVENT", "VTODO", "VJOURNAL" calendar component is the only other person allowed to update any parameter tied to their "ATTENDEE" property and send it to the "Organizer". An iCalendar object that maliciously changes the "ATTENDEE" parameters can be constructed by someone other than the real "Attendee" and sent to the "Organizer" ๐Ÿ™ˆ.

PROCEDURAL ALARMS - - Here's a sneaky one ๐Ÿ‘€. An iCalendar object can be created that contains a "VEVENT" and "VTODO" calendar component with "VALARM" calendar components. The "VALARM" calendar component can be of type PROCEDURE and can have an attachment containing some sort of executable program. Implementations that incorporate these types of alarms are subject to any virus or malicious attack that might occur as a result of executing the attachment.

ATTACHMENTS - - An iCalendar object can include references to Uniform Resource Locators that can be programmed resources ๐Ÿฆ‹.

Implementers and users of this memo should be aware of the network security implications of accepting and parsing such information. In addition, the security considerations observed by implementations of electronic mail systems should be followed for this memo. Be careful out there, babes ๐Ÿซถ.


3.6 Interoperability Considerations ๐Ÿงš

This MIME content type is intended to define a common format for conveying calendaring and scheduling information between different systems. It is heavily based on the earlier [VCAL] industry specification โœจ.

3.7 Applications Which Use This Media Type ๐Ÿ“

This content-type is designed for widespread use by Internet calendaring and scheduling applications. In addition, applications in the workflow and document management area might find this content-type applicable. The [ITIP] and [IMIP] Internet protocols directly use this content-type also. Future work on an Internet calendar access protocol will utilize this content-type too ๐Ÿ’….

3.8 Additional Information ๐ŸŒธ

This memo defines this content-type.

3.9 Magic Numbers ๐Ÿช„

None.

3.10 File Extensions ๐Ÿ—‚๏ธ

The file extension of "ics" is to be used to designate a file containing (an arbitrary set of) calendaring and scheduling information consistent with this MIME content type ๐Ÿ“….

The file extension of "ifb" is to be used to designate a file containing free or busy time information consistent with this MIME content type.

Macintosh file type codes: The file type code of "iCal" is to be used in Apple MacIntosh operating system environments to designate a file containing calendaring and scheduling information consistent with this MIME media type ๐ŸŽ.

The file type code of "iFBf" is to be used in Apple MacIntosh operating system environments to designate a file containing free or busy time information consistent with this MIME media type.

3.11 Contact for Further Information: ๐Ÿ“ž

Frank Dawson
6544 Battleford Drive
Raleigh, NC 27613-3502
919-676-9515 (Telephone)
919-676-9564 (Data/Facsimile)
Frank_Dawson@Lotus.com (Internet Mail)

Derik Stenerson
One Microsoft Way
Redmond, WA  98052-6399
425-936-5522 (Telephone)
425-936-7329 (Facsimile)
deriks@microsoft.com (Internet Mail)

3.12 Intended Usage ๐Ÿ’œ

COMMON

3.13 Authors/Change Controllers ๐Ÿ‘‘

Frank Dawson
6544 Battleford Drive
Raleigh, NC 27613-3502
919-676-9515 (Telephone)
919-676-9564 (Data/Facsimile)
Frank_Dawson@Lotus.com (Internet Mail)

Derik Stenerson
One Microsoft Way
Redmond, WA  98052-6399
425-936-5522 (Telephone)
425-936-7329 (Facsimile)
deriks@microsoft.com (Internet Mail)

4 iCalendar Object Specification ๐ŸŽ€

The following sections define the details of a Calendaring and Scheduling Core Object Specification. This information is intended to be an integral part of the MIME content type registration. In addition, this information can be used independent of such content registration. In particular, this memo has direct applicability for use as a calendaring and scheduling exchange format in file-, memory- or network-based transport mechanisms ๐Ÿš€.

4.1 Content Lines ๐Ÿ“

The iCalendar object is organized into individual lines of text, called content lines. Content lines are delimited by a line break, which is a CRLF sequence (US-ASCII decimal 13, followed by US-ASCII decimal 10).

Lines of text SHOULD NOT be longer than 75 octets, excluding the line break. Long content lines SHOULD be split into a multiple line representations using a line "folding" technique. That is, a long line can be split between any two characters by inserting a CRLF immediately followed by a single linear white space character (i.e., SPACE, US-ASCII decimal 32 or HTAB, US-ASCII decimal 9). Any sequence of CRLF followed immediately by a single linear white space character is ignored (i.e., removed) when processing the content type ๐Ÿช„.

For example the line:

DESCRIPTION:This is a long description that exists on a long line.

Can be represented as:

DESCRIPTION:This is a lo
 ng description
  that exists on a long line.

The process of moving from this folded multiple line representation to its single line representation is called "unfolding". Unfolding is accomplished by removing the CRLF character and the linear white space character that immediately follows ๐Ÿงฉ.

When parsing a content line, folded lines MUST first be unfolded according to the unfolding procedure described above. When generating a content line, lines longer than 75 octets SHOULD be folded according to the folding procedure described above.

The content information associated with an iCalendar object is formatted using a syntax similar to that defined by [RFC 2425]. That is, the content information consists of CRLF-separated content lines.

The following notation defines the lines of content in an iCalendar object:

contentline        = name *(";" param ) ":" value CRLF
   ; This ABNF is just a general definition for an initial parsing
   ; of the content line into its property name, parameter list,
   ; and value string

; When parsing a content line, folded lines MUST first
   ; be unfolded according to the unfolding procedure
   ; described above. When generating a content line, lines
   ; longer than 75 octets SHOULD be folded according to
   ; the folding procedure described above.

name               = x-name / iana-token

iana-token = 1*(ALPHA / DIGIT / "-")
; iCalendar identifier registered with IANA

x-name             = "X-" [vendorid "-"] 1*(ALPHA / DIGIT / "-")
; Reservered for experimental use. Not intended for use in
; released products.

vendorid   = 3*(ALPHA / DIGIT)     ;Vendor identification

param              = param-name "=" param-value
                     *("," param-value)
   ; Each property defines the specific ABNF for the parameters
   ; allowed on the property. Refer to specific properties for
   ; precise parameter ABNF.

param-name = iana-token / x-token

param-value        = paramtext / quoted-string

paramtext  = *SAFE-CHAR

value      = *VALUE-CHAR

quoted-string      = DQUOTE *QSAFE-CHAR DQUOTE

NON-US-ASCII       = %x80-F8
; Use restricted by charset parameter
; on outer MIME object (UTF-8 preferred)

QSAFE-CHAR = WSP / %x21 / %x23-7E / NON-US-ASCII
; Any character except CTLs and DQUOTE

SAFE-CHAR  = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-7E
           / NON-US-ASCII
; Any character except CTLs, DQUOTE, ";", ":", ","

VALUE-CHAR = WSP / %x21-7E / NON-US-ASCII
; Any textual character

CR = %x0D
; carriage return

LF = %x0A
; line feed

CRLF       = CR LF
; Internet standard newline

CTL        = %x00-08 / %x0A-1F / %x7F
   ; Controls

ALPHA      = %x41-5A / %x61-7A   ; A-Z / a-z

DIGIT      = %x30-39
   ; 0-9

DQUOTE     = %x22
   ; Quotation Mark

WSP        = SPACE / HTAB

SPACE      = %x20

HTAB       = %x09

The property value component of a content line has a format that is property specific. Refer to the section describing each property for a definition of this format ๐Ÿ“–.

All names of properties, property parameters, enumerated property values and property parameter values are case-insensitive. However, all other property values are case-sensitive, unless otherwise stated ๐Ÿ’–.

4.1.1 List and Field Separators โœ‚๏ธ

Some properties and parameters allow a list of values. Values in a list of values MUST be separated by a COMMA character (US-ASCII decimal 44). There is no significance to the order of values in a list. For those parameter values (such as those that specify URI values) that are specified in quoted-strings, the individual quoted-strings are separated by a COMMA character (US-ASCII decimal 44).

Some property values are defined in terms of multiple parts. These structured property values MUST have their value parts separated by a SEMICOLON character (US-ASCII decimal 59).

Some properties allow a list of parameters. Each property parameter in a list of property parameters MUST be separated by a SEMICOLON character (US-ASCII decimal 59).

Property parameters with values containing a COLON, a SEMICOLON or a COMMA character MUST be placed in quoted text.

For example, in the following properties a SEMICOLON is used to separate property parameters from each other, and a COMMA is used to separate property values in a value list ๐ŸŒˆ.

ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT:MAILTO:
 jsmith@host.com

RDATE;VALUE=DATE:19970304,19970504,19970704,19970904

4.1.2 Multiple Values ๐Ÿฆ‹

Some properties defined in the iCalendar object can have multiple values. The general rule for encoding multi-valued items is to simply create a new content line for each value, including the property name. However, it should be noted that some properties support encoding multiple values in a single property by separating the values with a COMMA character (US-ASCII decimal 44). Individual property definitions should be consulted for determining whether a specific property allows multiple values and in which of these two forms ๐Ÿค“.

4.1.3 Binary Content โœจ

okay so bestie, binary stuff in an iCalendar object has a strong preference for being linked, not stuffed inside. the binary content SHOULD be referenced with a URI inside a property value ๐Ÿฆ‹ so the actual file lives in an external MIME entity that the calendar can point at. only when that's not doable can you include binary content directly, and even then it has to be turned into text with the "BASE64" encoding from [RFC 2045] first ๐Ÿ“ inline binary should only show up when the situation really needs the whole iCalendar object to be one single entity. and whenever a property has inline binary content, it MUST specify the "ENCODING" property parameter ๐Ÿ’… anything that sits outside the iCalendar object MUST be referenced by a uniform resource identifier (URI), no exceptions ๐Ÿ”ฅ

here's an ATTACH property pointing at an outside file with a URI:

ATTACH:http://xyz.com/public/quarterly-report.doc

and here's one with inline binary content that's been encoded:

ATTACH;FMTTYPE=image/basic;ENCODING=BASE64;VALUE=BINARY:
 MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1U
 EBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zIE
   <...remainder of "BASE64" encoded binary data...>

4.1.4 Character Set ๐ŸŒธ

so here's the tea ๐Ÿซ– there's no property parameter for declaring the character set of a property value. the default is UTF-8, as defined in [RFC 2279] โœจ if you're using MIME transports, the "charset" Content-Type parameter is how you can name any other character set that's registered with IANA ๐Ÿ’œ


4.2 Property Parameters ๐ŸŽ€

okay this part is my favourite ๐Ÿ˜ญ a property can have attributes attached to it, and these "property parameters" are basically meta-information about the property or its value ๐Ÿงš they tell you things like where an alternate text version lives, what language a text value is in, what data type the value is, and a bunch of other stuff ๐Ÿ’…

these rules are so important, babe. property parameter values with a COLON (US-ASCII decimal 58), SEMICOLON (US-ASCII decimal 59) or COMMA (US-ASCII decimal 44) character separator MUST be written as quoted-string text values ๐Ÿ”ฅ and property parameter values MUST NOT contain the DOUBLE-QUOTE (US-ASCII decimal 22) character. the DOUBLE-QUOTE (US-ASCII decimal 22) is only used as a delimiter around parameter values that have restricted characters or URI text, like this:

DESCRIPTION;ALTREP="http://www.wiz.org":The Fall'98 Wild Wizards
 Conference - - Las Vegas, NV, USA

also, property parameter values that aren't in quoted strings are case insensitive ๐Ÿฆ‹

the general property parameters this memo defines are written in the following notation, so here's the full menu ๐Ÿ‘‘

parameter  = altrepparam           ; Alternate text representation
           / cnparam               ; Common name
           / cutypeparam           ; Calendar user type
           / delfromparam          ; Delegator
           / deltoparam            ; Delegatee
           / dirparam              ; Directory entry
           / encodingparam         ; Inline encoding
           / fmttypeparam          ; Format type
           / fbtypeparam           ; Free/busy time type
           / languageparam         ; Language for text
           / memberparam           ; Group or list membership
           / partstatparam         ; Participation status
           / rangeparam            ; Recurrence identifier range
           / trigrelparam          ; Alarm trigger relationship
           / reltypeparam          ; Relationship type
           / roleparam             ; Participation role
           / rsvpparam             ; RSVP expectation
           / sentbyparam           ; Sent by
           / tzidparam             ; Reference to time zone object
           / valuetypeparam        ; Property value data type
           / ianaparam
   ; Some other IANA registered iCalendar parameter.
           / xparam
   ; A non-standard, experimental parameter.

ianaparam  = iana-token "=" param-value *("," param-value)

xparam     =x-name "=" param-value *("," param-value)

4.2.1 Alternate Text Representation ๐ŸŒˆ

Parameter Name: ALTREP

Purpose: to point at an alternate text representation for the property value ๐Ÿงš

Format Definition: the property parameter is written like this:

altrepparam        = "ALTREP" "=" DQUOTE uri DQUOTE

Description: this parameter gives a URI that points to an alternate representation of a textual property value ๐Ÿ’– a property using this parameter MUST also include a value that reflects the default representation of the text. each individual URI parameter value MUST be in its own quoted-string, so no skipping the quotes, bestie ๐Ÿ™ˆ

Example:

DESCRIPTION;ALTREP="CID:<part3.msg.970415T083000@host.com>":Project
 XYZ Review Meeting will include the following agenda items: (a)
 Market Overview, (b) Finances, (c) Project Management

the "ALTREP" parameter value might point at a "text/html" content portion, which looks like this ๐ŸŒธ

Content-Type:text/html
Content-Id:<part3.msg.970415T083000@host.com>

<html><body>
<p><b>Project XYZ Review Meeting</b> will include the following
agenda items:<ol><li>Market
Overview</li><li>Finances</li><li>Project Management</li></ol></p>
</body></html>

4.2.2 Common Name ๐Ÿ’œ

Parameter Name: CN

Purpose: to name the common name linked to the calendar user the property is about ๐ŸŽ€

Format Definition: the property parameter is written like this:

cnparam    = "CN" "=" param-value

Description: you can put this parameter on properties with a CAL-ADDRESS value type โœจ it gives the common name for the calendar user the property specifies, and the value is text. that text can be used as display text for the calendar address in the property ๐Ÿ’…

Example:

ORGANIZER;CN="John Smith":MAILTO:jsmith@host.com

4.2.3 Calendar User Type ๐Ÿ‘‘

Parameter Name: CUTYPE

Purpose: to say what type of calendar user the property is describing ๐Ÿฆ‹

Format Definition: the property parameter is written like this:

cutypeparam        = "CUTYPE" "="
                    ("INDIVIDUAL"          ; An individual
                   / "GROUP"               ; A group of individuals
                   / "RESOURCE"            ; A physical resource
                   / "ROOM"                ; A room resource
                   / "UNKNOWN"             ; Otherwise not known
                   / x-name                ; Experimental type
                   / iana-token)           ; Other IANA registered
                                           ; type
; Default is INDIVIDUAL

Description: you can use this parameter on properties with a CAL-ADDRESS value type ๐ŸŒˆ it identifies the kind of calendar user the property specifies. if it isn't specified on a property that allows this parameter, the default is INDIVIDUAL ๐Ÿซถ

Example:

ATTENDEE;CUTYPE=GROUP:MAILTO:ietf-calsch@imc.org

4.2.4 Delegators ๐Ÿงš

Parameter Name: DELEGATED-FROM

Purpose: to name the calendar users who have handed their participation over to the calendar user the property is about ๐Ÿ’Œ

Format Definition: the property parameter is written like this:

delfromparam       = "DELEGATED-FROM" "=" DQUOTE cal-address DQUOTE
                     *("," DQUOTE cal-address DQUOTE)

Description: this can go on properties with a CAL-ADDRESS value type, and also on a property whose value type is a calendar address ๐Ÿ“ it lists the calendar users who delegated their participation in a group scheduled event or to-do to the calendar user in the property. the value MUST be a MAILTO URI as defined in [RFC 1738] ๐Ÿ”ฅ and each individual calendar address parameter value MUST be wrapped in its own quoted-string ๐Ÿ™ˆ

Example:

ATTENDEE;DELEGATED-FROM="MAILTO:jsmith@host.com":MAILTO:
 jdoe@host.com

4.2.5 Delegatees ๐Ÿฆ‹

Parameter Name: DELEGATED-TO

Purpose: to name the calendar users that the calendar user in the property has delegated participation to ๐ŸŒธ

Format Definition: the property parameter is written like this:

deltoparam = "DELEGATED-TO" "=" DQUOTE cal-address DQUOTE
             *("," DQUOTE cal-address DQUOTE)

Description: you can put this on properties with a CAL-ADDRESS value type โœจ it specifies the calendar users who have been delegated participation in a group scheduled event or to-do by the calendar user in the property. the value MUST be a MAILTO URI as defined in [RFC 1738] ๐Ÿ’… and each individual calendar address parameter value MUST be in a quoted-string ๐Ÿซถ

Example:

ATTENDEE;DELEGATED-TO="MAILTO:jdoe@host.com","MAILTO:jqpublic@
 host.com":MAILTO:jsmith@host.com

4.2.6 Directory Entry Reference ๐ŸŽ€

Parameter Name: DIR

Purpose: to reference a directory entry linked to the calendar user in the property ๐Ÿงš

Format Definition: the property parameter is written like this:

dirparam   = "DIR" "=" DQUOTE uri DQUOTE

Description: you can use this on properties with a CAL-ADDRESS value type ๐Ÿ’– it points at the directory entry for the calendar user in the property, and the parameter value is a URI. each individual URI parameter value MUST be wrapped in a quoted-string ๐Ÿ™ˆ

Example:

ORGANIZER;DIR="ldap://host.com:6666/o=eDABC%20Industries,c=3DUS??
 (cn=3DBJim%20Dolittle)":MAILTO:jimdo@host1.com

4.2.7 Inline Encoding ๐ŸŒˆ

Parameter Name: ENCODING

Purpose: to specify an alternate inline encoding for the property value ๐Ÿ’œ

Format Definition: the property parameter is written like this:

encodingparam      = "ENCODING" "="
                     ("8BIT"
    ; "8bit" text encoding is defined in [RFC 2045]
                    / "BASE64"
    ; "BASE64" binary encoding format is defined in [RFC 2045]
                    / iana-token
    ; Some other IANA registered iCalendar encoding type
                    / x-name)
    ; A non-standard, experimental encoding type

Description: this parameter names the inline encoding used in a property value ๐Ÿฆ‹ the default encoding is "8BIT", which matches a property value made of text. the "BASE64" encoding type matches a property value encoded with the "BASE64" encoding defined in [RFC 2045] ๐Ÿ“

if the value type parameter is ";VALUE=BINARY", then the inline encoding parameter MUST be specified with the value ";ENCODING=BASE64" ๐Ÿ”ฅ no way around it, bestie ๐Ÿ’€

Example:

ATTACH;FMTYPE=IMAGE/JPEG;ENCODING=BASE64;VALUE=BINARY:MIICajC
 CAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDA
 qBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uMRw
   <...remainder of "BASE64" encoded binary data...>

4.2.8 Format Type ๐Ÿ“Ž

Parameter Name: FMTTYPE

Purpose: To specify the content type of a referenced object. ๐ŸŽ€

Format Definition: The property parameter is defined by the following notation:

fmttypeparam       = "FMTTYPE" "=" iana-token
                                   ; A IANA registered content type
                    / x-name
                                   ; A non-standard content type

Description: Okay so this one hangs out on properties that point at an object ๐Ÿ”—. It lets you say what kind of content the referenced thing is. Like, an FTP URI on the "ATTACH" property doesn't tell you by itself what's inside, so this parameter fills in the gap ๐Ÿ’…. The parameter value MUST be the TEXT for either an IANA registered content type or a non-standard content type. โœจ

Example:

 ATTACH;FMTTYPE=application/binary:ftp://domain.com/pub/docs/
  agenda.doc

4.2.9 Free/Busy Time Type ๐Ÿฆ‹

Parameter Name: FBTYPE

Purpose: To specify the free or busy time type. ๐ŸŒธ

Format Definition: The property parameter is defined by the following notation:

fbtypeparam        = "FBTYPE" "=" ("FREE" / "BUSY"
                   / "BUSY-UNAVAILABLE" / "BUSY-TENTATIVE"
                   / x-name
   ; Some experimental iCalendar data type.
                   / iana-token)

   ; Some other IANA registered iCalendar data type.

Description: This one is about how a time block is marked ๐Ÿ•ฐ๏ธ. FREE means the interval is open for scheduling ๐Ÿ“. BUSY means one or more events are booked in that slot ๐Ÿ“…. BUSY-UNAVAILABLE is the "absolutely do not book me" option ๐Ÿ™ˆ, and BUSY-TENTATIVE means something's been penciled in but isn't locked yet โœ๏ธ. If you leave it off on a property that allows it, the default is BUSY, so you're busy unless you say otherwise ๐Ÿ’€.

Example: Here's what it looks like on a FREEBUSY property ๐Ÿ‘‘:

FREEBUSY;FBTYPE=BUSY:19980415T133000Z/19980415T170000Z

4.2.10 Language ๐ŸŒ

Parameter Name: LANGUAGE

Purpose: To specify the language for text values in a property or property parameter. ๐Ÿ—ฃ๏ธ

Format Definition: The property parameter is defined by the following notation:

languageparam =    "LANGUAGE" "=" language

language = <Text identifying a language, as defined in [RFC 1766]>

Description: This parameter can go on properties with a text value type ๐Ÿ“. It tells you what language the text in the property or property parameter value is written in. The value of the language property parameter is whatever [RFC 1766] defines ๐ŸŒ.

Now, if this is being sent in a MIME entity, the Content-Language header field can set the default language for the entire body part ๐ŸŽ€. If you don't do that, no default language is assumed, so nobody's guessing for you ๐Ÿคทโ€โ™€๏ธ.

Example:

SUMMARY;LANGUAGE=us-EN:Company Holiday Party

LOCATION;LANGUAGE=en:Germany
LOCATION;LANGUAGE=no:Tyskland

Next up, this one shows Quoted-Printable encoding doing its thing for non-ASCII characters ๐Ÿ‡ฉ๐Ÿ‡ฐ โœจ:

LOCATION;LANGUAGE=da:K=F8benhavn
LOCATION;LANGUAGE=en:Copenhagen

4.2.11 Group or List Membership ๐Ÿ‘ฏโ€โ™€๏ธ

Parameter Name: MEMBER

Purpose: To specify the group or list membership of the calendar user specified by the property. ๐Ÿ’œ

Format Definition: The property parameter is defined by the following notation:

memberparam        = "MEMBER" "=" DQUOTE cal-address DQUOTE
                     *("," DQUOTE cal-address DQUOTE)

Description: This parameter can go on properties with a CAL-ADDRESS value type ๐Ÿ“ฎ. It says which groups or lists the calendar user from the property belongs to. The parameter value is either one calendar address in a quoted-string, or a list of calendar addresses separated by COMMA characters (US-ASCII decimal 44), each one in its own quoted-string ๐Ÿง. Each individual calendar address parameter value MUST be specified in a quoted-string, so keep those quotes on, bestie ๐Ÿซถ.

Example:

ATTENDEE;MEMBER="MAILTO:ietf-calsch@imc.org":MAILTO:jsmith@host.com

ATTENDEE;MEMBER="MAILTO:projectA@host.com","MAILTO:projectB@host.
 com":MAILTO:janedoe@host.com

4.2.12 Participation Status ๐Ÿ™‹โ€โ™€๏ธ

Parameter Name: PARTSTAT

Purpose: To specify the participation status for the calendar user specified by the property. โœจ

Format Definition: The property parameter is defined by the following notation. This one has three flavours, one for each kind of calendar component ๐Ÿฐ:

partstatparam      = "PARTSTAT" "="
                    ("NEEDS-ACTION"        ; Event needs action
                   / "ACCEPTED"            ; Event accepted
                   / "DECLINED"            ; Event declined
                   / "TENTATIVE"           ; Event tentatively
                                           ; accepted
                   / "DELEGATED"           ; Event delegated
                   / x-name                ; Experimental status
                   / iana-token)           ; Other IANA registered
                                           ; status
; These are the participation statuses for a "VEVENT". Default is
; NEEDS-ACTION
partstatparam      /= "PARTSTAT" "="
                    ("NEEDS-ACTION"        ; To-do needs action
                   / "ACCEPTED"            ; To-do accepted
                   / "DECLINED"            ; To-do declined
                   / "TENTATIVE"           ; To-do tentatively
                                           ; accepted
                   / "DELEGATED"           ; To-do delegated
                   / "COMPLETED"           ; To-do completed.
                                           ; COMPLETED property has
                                           ;date/time completed.
                   / "IN-PROCESS"          ; To-do in process of
                                           ; being completed
                   / x-name                ; Experimental status
                   / iana-token)           ; Other IANA registered
                                           ; status
; These are the participation statuses for a "VTODO". Default is
; NEEDS-ACTION

partstatparam      /= "PARTSTAT" "="
                    ("NEEDS-ACTION"        ; Journal needs action
                   / "ACCEPTED"            ; Journal accepted
                   / "DECLINED"            ; Journal declined
                   / x-name                ; Experimental status
                   / iana-token)           ; Other IANA registered
                                           ; status
; These are the participation statuses for a "VJOURNAL". Default is
; NEEDS-ACTION

Description: This one goes on properties with a CAL-ADDRESS value type ๐ŸŽŸ๏ธ. It tells you where the calendar user stands on the invite. The values change depending on whether the thing is a group scheduled "VEVENT", "VTODO" or "VJOURNAL", so the statuses are a bit of a mood ring ๐Ÿ”ฎ. The values MUST match one of the values allowed for the given calendar component, no exceptions ๐Ÿšซ. If you leave it off on a property that allows it, the default is NEEDS-ACTION, which is basically "still waiting on you" ๐Ÿ’….

Example:

ATTENDEE;PARTSTAT=DECLINED:MAILTO:jsmith@host.com

4.2.13 Recurrence Identifier Range ๐Ÿ”

Parameter Name: RANGE

Purpose: To specify the effective range of recurrence instances from the instance specified by the recurrence identifier specified by the property. ๐ŸŒˆ

Format Definition: The property parameter is defined by the following notation:

rangeparam = "RANGE" "=" ("THISANDPRIOR"
   ; To specify all instances prior to the recurrence identifier
           / "THISANDFUTURE")
   ; To specify the instance specified by the recurrence identifier
   ; and all subsequent recurrence instances

Description: This can go on a property that specifies a recurrence identifier ๐Ÿง . It says how far the effect reaches, starting from the recurrence identifier on the property. If you don't include this parameter on an allowed property, the default range is just the single instance that the recurrence identifier value points to, so it's a one-and-done ๐ŸŽฏ. THISANDPRIOR covers that instance plus all the ones before it โช, and THISANDFUTURE covers that instance plus all the ones after it โฉ. Iconic range energy ๐Ÿ‘‘.

Example:

RECURRENCE-ID;RANGE=THISANDPRIOR:19980401T133000Z

4.2.14 Alarm Trigger Relationship โฐ

Parameter Name: RELATED

Purpose: To specify the relationship of the alarm trigger with respect to the start or end of the calendar component. ๐Ÿ””

Format Definition: The property parameter is defined by the following notation:

trigrelparam       = "RELATED" "="
                    ("START"       ; Trigger off of start
                   / "END")        ; Trigger off of end

Description: This can go on properties that set an alarm trigger with a DURATION value type โณ. It decides whether the alarm goes off relative to the start or the end of the calendar component. START triggers off the start, and END triggers off the end. If you don't specify it on an allowed property, the default is START, so it's giving "start of the party" energy ๐ŸŽ‰.

Example:

TRIGGER;RELATED=END:PT5M

4.2.15 Relationship Type ๐ŸŒณ

Parameter Name: RELTYPE

Purpose: To specify the type of hierarchical relationship associated with the calendar component specified by the property. ๐Ÿงฌ

Format Definition: The property parameter is defined by the following notation:

reltypeparam       = "RELTYPE" "="
                    ("PARENT"      ; Parent relationship. Default.
                   / "CHILD"       ; Child relationship
                   / "SIBLING      ; Sibling relationship
                   / iana-token    ; Some other IANA registered
                                   ; iCalendar relationship type
                   / x-name)       ; A non-standard, experimental
                                   ; relationship type

Description: This one goes on a property that references another related calendar ๐Ÿ—‚๏ธ. It says what kind of hierarchy links the referenced component to the one the property belongs to. PARENT means the referenced component is a superior ๐Ÿ‘‘, CHILD means it's a subordinate ๐Ÿงธ, and SIBLING means it's a peer ๐Ÿ‘ฏ. If you don't specify it on an allowed property, the default is PARENT, because every family needs a boss ๐Ÿ’….

Example:

RELATED-TO;RELTYPE=SIBLING:<19960401-080045-4000F192713@host.com>

4.2.16 Participation Role โœจ

Parameter Name: ROLE ๐ŸŽ€

Purpose: okay so this one tells you what job the calendar user has in a group event ๐Ÿงš It's giving "who is this person and what are they doing here" ๐Ÿ’…

Format Definition: here's the notation, bestie ๐ŸŒธ

  roleparam  = "ROLE" "="
              ("CHAIR"               ; Indicates chair of the
                                     ; calendar entity
             / "REQ-PARTICIPANT"     ; Indicates a participant whose
                                     ; participation is required
             / "OPT-PARTICIPANT"     ; Indicates a participant whose
                                     ; participation is optional
             / "NON-PARTICIPANT"     ; Indicates a participant who is
                                     ; copied for information
                                     ; purposes only
             / x-name                ; Experimental role
             / iana-token)           ; Other IANA role
  ; Default is REQ-PARTICIPANT

Description: this parameter can go on properties with a CAL-ADDRESS value type ๐Ÿ’– It specifies the participation role for the calendar user named by the property, inside the group schedule calendar component โœจ If it's not specified on a property that allows it, the default is REQ-PARTICIPANT, so no drama ๐Ÿซถ

Example:

  ATTENDEE;ROLE=CHAIR:MAILTO:mrbig@host.com

4.2.17 RSVP Expectation ๐Ÿฆ‹

Parameter Name: RSVP ๐Ÿ’œ

Purpose: this one checks whether the calendar user is expected to send back a reply ๐Ÿ“ Like, "pls respond bestie" energy ๐Ÿ˜ญ

Format Definition:

  rsvpparam = "RSVP" "=" ("TRUE" / "FALSE")
  ; Default is FALSE

Description: also goes on CAL-ADDRESS properties ๐ŸŒˆ It identifies whether a reply is expected from the calendar user named by the property value. The Organizer uses this to ask an Attendee of a group scheduled event or to-do for a participation status reply ๐Ÿ‘‘ If it's not specified on a property that allows it, the default is FALSE ๐Ÿ’…

Example:

  ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host.com

4.2.18 Sent By ๐Ÿงš

Parameter Name: SENT-BY ๐ŸŒธ

Purpose: this is for when someone is acting on behalf of the calendar user, like an assistant doing the work ๐Ÿ’– Main character energy for the delegate ๐Ÿ’…

Format Definition:

  sentbyparam        = "SENT-BY" "=" DQUOTE cal-address DQUOTE

Description: also on CAL-ADDRESS properties โœจ It names the calendar user who is acting on behalf of the calendar user named by the property ๐Ÿซถ The parameter value MUST be a MAILTO URI as defined in [RFC 1738]. Each individual calendar address parameter value MUST be written as a quoted-string ๐ŸŽ€

Example:

  ORGANIZER;SENT-BY:"MAILTO:sray@host.com":MAILTO:jsmith@host.com

4.2.19 Time Zone Identifier ๐ŸŒ

Parameter Name: TZID ๐Ÿฆ‹

Purpose: this names the time zone definition used for the time part of the property value โญ Like, which clock are we even talking about ๐Ÿ™ˆ

Format Definition:

  tzidparam  = "TZID" "=" [tzidprefix] paramtext CRLF

  tzidprefix = "/"

Description: okay so this MUST be specified on DTSTART, DTEND, DUE, EXDATE and RDATE when a DATE-TIME or TIME value type is used, and the value is neither UTC nor "floating" time ๐Ÿ˜ญ Check out the DATE-TIME and TIME value type definitions for what UTC and "floating time" look like ๐Ÿ’œ This parameter gives a text value that uniquely identifies the VTIMEZONE calendar component to use when evaluating the time portion of the property ๐ŸŒธ The TZID value MUST equal the TZID property value of the matching time zone definition ๐Ÿ’– Every unique TZID parameter value in the iCalendar object MUST have its own VTIMEZONE calendar component ๐Ÿซถ

The parameter MUST be specified on properties with a DATE-TIME value if the DATE-TIME is neither UTC nor "floating" time ๐ŸŽ€

The SOLIDUS character (US-ASCII decimal 47) as a prefix means this TZID is a unique ID in a globally defined time zone registry, assuming one is defined ๐ŸŒˆ

Note: This document does not define a naming convention for time zone identifiers. Implementers may want to use the naming conventions defined in existing time zone specifications such as the public-domain Olson database [TZ]. The specification of globally unique time zone identifiers is not addressed by this document and is left for future study. ๐Ÿงš

The following are examples of this property parameter ๐Ÿ’…

  DTSTART;TZID=US-Eastern:19980119T020000

  DTEND;TZID=US-Eastern:19980119T030000

The TZID property parameter MUST NOT be applied to DATE-TIME or TIME properties whose time values are specified in UTC ๐Ÿ™…โ€โ™€๏ธ

Local time in a DATE-TIME or TIME value without the TZID property parameter is to be read as a local time value, no matter whether there are VTIMEZONE calendar components in the iCalendar object ๐ŸŒ™

For more info, check the sections on the data types DATE-TIME and TIME ๐Ÿฆ‹


4.2.20 Value Data Types ๐Ÿ’ซ

Parameter Name: VALUE ๐ŸŒท

Purpose: this explicitly sets the data type format for a property value ๐Ÿ“

Format Definition:

  valuetypeparam = "VALUE" "=" valuetype

  valuetype  = ("BINARY"
              / "BOOLEAN"
              / "CAL-ADDRESS"
              / "DATE"
              / "DATE-TIME"
              / "DURATION"
              / "FLOAT"
              / "INTEGER"
              / "PERIOD"
              / "RECUR"
              / "TEXT"
              / "TIME"
              / "URI"
              / "UTC-OFFSET"
              / x-name
              ; Some experimental iCalendar data type.
              / iana-token)
              ; Some other IANA registered iCalendar data type.

Description: the parameter sets the data type and format of the property value ๐Ÿ’… Property values MUST be of a single value type ๐Ÿซถ For example, a RDATE property cannot mix DATE-TIME and TIME value types ๐Ÿ™ˆ

If the property's value is the default value type, you don't need to specify this parameter ๐ŸŒธ But if the default value type gets overridden by some other allowable value type, then this parameter MUST be specified โœจ


4.3 Property Value Data Types ๐ŸŽ€

The properties in an iCalendar object are strongly typed ๐Ÿ’– The definition of each property restricts the value to one of the value data types, or simply value types, defined in this section ๐Ÿฆ‹ The value type for a property is either implicitly the default value type or explicitly specified with the VALUE parameter ๐ŸŒˆ If the value type of a property is one of the alternate valid types, then it MUST be explicitly specified with the VALUE parameter ๐Ÿ‘‘


4.3.1 Binary ๐Ÿ’œ

Value Name: BINARY ๐Ÿงš

Purpose: this value type identifies properties that contain a character encoding of inline binary data ๐ŸŒธ For example, an inline attachment of object code might be included in an iCalendar object ๐Ÿ’ป

Formal Definition:

  binary     = *(4b-char) [b-end]
  ; A "BASE64" encoded character string, as defined by [RFC 2045].

  b-end      = (2b-char "==") / (3b-char "=")

  b-char = ALPHA / DIGIT / "+" / "/"

Description: property values with this value type MUST also include the inline encoding parameter sequence of ;ENCODING=BASE64 ๐Ÿ’– So all inline binary data MUST first be character encoded using the BASE64 method defined in [RFC 2045] ๐Ÿซถ No additional content value encoding (i.e., BACKSLASH character encoding) is defined for this value type ๐Ÿ™…โ€โ™€๏ธ

Example: here's an abridged BASE64 binary value ๐ŸŒˆ

  ATTACH;VALUE=BINARY;ENCODING=BASE64:MIICajCCAdOgAwIBAgICBEUwDQY
   JKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlI
   ENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZv
     <...remainder of "BASE64" encoded binary data...>

4.3.2 Boolean โœจ

Value Name: BOOLEAN ๐Ÿ’…

Purpose: this value type identifies properties that contain either a "TRUE" or "FALSE" Boolean value ๐Ÿฆ‹

Formal Definition:

  boolean    = "TRUE" / "FALSE"

Description: these values are case insensitive text ๐ŸŒธ No additional content value encoding (i.e., BACKSLASH character encoding) is defined for this value type ๐Ÿซถ

Example: here's a hypothetical property with a BOOLEAN value type ๐Ÿ‘€

  GIBBERISH:TRUE

4.3.3 Calendar User Address ๐ŸŒท

Value Name: CAL-ADDRESS ๐Ÿงš

Purpose: this value type identifies properties that contain a calendar user address ๐Ÿ’–

Formal Definition:

  cal-address        = uri

Description: the value is a URI as defined by [RFC 1738] or any other IANA registered form for a URI ๐ŸŒˆ When it's used to address an Internet email transport address for a calendar user, the value MUST be a MAILTO URI, as defined by [RFC 1738] ๐Ÿ’œ No additional content value encoding (i.e., BACKSLASH character encoding) is defined for this value type ๐Ÿ™…โ€โ™€๏ธ

Example:

  ATTENDEE:MAILTO:jane_doe@host.com

4.3.4 Date โœจ

Value Name: DATE

Purpose: okay so DATE is the value type for when you only care about which day it is, no clock time needed ๐Ÿ“…๐Ÿ’–

Formal Definition: here's the notation, bestie ๐ŸŽ€

date               = date-value

date-value         = date-fullyear date-month date-mday
date-fullyear      = 4DIGIT
date-month         = 2DIGIT        ;01-12
date-mday          = 2DIGIT        ;01-28, 01-29, 01-30, 01-31
                                   ;based on month/year

Description: if the property allows it, you can list several "date" values separated by a COMMA character (US-ASCII decimal 44) ๐Ÿ“ The format is the [ISO 8601] complete representation, basic format for a calendar date. So you get a four-digit year, a two-digit month, and a two-digit day, with no separator characters between them. Clean, iconic โœจ

No additional content value encoding (i.e., BACKSLASH character encoding) is defined for this value type.

Example: July 14, 1997 looks like this ๐ŸŒธ

19970714

4.3.5 Date-Time ๐Ÿฆ‹

Value Name: DATE-TIME

Purpose: this one is for a precise calendar date and time of day, so you get the full picture ๐Ÿ•ฐ๏ธ

Formal Definition: the notation is:

date-time  = date "T" time ;As specified in the date and time
                           ;value definitions

Description: if the property permits it, you can list multiple "date-time" values separated by a COMMA character (US-ASCII decimal 44). No additional content value encoding (i.e., BACKSLASH character encoding) is defined for this value type.

The "DATE-TIME" data type is based on the [ISO 8601] complete representation, basic format for a calendar date and time of day. You write the "date", then the LATIN CAPITAL LETTER T character (US-ASCII decimal 84) as the time designator, then the "time" format. Super simple, super cute ๐Ÿ’…

The "DATE-TIME" data type expresses time values in three forms, and each one is a little different:

  • Form #1: date with local time
  • Form #2: date with UTC time
  • Form #3: date with local time and a time zone reference

First though, the form with a UTC offset is a no-go ๐Ÿ™…โ€โ™€๏ธ It MUST NOT be used. For example, this is not valid for a date-time value:

DTSTART:19980119T230000-0800       ;Invalid time format

FORM #1: DATE WITH LOCAL TIME ๐ŸŒ™

This is just a date-time value with no UTC designator and no time zone reference. For example, this represents January 18, 1998, at 11 PM:

DTSTART:19980118T230000

These values are called "floating" because they aren't tied to any particular time zone. They stay the same hour, minute, and second no matter which time zone is being observed. Say an event shows that a person is busy from 11:00 AM to 1:00 PM every day, no matter where they are. A local time is perfect for that ๐Ÿงš The recipient of an iCalendar object with a local time value, and no time zone info, SHOULD interpret the value as fixed to whatever time zone the ATTENDEE is in at any given moment. That means two ATTENDEEs in different time zones could get the same floating event and be in it at totally different real-world times ๐Ÿ˜ญ So floating time SHOULD only be used where that's the reasonable behavior.

Most of the time you want a fixed time, though. To communicate a fixed time properly, you MUST specify either UTC time or local time with a time zone reference ๐Ÿ”’

The use of local time in a DATE-TIME value without the TZID property parameter is to be interpreted as floating time, even if there are "VTIMEZONE" calendar components in the iCalendar object. Floating means floating, periodt ๐Ÿ’œ

FORM #2: DATE WITH UTC TIME ๐ŸŒ

This is the absolute time form. You add a LATIN CAPITAL LETTER Z suffix (US-ASCII decimal 90), the UTC designator, to the end of the time value. For example, this represents January 19, 1998, at 0700 UTC:

DTSTART:19980119T070000Z

The TZID property parameter MUST NOT be applied to DATE-TIME properties whose time values are specified in UTC. Don't mix them, bestie โœจ

FORM #3: DATE WITH LOCAL TIME AND TIME ZONE REFERENCE ๐Ÿ—ฝ

Here you use the TZID property parameter to point at the right time zone definition. TZID gets its own deep dive in the section on Time Zone. For example, this represents 2 AM in New York on January 19, 1998:

DTSTART;TZID=US-Eastern:19980119T020000

Example: this is July 14, 1997, at 1:30 PM in New York City, shown in all three time formats using the "DTSTART" property ๐Ÿ—ฝ๐ŸŽ€

DTSTART:19970714T133000            ;Local time
DTSTART:19970714T173000Z           ;UTC time
DTSTART;TZID=US-Eastern:19970714T133000    ;Local time and time
                   ; zone reference

A time value MUST ONLY specify 60 seconds when it's showing the periodic "leap second" in the time value. For example:

COMPLETED:19970630T235960Z

4.3.6 Duration โณ

Value Name: DURATION

Purpose: this value type is for properties that hold an amount of time, like "how long is this thing" ๐Ÿ’–

Formal Definition: here's the notation:

dur-value  = (["+"] / "-") "P" (dur-date / dur-time / dur-week)

dur-date   = dur-day [dur-time]
dur-time   = "T" (dur-hour / dur-minute / dur-second)
dur-week   = 1*DIGIT "W"
dur-hour   = 1*DIGIT "H" [dur-minute]
dur-minute = 1*DIGIT "M" [dur-second]
dur-second = 1*DIGIT "S"
dur-day    = 1*DIGIT "D"

Description: if the property permits it, you can list several "duration" values separated by a COMMA character (US-ASCII decimal 44). The format is the [ISO 8601] basic format for a duration of time, and it can express weeks, days, hours, minutes, and seconds. Very flexible, very slay ๐Ÿ’…

No additional content value encoding (i.e., BACKSLASH character encoding) is defined for this value type.

Example: 15 days, 5 hours, and 20 seconds looks like this ๐Ÿง

P15DT5H0M20S

And 7 weeks looks like this ๐ŸŒˆ

P7W

4.3.7 Float ๐ŸŒŠ

Value Name: FLOAT

Purpose: this one is for properties holding a real number value ๐Ÿ”ขโœจ

Formal Definition: here's the notation:

float      = (["+"] / "-") 1*DIGIT ["." 1*DIGIT]

Description: if the property permits it, you can list multiple "float" values separated by a COMMA character (US-ASCII decimal 44).

No additional content value encoding (i.e., BACKSLASH character encoding) is defined for this value type.

Example: ๐Ÿฆ‹

1000000.0000001
1.333
-3.14

4.3.8 Integer ๐Ÿ”Ÿ

Value Name: INTEGER

Purpose: this value type is for properties holding a signed integer value ๐Ÿ’œ

Formal Definition: the notation is:

integer    = (["+"] / "-") 1*DIGIT

Description: if the property permits it, you can list multiple "integer" values separated by a COMMA character (US-ASCII decimal 44). The valid range for "integer" is -2147483648 to 2147483647 ๐Ÿซถ If the sign isn't specified, the value is assumed to be positive.

No additional content value encoding (i.e., BACKSLASH character encoding) is defined for this value type.

Example: ๐Ÿ“

1234567890
-1234567890
+1234567890
432109876

4.3.9 Period of Time ๐ŸŽ€

Value Name: PERIOD

Purpose: this value type is for values holding a precise period of time, like a start and an end, or a start and a length โฐ

Formal Definition: the data type is defined by this notation:

period     = period-explicit / period-start

period-explicit = date-time "/" date-time
; [ISO 8601] complete representation basic format for a period of
; time consisting of a start and end. The start MUST be before the
; end.

period-start = date-time "/" dur-value
; [ISO 8601] complete representation basic format for a period of
; time consisting of a start and positive duration of time.

Description: if the property permits it, you can list multiple "period" values separated by a COMMA character (US-ASCII decimal 44). There are two ways to write a period. The first is by its start and its end. That's the [ISO 8601] complete representation, basic format for the "DATE-TIME" start, then a SOLIDUS character (US-ASCII decimal 47), then the "DATE-TIME" end. The start MUST be before the end of the period, no exceptions ๐Ÿ™…โ€โ™€๏ธ The second way is by a start and a positive duration. That's the [ISO 8601] complete representation, basic format for the "DATE-TIME" start, then a SOLIDUS character (US-ASCII decimal 47), then the [ISO 8601] basic format for the "DURATION" of the period.

Example: a period from 18:00:00 UTC on January 1, 1997, to 07:00:00 UTC on January 2, 1997, looks like this ๐ŸŒ™

19970101T180000Z/19970102T070000Z

A period starting at 18:00:00 on January 1, 1997, and lasting 5 hours and 30 minutes looks like this โœจ

19970101T180000Z/PT5H30M

No additional content value encoding (i.e., BACKSLASH character encoding) is defined for this value type. ๐Ÿ’–

4.3.10 Recurrence Rule ๐Ÿ”

Value Name: RECUR ๐Ÿ’–

Purpose: Okay so this value type is for properties that hold a recurrence rule specification ๐Ÿฆ‹. It's the part that says "and then it happens AGAIN" โœจ

Formal Definition: The value type is defined by the following notation ๐Ÿ“:

     recur      = "FREQ"=freq *(

                ; either UNTIL or COUNT may appear in a 'recur',
                ; but UNTIL and COUNT MUST NOT occur in the same 'recur'

                ( ";" "UNTIL" "=" enddate ) /
                ( ";" "COUNT" "=" 1*DIGIT ) /

                ; the rest of these keywords are optional,
                ; but MUST NOT occur more than once

                ( ";" "INTERVAL" "=" 1*DIGIT )          /
                ( ";" "BYSECOND" "=" byseclist )        /
                ( ";" "BYMINUTE" "=" byminlist )        /
                ( ";" "BYHOUR" "=" byhrlist )           /
                ( ";" "BYDAY" "=" bywdaylist )          /
                ( ";" "BYMONTHDAY" "=" bymodaylist )    /
                ( ";" "BYYEARDAY" "=" byyrdaylist )     /
                ( ";" "BYWEEKNO" "=" bywknolist )       /
                ( ";" "BYMONTH" "=" bymolist )          /
                ( ";" "BYSETPOS" "=" bysplist )         /
                ( ";" "WKST" "=" weekday )              /
                ( ";" x-name "=" text )
                )

     freq       = "SECONDLY" / "MINUTELY" / "HOURLY" / "DAILY"
                / "WEEKLY" / "MONTHLY" / "YEARLY"

     enddate    = date
     enddate    =/ date-time            ;An UTC value

     byseclist  = seconds / ( seconds *("," seconds) )

     seconds    = 1DIGIT / 2DIGIT       ;0 to 59

     byminlist  = minutes / ( minutes *("," minutes) )

     minutes    = 1DIGIT / 2DIGIT       ;0 to 59

     byhrlist   = hour / ( hour *("," hour) )

     hour       = 1DIGIT / 2DIGIT       ;0 to 23

     bywdaylist = weekdaynum / ( weekdaynum *("," weekdaynum) )

     weekdaynum = [([plus] ordwk / minus ordwk)] weekday

     plus       = "+"

     minus      = "-"

     ordwk      = 1DIGIT / 2DIGIT       ;1 to 53

     weekday    = "SU" / "MO" / "TU" / "WE" / "TH" / "FR" / "SA"
     ;Corresponding to SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
     ;FRIDAY, SATURDAY and SUNDAY days of the week.

     bymodaylist = monthdaynum / ( monthdaynum *("," monthdaynum) )

     monthdaynum = ([plus] ordmoday) / (minus ordmoday)

     ordmoday   = 1DIGIT / 2DIGIT       ;1 to 31

     byyrdaylist = yeardaynum / ( yeardaynum *("," yeardaynum) )

     yeardaynum = ([plus] ordyrday) / (minus ordyrday)

     ordyrday   = 1DIGIT / 2DIGIT / 3DIGIT      ;1 to 366

     bywknolist = weeknum / ( weeknum *("," weeknum) )
     weeknum    = ([plus] ordwk) / (minus ordwk)

     bymolist   = monthnum / ( monthnum *("," monthnum) )

     monthnum   = 1DIGIT / 2DIGIT       ;1 to 12

     bysplist   = setposday / ( setposday *("," setposday) )

     setposday  = yeardaynum

Description: Okay so if the property allows it, you can list several recur values separated by a COMMA (US-ASCII decimal 44) ๐Ÿ’Œ. The whole thing is a structured value made up of one or more recurrence grammar parts, and each part is a NAME=VALUE pair ๐Ÿงฉ. The parts are split apart by a SEMICOLON (US-ASCII decimal 59). Order doesn't matter at all, so no vibe check needed ๐Ÿซถ. Just know that each individual rule part MUST only be specified once ๐Ÿ’€.

The FREQ part is the main character ๐Ÿ‘‘ because it tells you what kind of recurrence rule you've got. It MUST be specified in the recurrence rule, no exceptions bestie ๐Ÿ™…. The valid values are:

  • SECONDLY: repeating events based on an interval of a second or more โฑ๏ธ
  • MINUTELY: repeating events based on an interval of a minute or more
  • HOURLY: repeating events based on an interval of an hour or more
  • DAILY: repeating events based on an interval of a day or more โ˜€๏ธ
  • WEEKLY: repeating events based on an interval of a week or more
  • MONTHLY: repeating events based on an interval of a month or more ๐ŸŒ™
  • YEARLY: repeating events based on an interval of a year or more ๐ŸŽ‚

The INTERVAL part is a positive integer that says how often the rule repeats ๐Ÿ”. If you don't include it, the default is 1, which means every second for a SECONDLY rule, every minute for a MINUTELY rule, every hour for an HOURLY rule, every day for a DAILY rule, every week for a WEEKLY rule, every month for a MONTHLY rule, and every year for a YEARLY rule ๐ŸŒธ.

The UNTIL part sets a date-time value that bounds the rule in an inclusive manner ๐Ÿšช. If the value in UNTIL lines up with the recurrence, that date or date-time becomes the very last instance ๐Ÿ. If you use a date-time value, then it MUST be specified in an UTC time format ๐Ÿ•ฐ๏ธ. And if neither UNTIL nor COUNT is there, the RRULE is considered to repeat forever โ™พ๏ธ.

The COUNT part sets how many occurrences you get before the recurrence is range-bound ๐ŸŽŸ๏ธ. If DTSTART is specified, it counts as the first occurrence ๐Ÿฅ‡.

The BYSECOND part is a COMMA-separated list of seconds within a minute, with valid values of 0 to 59 โฒ๏ธ. The BYMINUTE part is a COMMA-separated list of minutes within an hour, also 0 to 59 ๐Ÿ•ง. The BYHOUR part is a COMMA-separated list of hours of the day, with valid values of 0 to 23 ๐ŸŒ….

The BYDAY part is a COMMA-separated list of days of the week ๐Ÿ“…:

  • MO is Monday
  • TU is Tuesday
  • WE is Wednesday
  • TH is Thursday
  • FR is Friday
  • SA is Saturday
  • SU is Sunday

Each BYDAY value can also get a positive (+n) or negative (-n) integer in front of it ๐ŸŽฏ. If that's there, it means the nth occurrence of that day within a MONTHLY or YEARLY RRULE. So within a MONTHLY rule, +1MO (or just 1MO) is the first Monday of the month, while -1MO is the last Monday of the month ๐Ÿ†. If there's no integer modifier, it means all days of that type within the specified frequency. So within a MONTHLY rule, MO means every Monday in the month ๐Ÿ—“๏ธ.

The BYMONTHDAY part is a COMMA-separated list of days of the month (ASCII decimal 44) ๐Ÿ“†. Valid values are 1 to 31 or -31 to -1. For example, -10 is the tenth to the last day of the month ๐Ÿ™ƒ.

The BYYEARDAY part is a COMMA-separated list of days of the year ๐Ÿ“–. Valid values are 1 to 366 or -366 to -1. For example, -1 is the last day of the year (December 31st) ๐ŸŽ†, and -306 is the 306th to the last day of the year (March 1st) ๐ŸŒท.

The BYWEEKNO part is a COMMA-separated list of ordinals for weeks of the year ๐Ÿ—‚๏ธ. Valid values are 1 to 53 or -53 to -1. This matches the week numbering defined in [ISO 8601]. A week is a seven-day period that starts on whatever day is set as the week start (see WKST) ๐Ÿ“. Week number one of the calendar year is the first week that has at least four (4) days in that calendar year ๐Ÿฅณ. This part is only valid for YEARLY rules. For example, 3 is the third week of the year ๐ŸŒผ.

Note: Assuming a Monday week start, week 53 can only occur when Thursday is January 1 or if it is a leap year and Wednesday is January 1. ๐Ÿค“

The BYMONTH part is a COMMA-separated list of months of the year, with valid values of 1 to 12 ๐ŸŽˆ.

The WKST part says which day the workweek starts on ๐Ÿ’ผ. Valid values are MO, TU, WE, TH, FR, SA and SU. This matters when a WEEKLY RRULE has an interval greater than 1 and a BYDAY part is specified. It also matters in a YEARLY RRULE when a BYWEEKNO part is specified. The default value is MO โ˜•.

The BYSETPOS part is a COMMA-separated list of values that picks the nth occurrence within the set of events the rule makes ๐ŸŽฏ. Valid values are 1 to 366 or -366 to -1. It MUST only be used in conjunction with another BYxxx rule part ๐Ÿซถ. For example, "the last work day of the month" could be written like this:

RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1

Each BYSETPOS value can include a positive (+n) or negative (-n) integer. If it's there, it means the nth occurrence of that specific occurrence within the set of events the rule specifies ๐Ÿ’….

If you get BYxxx rule part values that are beyond the available scope (ie, BYMONTHDAY=30 in February), they're simply ignored ๐Ÿ™ˆ.

Info that isn't in the rule but is needed to figure out the start times and dates of each recurrence instance comes from the Start Time (DTSTART) entry attribute ๐Ÿง . For example, "FREQ=YEARLY;BYMONTH=1" doesn't pick out a specific day of the month or a time. That info would be the same as whatever is set for DTSTART โฐ.

BYxxx rule parts change the recurrence in some way ๐ŸŽ€. The ones for a period of time that's the same as or bigger than the frequency generally reduce or limit how many occurrences get generated. For example, "FREQ=DAILY;BYMONTH=1" shrinks the instances from every day (if there's no BYMONTH tag) to every day in January โ„๏ธ. The ones for a period of time smaller than the frequency generally expand how many occurrences you get. For example, "FREQ=YEARLY;BYMONTH=1,2" bumps the days in the yearly set from 1 (if there's no BYMONTH tag) up to 2 ๐ŸŒˆ.

If you've got multiple BYxxx rule parts, then after evaluating the FREQ and INTERVAL parts, the BYxxx parts get applied to the current set of evaluated occurrences in this order: BYMONTH, BYWEEKNO, BYYEARDAY, BYMONTHDAY, BYDAY, BYHOUR, BYMINUTE, BYSECOND and BYSETPOS. After that, COUNT and UNTIL get evaluated ๐Ÿง.

Here's an example of evaluating multiple BYxxx rule parts ๐Ÿ”:

     DTSTART;TZID=US-Eastern:19970105T083000
     RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;
      BYMINUTE=30

First, INTERVAL=2 gets applied to FREQ=YEARLY to get "every other year" ๐Ÿฆ‹. Then BYMONTH=1 gets applied to get "every January, every other year" โ„๏ธ. Then BYDAY=SU gets applied to get "every Sunday in January, every other year" โ˜€๏ธ. Then BYHOUR=8,9 gets applied to get "every Sunday in January at 8 AM and 9 AM, every other year" โฐ. Then BYMINUTE=30 gets applied to get "every Sunday in January at 8:30 AM and 9:30 AM, every other year" ๐Ÿ•ฃ. Then, since the RRULE doesn't give us the second, it gets pulled from DTSTART, so you end up with "every Sunday in January at 8:30:00 AM and 9:30:00 AM, every other year" ๐Ÿ’œ. Similarly, if the BYMINUTE, BYHOUR, BYDAY, BYMONTHDAY or BYMONTH part were missing, the matching minute, hour, day or month would be pulled from the DTSTART property ๐Ÿซ .

No extra content value encoding (i.e., BACKSLASH character encoding) is defined for this value type ๐Ÿ™…โ€โ™€๏ธ.

Example: Here's a rule that sets up 10 meetings that happen every other day ๐Ÿ“…:

     FREQ=DAILY;COUNT=10;INTERVAL=2

There are other examples in the "RRULE" specification too ๐Ÿ’–.

4.3.11 Text ๐Ÿ’ฌ

Value Name: TEXT

Purpose: okay so this value type is for anything that holds human readable text ๐Ÿ“

Formal Definition: the character sets supported by this revision of iCalendar are UTF-8 and US ASCII thereof ๐ŸŒธ Support for other character sets is future work, so it's not in scope yet. Here's how the value type is defined:

text       = *(TSAFE-CHAR / ":" / DQUOTE / ESCAPED-CHAR)
; Folded according to description above

ESCAPED-CHAR = "\\" / "\;" / "\," / "\N" / "\n")
   ; \\ encodes \, \N or \n encodes newline
   ; \; encodes ;, \, encodes ,

TSAFE-CHAR = %x20-21 / %x23-2B / %x2D-39 / %x3C-5B
             %x5D-7E / NON-US-ASCII
   ; Any character except CTLs not needed by the current
   ; character set, DQUOTE, ";", ":", "\", ","

Note: other character sets might need changes to the definitions above, but that's beyond this document's scope ๐Ÿ™ˆ

Description: if the property allows it, you can have multiple "text" values separated by a COMMA character (US-ASCII decimal 44) in a list ๐Ÿ’…

The language the text is written in can be set with the "LANGUAGE" property parameter ๐ŸŒˆ

An intentional formatted text line break MUST only be included in a "TEXT" property value by writing the line break as a BACKSLASH (US-ASCII decimal 92) followed by either a LATIN SMALL LETTER N (US-ASCII decimal 110) or a LATIN CAPITAL LETTER N (US-ASCII decimal 78). So it's "\n" or "\N" ๐Ÿซถ

"TEXT" property values can also contain special characters that act as delimiters, like a COMMA for lists or a SEMICOLON for structured values. To include those characters in a "TEXT" value, they MUST be escaped with a BACKSLASH character ๐Ÿ”ฅ A BACKSLASH character (US-ASCII decimal 92) in a "TEXT" property value MUST be escaped with another BACKSLASH character. A COMMA in a "TEXT" property value MUST be escaped with a BACKSLASH character (US-ASCII decimal 92), and a SEMICOLON in a "TEXT" property value MUST be escaped with a BACKSLASH character (US-ASCII decimal 92). BUT a COLON in a "TEXT" property value SHALL NOT be escaped with a BACKSLASH character ๐Ÿ’€ colons are the one exception, so no backslash for them, periodt โœจ

Example: a multiple line value of:

Project XYZ Final Review
Conference Room - 3B
Come Prepared.

would be represented as:

Project XYZ Final Review\nConference Room - 3B\nCome Prepared.

4.3.12 Time โฐ

Value Name: TIME

Purpose: this value type is for values that hold a time of day ๐Ÿ•

Formal Definition: the data type is defined by the following notation:

time               = time-hour time-minute time-second [time-utc]

time-hour          = 2DIGIT        ;00-23
time-minute        = 2DIGIT        ;00-59
time-second        = 2DIGIT        ;00-60
;The "60" value is used to account for "leap" seconds.

time-utc   = "Z"

Description: if the property allows it, you can have multiple "time" values separated by a COMMA character (US-ASCII decimal 44) in a list. No extra content value encoding (like BACKSLASH character encoding) is defined for this value type ๐Ÿ“

The "TIME" data type is for values that hold a time of day. The format is based on the [ISO 8601] complete representation, basic format for a time of day. The text format is a two-digit 24-hour clock (so values 0-23), a two-digit minute in the hour (values 0-59), and a two-digit second in the minute (values 0-60). A seconds value of 60 MUST only be used to account for "leap" seconds. Fractions of a second are not supported by this format ๐Ÿงš

Just like the "DATE-TIME" definition above, the "TIME" data type expresses time values in three forms:

The form of time with UTC offset MUST NOT be used. For example, the following is not valid for a time value:

230000-0800        ;Invalid time format

FORM #1 LOCAL TIME ๐ŸŒ™

The local time form is simply a time value that doesn't have the UTC designator and doesn't reference a time zone. For example, 11:00 PM:

230000

Time values of this type are called "floating" and aren't tied to any particular time zone. They represent the same hour, minute, and second no matter which time zone is being observed ๐Ÿฆ‹ For example, you could define an event where a person is busy from 11:00 AM to 1:00 PM every day, no matter what time zone they're in. In these cases, a local time can be specified. The recipient of an iCalendar object with a property value that's a local time, with no relative time zone information, SHOULD interpret the value as being fixed to whatever time zone the ATTENDEE is in at any given moment. That means two ATTENDEEs might join the same event at different UTC times, so floating time SHOULD only be used where that's reasonable behavior ๐Ÿค”

In most cases you want a fixed time. To communicate a fixed time properly in a property value, either UTC time or local time with a time zone reference MUST be specified ๐Ÿ’–

Using local time in a TIME value without the TZID property parameter means it's a local time value, regardless of whether "VTIMEZONE" calendar components exist in the iCalendar object ๐ŸŒธ

FORM #2: UTC TIME ๐ŸŒ

UTC time, also called absolute time, is marked by a LATIN CAPITAL LETTER Z suffix character (US-ASCII decimal 90), the UTC designator, added to the end of the time value. For example, the following is 07:00 AM UTC:

070000Z

The TZID property parameter MUST NOT be applied to TIME properties whose time values are specified in UTC ๐Ÿ™…โ€โ™€๏ธ

FORM #3: LOCAL TIME AND TIME ZONE REFERENCE ๐Ÿ—บ๏ธ

The local time with a time zone reference form uses the TZID property parameter to point at the right time zone definition. TZID gets the full story in the section on Time Zone ๐ŸŽ€

Example: the following is 8:30 AM in New York in Winter, five hours behind UTC, written in each of the three forms using the "X-TIMEOFDAY" non-standard property:

X-TIMEOFDAY:083000

X-TIMEOFDAY:133000Z

X-TIMEOFDAY;TZID=US-Eastern:083000

4.3.13 URI ๐Ÿ”—

Value Name: URI

Purpose: this value type is for values that hold a uniform resource identifier (URI) type of reference to the property value โœจ

Formal Definition: the data type is defined by the following notation:

uri        = <As defined by any IETF RFC>

Description: this data type might be used to reference binary information, for values that are large, or otherwise not something you'd want to put directly in the iCalendar object ๐Ÿ“ฆ

The URI value formats in RFC 1738, RFC 2111 and any other IETF registered value format can be specified ๐ŸŒˆ

Any IANA registered URI format can be used. These include, but aren't limited to, the ones defined in RFC 1738 and RFC 2111 ๐Ÿฆ‹

When a property parameter value is a URI value type, the URI MUST be specified as a quoted-string value ๐Ÿ’…

No extra content value encoding (like BACKSLASH character encoding) is defined for this value type ๐Ÿ™ˆ

Example: the following is a URI for a network file:

http://host1.com/my-report.txt

4.3.14 UTC Offset ๐ŸŒ

Value Name: UTC-OFFSET

Purpose: this value type is for properties that hold an offset from UTC to local time ๐Ÿ•ฐ๏ธ

Formal Definition: the data type is defined by the following notation:

utc-offset = time-numzone  ;As defined above in time data type

time-numzone       = ("+" / "-") time-hour time-minute [time-
second]

Description: the PLUS SIGN character MUST be specified for positive UTC offsets (so, ahead of UTC) โž• The values "-0000" and "-000000" are not allowed. The time-second, if it's there, may not be 60. If it's absent, it defaults to zero ๐Ÿฌ

No extra content value encoding (like BACKSLASH character encoding) is defined for this value type ๐Ÿ’œ

Example: the following UTC offsets are given for standard time for New York (five hours behind UTC) and Geneva (one hour ahead of UTC):

-0500

+0100

4.4 iCalendar Object ๐ŸŽ

The Calendaring and Scheduling Core Object is a collection of calendaring and scheduling information. Usually this info is a single iCalendar object, but multiple iCalendar objects can be grouped together one after another ๐Ÿ“š The first line and last line of the iCalendar object MUST contain a pair of iCalendar object delimiter strings. The syntax for an iCalendar object looks like this:

icalobject = 1*("BEGIN" ":" "VCALENDAR" CRLF
             icalbody
             "END" ":" "VCALENDAR" CRLF)

Here's a simple example of an iCalendar object ๐Ÿฅณ

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
SUMMARY:Bastille Day Party
END:VEVENT
END:VCALENDAR

4.5 Property ๐ŸŽ€

A property is the definition of one individual attribute that describes a calendar or a calendar component ๐Ÿ’– A property takes the form defined by the "contentline" notation in section 4.1.1.

Here's an example of a property:

DTSTART:19960415T133000Z

This memo puts no ordering on properties within an iCalendar object. Property order is totally free, bestie ๐Ÿฆ‹

Property names, parameter names and enumerated parameter values are case insensitive. So the property name "DUE" is the same as "due" and "Due", and DTSTART;TZID=US-Eastern:19980714T120000 is the same as DtStart;TzID=US-Eastern:19980714T120000 โœจ

4.6. Calendar Components ๐ŸŽ€

okay so the body of an iCalendar object is basically a bunch of calendar properties ๐Ÿ’… plus one or more calendar components ๐Ÿฆ‹. The properties are the attributes that describe the calendar as a whole โœจ. The components are little bundles of properties that each express one particular kind of calendar thing: an event ๐ŸŽ‰, a to-do โœ…, a journal entry ๐Ÿ““, time zone info ๐ŸŒ, free/busy time ๐Ÿ•’, or an alarm โฐ.

The body of the iCalendar object is defined by this notation:

icalbody   = calprops component

calprops   = 2*(

           ; 'prodid' and 'version' are both REQUIRED,
           ; but MUST NOT occur more than once

           prodid /version /

           ; 'calscale' and 'method' are optional,
           ; but MUST NOT occur more than once

           calscale        /
           method          /

           x-prop
           )

component  = 1*(eventc / todoc / journalc / freebusyc /
           / timezonec / iana-comp / x-comp)

iana-comp  = "BEGIN" ":" iana-token CRLF

             1*contentline

             "END" ":" iana-token CRLF

x-comp     = "BEGIN" ":" x-name CRLF

             1*contentline

             "END" ":" x-name CRLF

An iCalendar object MUST include the "PRODID" and "VERSION" calendar properties, no exceptions bestie ๐Ÿซถ. In addition, it MUST include at least one calendar component. Special forms are possible too ๐ŸŒธ: you can publish just busy time (so only a "VFREEBUSY" calendar component) or just time zone info (so only a "VTIMEZONE" calendar component). You can also go big and make a complex iCalendar object that captures a complete snapshot of a calendar, a composite of lots of different calendar components ๐Ÿ“ธ. Most of the time though, an iCalendar object is just one "VEVENT", "VTODO" or "VJOURNAL" calendar component, and honestly that's the iconic classic look ๐Ÿ’–.


4.6.1. Event Component ๐Ÿ“…

Component Name: "VEVENT"

Purpose: Provide a grouping of component properties that describe an event.

Format Definition: A "VEVENT" calendar component is defined by the following notation:

eventc     = "BEGIN" ":" "VEVENT" CRLF
             eventprop *alarmc
             "END" ":" "VEVENT" CRLF

eventprop  = *(

           ; the following are optional,
           ; but MUST NOT occur more than once

           class / created / description / dtstart / geo /
           last-mod / location / organizer / priority /
           dtstamp / seq / status / summary / transp /
           uid / url / recurid /

           ; either 'dtend' or 'duration' may appear in
           ; a 'eventprop', but 'dtend' and 'duration'
           ; MUST NOT occur in the same 'eventprop'

           dtend / duration /

           ; the following are optional,
           ; and MAY occur more than once

           attach / attendee / categories / comment /
           contact / exdate / exrule / rstatus / related /
           resources / rdate / rrule / x-prop

           )

Description: A "VEVENT" is a grouping of component properties, and possibly "VALARM" calendar components too ๐Ÿ””, that represents a scheduled chunk of time on a calendar. Like, it can be an activity, say a one-hour department meeting from 8:00 AM to 9:00 AM tomorrow ๐Ÿ’ผ. Usually an event takes up time on an individual's calendar, so it shows up as an opaque interval when someone searches for busy time ๐Ÿ™ˆ. BUT if you want, the event can have its Time Transparency set to "TRANSPARENT", which stops it from blocking anything in busy-time searches ๐Ÿฆ‹.

The "VEVENT" is also the component you use for an anniversary or a daily reminder ๐ŸŽ‚. These events have a DATE value type for the "DTSTART" property instead of the default DATE-TIME data type. If one of these "VEVENT"s has a "DTEND" property, it MUST be specified as a DATE value also. The anniversary flavor of "VEVENT" can span more than one date, so the "DTEND" property value can be a calendar date after the "DTSTART" property value ๐ŸŒˆ.

The "DTSTART" property for a "VEVENT" marks the inclusive start of the event ๐Ÿ. For recurring events, it also marks the very first instance in the recurrence set ๐Ÿ”. The "DTEND" property for a "VEVENT" marks the non-inclusive end of the event ๐Ÿ›‘. If a "VEVENT" has a "DTSTART" with a DATE data type but no "DTEND", the event's non-inclusive end is the end of the calendar date given by "DTSTART". If a "VEVENT" has a "DTSTART" with a DATE-TIME data type but no "DTEND", the event ends on that same calendar date and time of day as "DTSTART" ๐Ÿ•ฐ๏ธ.

The "VEVENT" calendar component cannot be nested inside another calendar component ๐Ÿ™…โ€โ™€๏ธ. However, "VEVENT" calendar components can be related to each other, or to a "VTODO" or a "VJOURNAL" calendar component, using the "RELATED-TO" property ๐Ÿ”—.

Example: Here's a "VEVENT" representing a meeting that will also be opaque to busy-time searches ๐Ÿ’ผ:

BEGIN:VEVENT
UID:19970901T130000Z-123401@host.com
DTSTAMP:19970901T1300Z
DTSTART:19970903T163000Z
DTEND:19970903T190000Z
SUMMARY:Annual Employee Review
CLASS:PRIVATE
CATEGORIES:BUSINESS,HUMAN RESOURCES
END:VEVENT

And here's a "VEVENT" representing a reminder that is not opaque, but transparent, to busy-time searches ๐Ÿ‘€:

BEGIN:VEVENT
UID:19970901T130000Z-123402@host.com
DTSTAMP:19970901T1300Z
DTSTART:19970401T163000Z
DTEND:19970402T010000Z
SUMMARY:Laurel is in sensitivity awareness class.
CLASS:PUBLIC
CATEGORIES:BUSINESS,HUMAN RESOURCES
TRANSP:TRANSPARENT
END:VEVENT

And an anniversary that happens every year ๐Ÿ’. Since it takes up no time, it won't show up as opaque in a busy-time search, no matter what the "TRANSP" property says ๐Ÿฅน:

BEGIN:VEVENT
UID:19970901T130000Z-123403@host.com
DTSTAMP:19970901T1300Z
DTSTART:19971102
SUMMARY:Our Blissful Anniversary
CLASS:CONFIDENTIAL
CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION
RRULE:FREQ=YEARLY
END:VEVENT

4.6.2. To-do Component โœ…

Component Name: VTODO

Purpose: Provide a grouping of calendar properties that describe a to-do.

Formal Definition: A "VTODO" calendar component is defined by the following notation:

todoc      = "BEGIN" ":" "VTODO" CRLF
             todoprop *alarmc
             "END" ":" "VTODO" CRLF

todoprop   = *(

           ; the following are optional,
           ; but MUST NOT occur more than once

           class / completed / created / description / dtstamp /
           dtstart / geo / last-mod / location / organizer /
           percent / priority / recurid / seq / status /
           summary / uid / url /

           ; either 'due' or 'duration' may appear in
           ; a 'todoprop', but 'due' and 'duration'
           ; MUST NOT occur in the same 'todoprop'

           due / duration /

           ; the following are optional,
           ; and MAY occur more than once
           attach / attendee / categories / comment / contact /
           exdate / exrule / rstatus / related / resources /
           rdate / rrule / x-prop

           )

Description: A "VTODO" is a grouping of component properties, and possibly "VALARM" calendar components, that stand in for an action item or assignment ๐Ÿ“. Think of it as a task with your name on it, like "turn in travel expense today" ๐Ÿ’ธ. The "VTODO" calendar component cannot be nested inside another calendar component ๐Ÿ™…โ€โ™€๏ธ. However, "VTODO" calendar components can be related to each other, or to a "VTODO" or a "VJOURNAL" calendar component, using the "RELATED-TO" property ๐Ÿ”—.

A "VTODO" without the "DTSTART" and "DUE" (or "DURATION") properties is a to-do that gets associated with each successive calendar date, until it's completed ๐Ÿ”. Main character energy for a to-do that never lets you go ๐Ÿ˜ญ.

Example: Here's a "VTODO" calendar component ๐Ÿ’…:

BEGIN:VTODO
UID:19970901T130000Z-123404@host.com
DTSTAMP:19970901T1300Z
DTSTART:19970415T133000Z
DUE:19970416T045959Z
SUMMARY:1996 Income Tax Preparation
CLASS:CONFIDENTIAL
CATEGORIES:FAMILY,FINANCE
PRIORITY:1
STATUS:NEEDS-ACTION
END:VTODO

4.6.3 Journal Component ๐Ÿ““โœจ

Component Name: VJOURNAL

Purpose: Groups together the properties that describe a journal entry ๐Ÿ’œ

Formal Definition: A "VJOURNAL" calendar component is defined like this ๐Ÿ‘‡

journalc   = "BEGIN" ":" "VJOURNAL" CRLF
             jourprop
             "END" ":" "VJOURNAL" CRLF

jourprop   = *(

           ; the following are optional,
           ; but MUST NOT occur more than once

           class / created / description / dtstart / dtstamp /
           last-mod / organizer / recurid / seq / status /
           summary / uid / url /

           ; the following are optional,
           ; and MAY occur more than once

           attach / attendee / categories / comment /
           contact / exdate / exrule / related / rdate /
           rrule / rstatus / x-prop
           )

Description: Okay so a "VJOURNAL" is basically a bundle of properties holding one or more text notes that are tied to a specific calendar date ๐Ÿ“ The "DTSTART" property is how you say which date the journal entry belongs to. It's usually a DATE value, but it can also be a DATE-TIME value, so you have options ๐ŸŽ€ Some examples are a daily record kept by a legislative body, a log of phone calls you made that day, or an ordered list of accomplishments. Oh, and a "VJOURNAL" can also link a document to a calendar date, which is so useful, iykyk ๐Ÿ™ˆ

A "VJOURNAL" does not take up any time on a calendar ๐Ÿฆ‹ That means it doesn't count in free or busy time searches at all. It's like it has a time transparency value of TRANSPARENT, so every search just ignores it. Literally invisible to the searches ๐Ÿซฅ

A "VJOURNAL" can't be nested inside another calendar component ๐Ÿšซ But journals can be related to each other, or to a "VEVENT" or a "VTODO", using the "RELATED-TO" property. Main character linking energy ๐Ÿ”—๐Ÿ’…

Example: Here's what a "VJOURNAL" looks like in action ๐ŸŒธ

BEGIN:VJOURNAL
UID:19970901T130000Z-123405@host.com
DTSTAMP:19970901T1300Z
DTSTART;VALUE=DATE:19970317
SUMMARY:Staff meeting minutes
DESCRIPTION:1. Staff meeting: Participants include Joe\, Lisa
  and Bob. Aurora project plans were reviewed. There is currently
  no budget reserves for this project. Lisa will escalate to
  management. Next meeting on Tuesday.\n
  2. Telephone Conference: ABC Corp. sales representative called
  to discuss new printer. Promised to get us a demo by Friday.\n
  3. Henry Miller (Handsoff Insurance): Car was totaled by tree.
  Is looking into a loaner car. 654-2323 (tel).
END:VJOURNAL

4.6.4 Free/Busy Component ๐Ÿซง๐Ÿ’™

Component Name: VFREEBUSY

Purpose: Groups together the properties that describe one of three things: a request for free/busy time, a response to a request for free/busy time, or a published set of busy time ๐Ÿ•ฐ๏ธ

Formal Definition: A "VFREEBUSY" calendar component is defined like this ๐Ÿ‘‡

freebusyc  = "BEGIN" ":" "VFREEBUSY" CRLF
             fbprop
             "END" ":" "VFREEBUSY" CRLF

fbprop     = *(

           ; the following are optional,
           ; but MUST NOT occur more than once

           contact / dtstart / dtend / duration / dtstamp /
           organizer / uid / url /

           ; the following are optional,
           ; and MAY occur more than once

           attendee / comment / freebusy / rstatus / x-prop

           )

Description: A "VFREEBUSY" is a bundle of properties that does one of three jobs ๐ŸŽฏ It can ask for free/busy time, reply to that kind of request, or publish a set of busy time ๐Ÿ“ฃ

When it's asking for free/busy time ๐Ÿ™‹โ€โ™€๏ธ, the "ATTENDEE" property says whose free/busy time you want. The "ORGANIZER" property says who's doing the asking. The "DTSTART" and "DTEND" properties set the window of time you're asking about, and "UID" and "DTSTAMP" are there so multiple requests can be put in the right order ๐Ÿ”ข

When it's replying ๐Ÿ’Œ, the "ATTENDEE" property says who is answering. The "ORGANIZER" property says who originally asked. The "FREEBUSY" property holds the free/busy info (if there is any ๐Ÿซฃ), and "UID" and "DTSTAMP" help keep multiple replies in order ๐Ÿ“š

When it's publishing busy time ๐Ÿ“ข, the "ORGANIZER" property says whose busy time this is. "DTSTART" and "DTEND" set an inclusive time window around the busy info, the "FREEBUSY" property has the actual busy time, and "DTSTAMP" says when the iCalendar object was created โฐ

A "VFREEBUSY" can't be nested inside another calendar component ๐Ÿ™…โ€โ™€๏ธ But you can put several of them in one iCalendar object, which is great for grouping busy info into neat collections, like one group per month ๐Ÿ—“๏ธโœจ

The "VFREEBUSY" component is meant for iCalendar object methods that involve asking for free time, asking for busy time, asking for both, and the replies to all of that ๐Ÿ’ซ

Free/busy info is shown with the "FREEBUSY" property ๐Ÿ“. It's a super compact way of writing down time periods. You can have one or more "FREEBUSY" properties in a "VFREEBUSY" component ๐Ÿง

When a "VFREEBUSY" component has "DTSTART" and "DTEND", those SHOULD come before any "FREEBUSY" properties ๐Ÿ’… When you're asking for free time, you can pair them with the "DURATION" property to ask for a chunk of free time inside a certain window of time โณ

The recurrence properties ("RRULE", "EXRULE", "RDATE", "EXDATE") are not allowed in a "VFREEBUSY" component ๐Ÿšซ Instead, any recurring events get broken down into their individual busy time periods using the "FREEBUSY" property ๐Ÿงฉ

Example: Here's a "VFREEBUSY" used to ask for free or busy time ๐Ÿ’ฌ

BEGIN:VFREEBUSY
ORGANIZER:MAILTO:jane_doe@host1.com
ATTENDEE:MAILTO:john_public@host2.com
DTSTART:19971015T050000Z
DTEND:19971016T050000Z
DTSTAMP:19970901T083000Z
END:VFREEBUSY

Here's a "VFREEBUSY" used to reply to that request with busy time info ๐Ÿ’Œ

BEGIN:VFREEBUSY
ORGANIZER:MAILTO:jane_doe@host1.com
ATTENDEE:MAILTO:john_public@host2.com
DTSTAMP:19970901T100000Z
FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M,
 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
URL:http://host2.com/pub/busy/jpublic-01.ifb
COMMENT:This iCalendar file contains busy time information for
  the next three months.
END:VFREEBUSY

And here's a "VFREEBUSY" used to publish busy time info ๐Ÿ“ฃ

BEGIN:VFREEBUSY
ORGANIZER:jsmith@host.com
DTSTART:19980313T141711Z
DTEND:19980410T141711Z
FREEBUSY:19980314T233000Z/19980315T003000Z
FREEBUSY:19980316T153000Z/19980316T163000Z
FREEBUSY:19980318T030000Z/19980318T040000Z
URL:http://www.host.com/calendar/busytime/jsmith.ifb
END:VFREEBUSY

4.6.5 Time Zone Component ๐ŸŒ๐Ÿ•’

Component Name: VTIMEZONE

Purpose: Groups together the properties that define a time zone ๐Ÿ—บ๏ธ

Formal Definition: A "VTIMEZONE" calendar component is defined like this ๐Ÿ‘‡

timezonec  = "BEGIN" ":" "VTIMEZONE" CRLF

             2*(

             ; 'tzid' is required, but MUST NOT occur more
             ; than once

           tzid /

             ; 'last-mod' and 'tzurl' are optional,
           but MUST NOT occur more than once
           last-mod / tzurl /

             ; one of 'standardc' or 'daylightc' MUST occur
           ..; and each MAY occur more than once.

           standardc / daylightc /

           ; the following is optional,
           ; and MAY occur more than once

             x-prop

             )

             "END" ":" "VTIMEZONE" CRLF

standardc  = "BEGIN" ":" "STANDARD" CRLF

             tzprop

             "END" ":" "STANDARD" CRLF

daylightc  = "BEGIN" ":" "DAYLIGHT" CRLF

             tzprop

             "END" ":" "DAYLIGHT" CRLF

tzprop     = 3*(

           ; the following are each REQUIRED,
           ; but MUST NOT occur more than once

           dtstart / tzoffsetto / tzoffsetfrom /

           ; the following are optional,
           ; and MAY occur more than once

           comment / rdate / rrule / tzname / x-prop

           )

Description: Okay, so a time zone is locked in by the set of time rules that a governing body has set for a certain geographic area ๐Ÿ›๏ธ Those rules describe, at the very least, the base offset from UTC, which is often called the Standard Time offset ๐Ÿ• Lots of places shift their Standard Time forward or back by an hour to deal with the seasonal changes in daylight hours. That's called Daylight Saving Time โ˜€๏ธ Some places shift by a fraction of an hour instead ๐Ÿซ  Standard Time is also called Winter Time, and Daylight Saving Time goes by Advanced Time, Summer Time, or Legal Time in certain countries ๐ŸŒž

Here's a table showing how the time zone rules for New York City changed starting in 1967. Each line is one observance or rule ๐Ÿ“Š

  Effective Observance Rule

  Date       (Date/Time)             Offset  Abbreviation

  1967-*     last Sun in Oct, 02:00  -0500   EST

  1967-1973  last Sun in Apr, 02:00  -0400   EDT

  1974-1974  Jan 6,  02:00           -0400   EDT

  1975-1975  Feb 23, 02:00           -0400   EDT

  1976-1986  last Sun in Apr, 02:00  -0400   EDT

  1987-*     first Sun in Apr, 02:00 -0400   EDT

Note: A global time zone registry isn't covered by this document. It's left for future study ๐Ÿ”ฎ But implementers might find the Olson time zone database [TZ] really helpful. It's an informal, public-domain collection of time zone info that volunteer Internet folks currently maintain, and it's used in several operating systems ๐Ÿ’ป It has current and historical time zone info for tons of locations around the globe. It gives a time zone identifier for every unique time zone rule set that's been in actual use since 1970, with historical data going back to when standard time was introduced ๐Ÿง โœจ

Interoperability between two calendaring and scheduling apps is a big deal, especially for recurring events, to-dos, or journal entries ๐Ÿซถ It all depends on being able to capture and share date and time info in an unambiguous format. Having current time zone info is a huge part of making that work ๐ŸŽ€

Okay so the VTIMEZONE calendar component is where the time zone gets its whole personality ๐ŸŒ๐Ÿ’…. It lays out the Standard Time and Daylight Saving Time observances (or rules) for one particular time zone over a given stretch of time, if it's there at all โœจ. It literally cannot be nested inside other calendar components ๐Ÿ™…โ€โ™€๏ธ. You can have several VTIMEZONE components in one iCalendar object, and when you do, each "VTIMEZONE" MUST represent a unique time zone definition ๐Ÿ’–. This is super important for stuff like airline flights that take off in one time zone and land in another โœˆ๏ธ.

The "VTIMEZONE" calendar component MUST be present if the iCalendar object contains an RRULE that generates dates on both sides of a time zone shift (e.g. both in Standard Time and Daylight Saving Time) unless the iCalendar object intends to convey a floating time ๐Ÿซ  (see the section "4.1.10.11 Time" for the proper interpretation of floating time). It can be present if the iCalendar object does not contain such a RRULE. Also, if a RRULE is present, there MUST be valid time zone information for all recurrence instances ๐Ÿ“….

The "VTIMEZONE" calendar component MUST include the "TZID" property and at least one definition of a standard or daylight component ๐ŸŽ€. The standard or daylight component MUST include the "DTSTART", "TZOFFSETFROM" and "TZOFFSETTO" properties, no exceptions ๐Ÿ˜ค.

An individual "VTIMEZONE" calendar component MUST be specified for each unique "TZID" parameter value specified in the iCalendar object ๐Ÿฆ‹.

Each "VTIMEZONE" calendar component is a collection of one or more sub-components, and each one describes the rule for a particular observance (either a Standard Time or a Daylight Saving Time observance) ๐ŸŒธ. The "STANDARD" sub-component holds the properties that describe Standard Time, and the "DAYLIGHT" sub-component holds the ones that describe Daylight Saving Time ๐ŸŒž. Generally speaking, that collection of properties covers:

  • the first onset date-time for the observance
  • the last onset date-time for the observance, if a last onset is known
  • the offset to be applied for the observance
  • a rule that describes the day and time when the observance takes effect
  • an optional name for the observance

A given time zone can have multiple unique definitions of its observances over time ๐Ÿ•ฐ๏ธ. Each observance is described using either a "STANDARD" or "DAYLIGHT" sub-component, and the whole collection of these sub-components is what describes the time zone for a given period. To figure out the offset at any moment, you find the observance with the last onset date and time before the time in question, then use the offset value from that observance ๐Ÿ”. Main character energy, honestly ๐Ÿ‘‘.

The top-level properties in a "VTIMEZONE" calendar component are:

The mandatory "TZID" property is a text value that uniquely identifies the VTIMZONE calendar component within the scope of an iCalendar object ๐Ÿชช.

The optional "LAST-MODIFIED" property is a UTC value that specifies the date and time that this time zone definition was last updated ๐Ÿ•.

The optional "TZURL" property is a url value that points to a published VTIMEZONE definition. TZURL SHOULD refer to a resource that is accessible by anyone who might need to interpret the object. This SHOULD NOT normally be a file: URL or other URL that is not widely-accessible ๐ŸŒ. Like, the link should be something everyone can actually open, bestie ๐Ÿ™ˆ.

The collection of properties used to define the STANDARD and DAYLIGHT sub-components includes:

The mandatory "DTSTART" property gives the effective onset date and local time for the time zone sub-component definition. "DTSTART" in this usage MUST be specified as a local DATE-TIME value ๐Ÿงš.

The mandatory "TZOFFSETFROM" property gives the UTC offset that is in use when the onset of this time zone observance begins. "TZOFFSETFROM" is combined with "DTSTART" to define the effective onset for the time zone sub-component definition. For example, this represents the time at which the observance of Standard Time took effect in Fall 1967 for New York City ๐Ÿ—ฝ:

DTSTART:19671029T020000

TZOFFSETFROM:-0400

The mandatory "TZOFFSETTO " property gives the UTC offset for the time zone sub-component (Standard Time or Daylight Saving Time) when this observance is in use ๐Ÿ“.

The optional "TZNAME" property is the customary name for the time zone. It can be specified multiple times, so you can have multiple language variants of the time zone names ๐ŸŒˆ. This is useful for displaying dates ๐Ÿ“†.

If specified, the onset for the observance defined by the time zone sub-component is defined by either the "RRULE" or "RDATE" property. If neither is specified, only one sub-component can be specified in the "VTIMEZONE" calendar component, and it's assumed that the single observance specified is always in effect ๐Ÿ’œ.

The "RRULE" property defines the recurrence rule for the onset of the observance defined by this time zone sub-component. A few specific requirements for using RRULE this way:

  • If the observance is known to have an effective end date, the "UNTIL" recurrence rule parameter MUST be used to specify the last valid onset of this observance (i.e., the UNTIL date-time will be equal to the last instance generated by the recurrence pattern). It MUST be specified in UTC time โณ.
  • The "DTSTART" and the "TZOFFSETTO" properties MUST be used when generating the onset date-time values (instances) from the RRULE ๐Ÿ”.

Alternatively, the "RDATE" property can define the onset of the observance by giving the individual onset dates and times ๐Ÿ—“๏ธ. "RDATE" in this usage MUST be specified as a local DATE-TIME value in UTC time ๐Ÿซถ.

The optional "COMMENT" property is also allowed for descriptive, explanatory text ๐Ÿ’ฌ.

Example: here are some examples of the "VTIMEZONE" calendar component ๐ŸŽ€.

This is an example showing time zone information for the Eastern United States using the "RDATE" property. Note that this is only suitable for a recurring event that starts on or later than April 6, 1997 at 03:00:00 EDT (i.e., the earliest effective transition date and time) and ends no later than April 7, 1998 02:00:00 EST (i.e., the latest valid date and time for EST in this scenario). For example, this can be used for a recurring event that occurs every Friday, 8am-9:00 AM, starting June 1, 1997 and ending December 31, 1997 ๐Ÿ“†.

BEGIN:VTIMEZONE
TZID:US-Eastern
LAST-MODIFIED:19870101T000000Z
BEGIN:STANDARD
DTSTART:19971026T020000
RDATE:19971026T020000
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19971026T020000
RDATE:19970406T020000
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
END:DAYLIGHT
END:VTIMEZONE

This is a simple example showing the current time zone rules for the Eastern United States using a RRULE recurrence pattern. There's no effective end date on either the Standard Time or Daylight Time rule ๐ŸŒŸ. This information would be valid for a recurring event starting today and continuing indefinitely โ™พ๏ธ.

BEGIN:VTIMEZONE
TZID:US-Eastern
LAST-MODIFIED:19870101T000000Z
TZURL:http://zones.stds_r_us.net/tz/US-Eastern
BEGIN:STANDARD
DTSTART:19671029T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19870405T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
END:DAYLIGHT
END:VTIMEZONE

This is an example showing a fictitious set of rules for the Eastern United States, where the Daylight Time rule has an effective end date (i.e., after that date, Daylight Time is no longer observed) ๐Ÿซฃ.

BEGIN:VTIMEZONE
TZID:US--Fictitious-Eastern
LAST-MODIFIED:19870101T000000Z
BEGIN:STANDARD
DTSTART:19671029T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19870405T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
END:DAYLIGHT
END:VTIMEZONE

This is an example showing a fictitious set of rules for the Eastern United States, where the first Daylight Time rule has an effective end date. A second Daylight Time rule picks up where the other left off ๐Ÿฆ‹.

BEGIN:VTIMEZONE
TZID:US--Fictitious-Eastern
LAST-MODIFIED:19870101T000000Z
BEGIN:STANDARD
DTSTART:19671029T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19870405T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
END:DAYLIGHT
BEGIN:DAYLIGHT
DTSTART:19990424T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
END:DAYLIGHT
END:VTIMEZONE

4.6.6. Alarm Component โฐ

Component Name: VALARM

Purpose: Groups together the component properties that define an alarm. This is the reminder bestie, basically ๐Ÿซถ

Formal Definition: A VALARM calendar component is defined by the following notation:

   alarmc     = "BEGIN" ":" "VALARM" CRLF
                (audioprop / dispprop / emailprop / procprop)
                "END" ":" "VALARM" CRLF

audioprop  = 2*(

           ; 'action' and 'trigger' are both REQUIRED,
           ; but MUST NOT occur more than once

           action / trigger /

           ; 'duration' and 'repeat' are both optional,
           ; and MUST NOT occur more than once each,
           ; but if one occurs, so MUST the other

           duration / repeat /

           ; the following is optional,
           ; but MUST NOT occur more than once

           attach /

           ; the following is optional,
           ; and MAY occur more than once

           x-prop

           )



dispprop   = 3*(

           ; the following are all REQUIRED,
           ; but MUST NOT occur more than once

           action / description / trigger /

           ; 'duration' and 'repeat' are both optional,
           ; and MUST NOT occur more than once each,
           ; but if one occurs, so MUST the other

           duration / repeat /

           ; the following is optional,
           ; and MAY occur more than once

           *x-prop

           )



emailprop  = 5*(

           ; the following are all REQUIRED,
           ; but MUST NOT occur more than once

           action / description / trigger / summary

           ; the following is REQUIRED,
           ; and MAY occur more than once

           attendee /

           ; 'duration' and 'repeat' are both optional,
           ; and MUST NOT occur more than once each,
           ; but if one occurs, so MUST the other

           duration / repeat /

           ; the following are optional,
           ; and MAY occur more than once

           attach / x-prop

           )



procprop   = 3*(

           ; the following are all REQUIRED,
           ; but MUST NOT occur more than once

           action / attach / trigger /

           ; 'duration' and 'repeat' are both optional,
           ; and MUST NOT occur more than once each,
           ; but if one occurs, so MUST the other

           duration / repeat /
           ; 'description' is optional,
           ; and MUST NOT occur more than once

           description /

           ; the following is optional,
           ; and MAY occur more than once

           x-prop

           )

Description: A VALARM calendar component is a bundle of properties that acts as a reminder or alarm for an event or a to-do. For example, it can remind you about a pending event or nudge you about an overdue to-do ๐Ÿ’…

The VALARM calendar component MUST include the ACTION and TRIGGER properties. The ACTION property adds more rules to the VALARM calendar component, like this:

When the action is AUDIO, the alarm can also include one and only one ATTACH property. That property MUST point to a sound resource, which gets rendered when the alarm goes off ๐Ÿ”Š

When the action is DISPLAY, the alarm MUST also include a DESCRIPTION property, which holds the text that gets shown when the alarm is triggered ๐ŸŽ€

When the action is EMAIL, the alarm MUST include a DESCRIPTION property (the message body), a SUMMARY property (the message subject), and one or more ATTENDEE properties holding the email addresses of the people who should receive the message. It can also include one or more ATTACH properties, which are meant to be sent as attachments. When the alarm is triggered, the email message gets sent ๐Ÿ“ง

When the action is PROCEDURE, the alarm MUST include one and only one ATTACH property. That property MUST point to a procedure resource, which gets invoked when the alarm is triggered โš™๏ธ

The VALARM calendar component MUST only appear inside a VEVENT or VTODO calendar component. VALARM calendar components cannot be nested. You can specify multiple mutually independent VALARM calendar components for a single VEVENT or VTODO calendar component, so go wild ๐Ÿฆ‹

The TRIGGER property decides when the alarm goes off. It sets a duration before the start of an event or a to-do. The TRIGGER edge can be explicitly set to be relative to the START or END of the event or to-do, using the RELATED parameter of the TRIGGER property. The TRIGGER property value type can also be set to an absolute calendar date and time of day instead ๐Ÿ•ฐ๏ธ

For an alarm that's set to trigger on the START of an event or to-do, the DTSTART property MUST be present in the associated event or to-do. For an alarm in a VEVENT calendar component that's set to trigger on the END of the event, either the DTEND property MUST be present, or both the DTSTART and DURATION properties MUST be present. For an alarm in a VTODO calendar component that's set to trigger on the END of the to-do, either the DUE property MUST be present, or both the DTSTART and DURATION properties MUST be present.

An alarm can be set up to trigger repeatedly. An alarm with a repeating trigger MUST include both the DURATION and REPEAT properties. The DURATION property is the delay period after which the alarm repeats. The REPEAT property is the number of additional repetitions the alarm will trigger. That count is on top of the initial trigger. Both properties MUST be present to specify a repeating alarm. If either one is missing, the alarm won't repeat beyond its initial trigger ๐Ÿ”

The ACTION property is used inside the VALARM calendar component to say what kind of action gets invoked when the alarm is triggered. The VALARM properties give enough info for a specific action to be invoked. It's usually the job of a "Calendar User Agent" (CUA) to deliver the alarm the way it's specified. An ACTION value of AUDIO means the alarm plays a sound to get the user's attention. DISPLAY means the alarm shows a text message to the user. EMAIL means the alarm sends an email message to one or more email addresses. PROCEDURE means the alarm runs a procedure. The ACTION property MUST specify one and only one of these values ๐Ÿ’–

For an AUDIO alarm, if the optional ATTACH property is included, it MUST specify an audio sound resource. The point is that the sound plays as the alarm effect. If an ATTACH property doesn't refer to a sound resource, or if the sound resource can't be rendered (because its format isn't supported, or because it can't be retrieved), then the CUA or whatever else is responsible for playing the sound may choose a fallback. That could be playing a built-in default sound, or playing nothing at all ๐Ÿคทโ€โ™€๏ธ

For a DISPLAY alarm, the intended effect is for the text value of the DESCRIPTION property to be shown to the user ๐Ÿ“

For an EMAIL alarm, the intended effect is for an email message to be composed and delivered to all the addresses listed in the ATTENDEE properties of the VALARM calendar component. The DESCRIPTION property of the VALARM calendar component MUST be used as the body text of the message, and the SUMMARY property MUST be used as the subject text. Any ATTACH properties in the VALARM calendar component SHOULD be sent as attachments to the message ๐Ÿ“Ž

For a PROCEDURE alarm, the ATTACH property in the VALARM calendar component MUST specify a procedure or program that is meant to be invoked as the alarm effect. If that procedure or program is in a format that can't be rendered, then no procedure alarm will be invoked. If the DESCRIPTION property is present, its value specifies the argument string to pass to the procedure or program. "Calendar User Agents" that receive an iCalendar object with this kind of alarm can disable it, allow the "Calendar User" to disable it, or otherwise ignore it. It's a super useful alarm capability, but the PROCEDURE type of alarm SHOULD be treated by the "Calendar User Agent" as a potential security risk ๐Ÿšจ

Examples: The following example is a VALARM calendar component that sets up an audio alarm which sounds at a precise time and then repeats 4 more times at 15 minute intervals:

  BEGIN:VALARM
  TRIGGER;VALUE=DATE-TIME:19970317T133000Z
  REPEAT:4
  DURATION:PT15M
  ACTION:AUDIO
  ATTACH;FMTTYPE=audio/basic:ftp://host.com/pub/sounds/bell-01.aud
  END:VALARM

The following example is a VALARM calendar component that sets up a display alarm which triggers 30 minutes before the scheduled start of the event (or the due date/time of the to-do it's attached to), and repeats 2 more times at 15 minute intervals:

  BEGIN:VALARM
  TRIGGER:-PT30M
  REPEAT:2
  DURATION:PT15M
  ACTION:DISPLAY
  DESCRIPTION:Breakfast meeting with executive\n
   team at 8:30 AM EST.
  END:VALARM

The following example is a VALARM calendar component that sets up an email alarm which triggers 2 days before the scheduled due date/time of a to-do it's attached to. It doesn't repeat. The email has a subject, a body, and an attachment link ๐Ÿ’Œ

  BEGIN:VALARM
  TRIGGER:-P2D
  ACTION:EMAIL
  ATTENDEE:MAILTO:john_doe@host.com
  SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING ***
  DESCRIPTION:A draft agenda needs to be sent out to the attendees
    to the weekly managers meeting (MGR-LIST). Attached is a
    pointer the document template for the agenda file.
  ATTACH;FMTTYPE=application/binary:http://host.com/templates/agen
   da.doc
  END:VALARM

The following example is a VALARM calendar component that sets up a procedural alarm which triggers at a precise date/time and repeats 23 more times at one hour intervals. The alarm invokes a procedure file ๐Ÿงš

  BEGIN:VALARM
  TRIGGER;VALUE=DATE-TIME:19980101T050000Z
  REPEAT:23
  DURATION:PT1H
  ACTION:PROCEDURE
  ATTACH;FMTTYPE=application/binary:ftp://host.com/novo-
   procs/felizano.exe
  END:VALARM

4.7. Calendar Properties ๐ŸŒˆ

The Calendar Properties are attributes that apply to the iCalendar object as a whole. They don't show up inside a calendar component. They SHOULD be specified after the BEGIN:VCALENDAR property and before any calendar component. โœจ

4.7.1. Calendar Scale ๐Ÿ“…

Property Name: CALSCALE

Purpose: Okay so this property tells you which calendar scale the calendar info in the iCalendar object is using. ๐Ÿ’…

Value Type: TEXT

Property Parameters: Non-standard property parameters can be specified on this property. โœจ

Conformance: The property can be specified in an iCalendar object. The default value is "GREGORIAN". ๐ŸŒธ

Description: This memo is based on the Gregorian calendar scale, bestie. ๐Ÿ—“๏ธ If this property isn't in the iCalendar object, the Gregorian scale is assumed, so you get it by default. Other calendar scales are expected to be defined in other specs or in future versions of this memo, so keep an eye out. ๐Ÿ‘€

Format Definition: The property is defined by the following notation:

calscale   = "CALSCALE" calparam ":" calvalue CRLF

calparam   = *(";" xparam)

calvalue   = "GREGORIAN" / iana-token

Example: The following is an example of this property:

CALSCALE:GREGORIAN

4.7.2. Method ๐Ÿ“ฎ

Property Name: METHOD

Purpose: This property defines the iCalendar object method that goes with the calendar object. It's giving method energy. ๐ŸŽฏ

Value Type: TEXT

Property Parameters: Non-standard property parameters can be specified on this property.

Conformance: The property can be specified in an iCalendar object.

Description: When this is used in a MIME message entity, the value of this property MUST be the same as the Content-Type "method" parameter value. This property can only appear once within the iCalendar object. If either the "METHOD" property or the Content-Type "method" parameter is specified, then the other MUST also be specified. ๐Ÿ”

No methods are defined by this specification. That's handled by other specs, like the iCalendar Transport-independent Interoperability Protocol (iTIP) defined by [ITIP]. ๐Ÿงš

If this property isn't present in the iCalendar object, a scheduling transaction MUST NOT be assumed. In that case the iCalendar object is just carrying a snapshot of some calendar info, with no intention of sending a scheduling meaning. ๐Ÿ“ธ

Format Definition: The property is defined by the following notation:

method     = "METHOD" metparam ":" metvalue CRLF

metparam   = *(";" xparam)

metvalue   = iana-token

Example: The following is a hypothetical example of this property, used to convey that the iCalendar object is a request for a meeting:

METHOD:REQUEST

4.7.3. Product Identifier ๐Ÿท๏ธ

Property Name: PRODID

Purpose: This property specifies the identifier for the product that created the iCalendar object. Main character product, literally. ๐Ÿ‘‘

Value Type: TEXT

Property Parameters: Non-standard property parameters can be specified on this property.

Conformance: The property MUST be specified once in an iCalendar object. ๐Ÿ™Œ

Description: The vendor of the implementation SHOULD assure that this is a globally unique identifier. One technique for that is using an FPI value, as defined in [ISO 9070]. ๐ŸŒ

This property SHOULD not be used to change how an iCalendar object is interpreted beyond the semantics specified in this memo. For example, it isn't meant to help anyone understand non-standard properties. ๐Ÿ™…โ€โ™€๏ธ

Format Definition: The property is defined by the following notation:

prodid     = "PRODID" pidparam ":" pidvalue CRLF
pidparam   = *(";" xparam)

pidvalue   = text
;Any text that describes the product and version
;and that is generally assured of being unique.

Example: The following is an example of this property. It does not imply that English is the default language. ๐Ÿ‡ฌ๐Ÿ‡ง

PRODID:-//ABC Corporation//NONSGML My Product//EN

4.7.4. Version ๐Ÿ”ข

Property Name: VERSION

Purpose: This property specifies the identifier for the highest version number, or the minimum and maximum range, of the iCalendar specification that you need in order to interpret the iCalendar object. ๐Ÿง 

Value Type: TEXT

Property Parameters: Non-standard property parameters can be specified on this property.

Conformance: This property MUST be specified by an iCalendar object, but MUST only be specified once. ๐Ÿ’–

Description: A value of "2.0" corresponds to this memo. โœจ

Format Definition: The property is defined by the following notation:

version    = "VERSION" verparam ":" vervalue CRLF

verparam   = *(";" xparam)

vervalue   = "2.0"         ;This memo
           / maxver
           / (minver ";" maxver)

minver     = <A IANA registered iCalendar version identifier>
;Minimum iCalendar version needed to parse the iCalendar object

maxver     = <A IANA registered iCalendar version identifier>
;Maximum iCalendar version needed to parse the iCalendar object

Example: The following is an example of this property:

VERSION:2.0

4.8. Component Properties ๐Ÿงฉ

The following properties can appear within calendar components, as each component property definition specifies. Think of it as a guest list for each component. ๐ŸŽ€


4.8.1. Descriptive Component Properties ๐Ÿ“

The following properties give you descriptive info about calendar components. It's the tea. โ˜•


4.8.1.1. Attachment ๐Ÿ“Ž

Property Name: ATTACH

Purpose: This property lets you attach a document object to a calendar component. ๐Ÿฆ‹

Value Type: The default value type for this property is URI. You can also set the value type to BINARY, which means inline binary encoded content info. ๐Ÿ”

Property Parameters: Non-standard, inline encoding, format type, and value data type property parameters can be specified on this property.

Conformance: The property can be specified in a "VEVENT", "VTODO", "VJOURNAL" or "VALARM" calendar component. ๐ŸŒˆ

Description: The property can be specified within "VEVENT", "VTODO", "VJOURNAL", or "VALARM" calendar components. It can be specified multiple times within an iCalendar object, so attach away. ๐Ÿ™Œ

Format Definition: The property is defined by the following notation:

attach     = "ATTACH" attparam ":" uri  CRLF

attach     =/ "ATTACH" attparam ";" "ENCODING" "=" "BASE64"
              ";" "VALUE" "=" "BINARY" ":" binary

attparam   = *(

           ; the following is optional,
           ; but MUST NOT occur more than once

           (";" fmttypeparam) /
           ; the following is optional,
           ; and MAY occur more than once

           (";" xparam)

           )

Example: The following are examples of this property:

ATTACH:CID:jsmith.part3.960817T083000.xyzMail@host1.com

ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/
 reports/r-960812.ps

4.8.1.2. Categories ๐Ÿท๏ธ

Property Name: CATEGORIES

Purpose: This property defines the categories for a calendar component. Sorting your vibes, basically. ๐Ÿ—‚๏ธ

Value Type: TEXT

Property Parameters: Non-standard and language property parameters can be specified on this property.

Conformance: The property can be specified within "VEVENT", "VTODO" or "VJOURNAL" calendar components.

Description: This property specifies categories or subtypes of the calendar component. Categories are super useful for searching for a calendar component of a particular type and category. Within the "VEVENT", "VTODO" or "VJOURNAL" calendar components, you can specify more than one category as a list, separated by the COMMA character (US-ASCII decimal 44). ๐Ÿ“

Format Definition: The property is defined by the following notation:

categories = "CATEGORIES" catparam ":" text *("," text)
             CRLF

catparam   = *(

           ; the following is optional,
           ; but MUST NOT occur more than once

           (";" languageparam ) /
           ; the following is optional,
           ; and MAY occur more than once

           (";" xparam)

           )

Example: The following are examples of this property:

CATEGORIES:APPOINTMENT,EDUCATION

CATEGORIES:MEETING

4.8.1.3. Classification ๐Ÿ”’

Property Name: CLASS

Purpose: This property defines the access classification for a calendar component. It's the privacy setting, bestie. ๐Ÿซฃ

Value Type: TEXT

Property Parameters: Non-standard property parameters can be specified on this property.

Conformance: The property can be specified once in a "VEVENT", "VTODO" or "VJOURNAL" calendar component. ๐ŸŽฏ

Description: An access classification is only one piece of the general security system in a calendar app. It gives a way to capture how widely the calendar owner means for the info in one calendar entry to be seen. Its usefulness depends on the other security pieces of the calendar system, like calendar user authentication, authorization, access rights, access role, and so on. ๐Ÿ›ก๏ธ That means this memo alone can't fully define what each access classification means. And since most exchange processes using this memo are "blind," these classifications can't actually enforce anything on a system receiving an iCalendar object. Instead, they capture what the calendar owner intends for access to the component. ๐Ÿ’ญ

Format Definition: The property is defined by the following notation:

class      = "CLASS" classparam ":" classvalue CRLF

classparam = *(";" xparam)
classvalue = "PUBLIC" / "PRIVATE" / "CONFIDENTIAL" / iana-token
           / x-name
;Default is PUBLIC

Example: The following is an example of this property:

CLASS:PUBLIC

4.8.1.4. Comment ๐Ÿ’ฌ

Property Name: COMMENT

Purpose: This property carries non-processing info, meant to give a comment to the calendar user. Pure gossip-level stuff, no logic attached. ๐Ÿคญ

Value Type: TEXT

Property Parameters: Non-standard, alternate text representation, and language property parameters can be specified on this property.

Conformance: This property can be specified in "VEVENT", "VTODO", "VJOURNAL", "VTIMEZONE" or "VFREEBUSY" calendar components. ๐ŸŒŸ

Description: The property can be specified multiple times. ๐Ÿ”

Format Definition: The property is defined by the following notation:

comment    = "COMMENT" commparam ":" text CRLF

commparam  = *(

           ; the following are optional,
           ; but MUST NOT occur more than once

           (";" altrepparam) / (";" languageparam) /

           ; the following is optional,
           ; and MAY occur more than once

           (";" xparam)

           )

Example: The following is an example of this property:

COMMENT:The meeting really needs to include both ourselves
  and the customer. We can't hold this  meeting without them.
  As a matter of fact\, the venue for the meeting ought to be at
  their site. - - John

The data type for this property is TEXT. ๐Ÿฆ„

4.8.1.5. Description โœจ

Property Name: DESCRIPTION ๐Ÿ’–

Okay so this is the property that gives you the full tea on a calendar component, way more than the SUMMARY property does ๐Ÿซถ Think of SUMMARY as the caption and DESCRIPTION as the whole essay ๐Ÿ“

Value Type: TEXT ๐ŸŽ€

Property Parameters: Non-standard, alternate text representation and language property parameters can be specified on this property โœจ

Conformance: The property can be specified in the VEVENT, VTODO, VJOURNAL or VALARM calendar components. It can be specified multiple times only within a VJOURNAL calendar component ๐Ÿฆ‹

Description: In VEVENT and VTODO, this is where you dump all the lengthy textual details about the activity ๐Ÿ’…

In VJOURNAL, it's used to hold one or more textual journal entries ๐Ÿ““๐ŸŒธ

In VALARM, it does triple duty ๐Ÿ”ฅ. For a DISPLAY alarm, it's the display text. For an EMAIL alarm, it's the body text. For a PROCEDURE alarm, it's the argument string ๐Ÿงš

Format Definition: The property is defined by the following notation:

description        = "DESCRIPTION" descparam ":" text CRLF

descparam  = *(

           ; the following are optional,
           ; but MUST NOT occur more than once

           (";" altrepparam) / (";" languageparam) /

           ; the following is optional,
           ; and MAY occur more than once

           (";" xparam)

           )

Example: Here's an example with formatted line breaks in the value ๐Ÿ“ (the \n is how you get a new line, bestie):

DESCRIPTION:Meeting to provide technical review for "Phoenix"
  design.\n Happy Face Conference Room. Phoenix design team
  MUST attend this meeting.\n RSVP to team leader.

And here's one with folding for long lines, because nobody wants a giant wall of text ๐Ÿ™ˆ:

DESCRIPTION:Last draft of the new novel is to be completed
  for the editor's proof today.

4.8.1.6. Geographic Position ๐ŸŒ

Property Name: GEO ๐Ÿ—บ๏ธ

Purpose: This property holds the global position for the activity that a calendar component describes ๐Ÿงญ

Value Type: FLOAT. The value MUST be two SEMICOLON separated FLOAT values. Two floats, separated by a semicolon, no excuses ๐Ÿ’€

Property Parameters: Non-standard property parameters can be specified on this property โœจ

Conformance: This property can be specified in VEVENT or VTODO calendar components ๐ŸŒธ

Description: The value gives latitude and longitude, in that order (so it's "LAT LON", not the other way around) ๐Ÿฆ‹ Longitude is east or west of the prime meridian. East is a positive real number and west is a negative one ๐ŸŒˆ

The longitude and latitude values MAY be specified up to six decimal places. That gets you accuracy to within one meter of the geographical position ๐Ÿ˜ญโœจ Receiving applications MUST accept values at this precision, and they MAY truncate anything more precise than that ๐Ÿซถ

Latitude and longitude are written as decimal fractions of degrees. Whole degrees of latitude are a two-digit decimal number from 0 through 90. Whole degrees of longitude are a decimal number from 0 through 180. When there's a decimal fraction of a degree, it gets separated from the whole degrees by a decimal point ๐ŸŽ€

Latitudes north of the equator get a plus sign (+), or just no minus sign (-), in front of the degree digits. Latitudes south of the equator get a minus sign (-) in front of the degree digits. A point on the equator counts as Northern Hemisphere, no debate ๐Ÿ”ฅ

Longitudes east of the prime meridian get a plus sign (+), or no minus sign (-), in front of the degree digits. Longitudes west of the meridian get a minus sign (-) in front of the degree digits. A point on the prime meridian counts as Eastern Hemisphere, and a point on the 180th meridian counts as Western Hemisphere ๐ŸŒ There's one exception to that last rule. When you're describing a band of latitude around the whole earth, the East Bounding Coordinate gets the value +180 (180) degrees ๐Ÿ‘‘

Any spatial address with a latitude of +90 (90) or -90 degrees is the North or South Pole, respectively ๐ŸงŠ The longitude component can be any legal value there, because it's giving no pressure ๐Ÿ’…

Apart from that special band situation, this format comes from Department of Commerce, 1986, Representation of geographic point locations for information interchange (Federal Information Processing Standard 70-1): Washington, Department of Commerce, National Institute of Standards and Technology. Very official, very nerdy, I love it ๐Ÿ“š๐Ÿ’œ

If you're converting degrees-minutes-seconds into decimal degrees, the simple formula is:

decimal = degrees + minutes/60 + seconds/3600.

Format Definition: The property is defined by the following notation:

geo        = "GEO" geoparam ":" geovalue CRLF

geoparam   = *(";" xparam)

geovalue   = float ";" float
;Latitude and Longitude components

Example: Here's an example of this property ๐Ÿ“

GEO:37.386013;-122.082932

4.8.1.7. Location ๐Ÿ“

Property Name: LOCATION ๐Ÿ 

Purpose: This property defines the intended venue for the activity in a calendar component โœจ

Value Type: TEXT ๐ŸŽ€

Property Parameters: Non-standard, alternate text representation and language property parameters can be specified on this property ๐ŸŒˆ

Conformance: This property can be specified in a VEVENT or VTODO calendar component ๐ŸŒธ

Description: You can name a specific venue like a conference room or meeting room right here ๐Ÿข You can also add an alternate representation, which is a URI pointing to directory information with a more structured description of the location. For example, that alternate representation could be an LDAP URI pointing to an LDAP server entry, or a CID URI pointing to a MIME body part that contains a vCard [RFC 2426] for the location ๐Ÿฆ‹ Very organized, very iconic ๐Ÿ’…

Format Definition: The property is defined by the following notation:

location   = "LOCATION locparam ":" text CRLF

locparam   = *(

           ; the following are optional,
           ; but MUST NOT occur more than once

           (";" altrepparam) / (";" languageparam) /

           ; the following is optional,
           ; and MAY occur more than once

           (";" xparam)

           )

Example: Here are a couple of examples of this property ๐Ÿงš

LOCATION:Conference Room - F123, Bldg. 002

LOCATION;ALTREP="http://xyzcorp.com/conf-rooms/f123.vcf":
 Conference Room - F123, Bldg. 002

4.8.1.8. Percent Complete ๐Ÿ“Š

Property Name: PERCENT-COMPLETE ๐Ÿ’ฏ

Purpose: An assignee or delegatee of a to-do uses this property to tell the Organizer how much of the to-do is done ๐Ÿซถ

Value Type: INTEGER ๐Ÿ”ข

Property Parameters: Non-standard property parameters can be specified on this property โœจ

Conformance: This property can be specified in a VTODO calendar component ๐ŸŒธ

Description: The value is a positive integer from zero to one hundred. A 0 means the to-do hasn't been started yet ๐ŸŒฑ A 100 means it's completely finished ๐Ÿ† Anything in between means it's partially done ๐ŸŒˆ

When a to-do gets assigned to more than one person, the value shows the percent complete for that person's share of it ๐Ÿค For example, say a to-do is assigned to both "A" and "B". If "A" replies with a percent complete of "70", that means "A" has finished 70% of the to-do assigned to them. If "B" replies with "50", that means "B" has finished 50% of the to-do assigned to them ๐Ÿ’…

Format Definition: The property is defined by the following notation:

percent = "PERCENT-COMPLETE" pctparam ":" integer CRLF

pctparam   = *(";" xparam)

Example: Here's an example of this property showing 39% completion ๐Ÿฆ‹

PERCENT-COMPLETE:39

4.8.1.9. Priority ๐Ÿšจ

Property Name: PRIORITY ๐Ÿ‘‘

Purpose: This property defines the relative priority of a calendar component ๐Ÿ”ฅ

Value Type: INTEGER

Property Parameters: Non-standard property parameters can be specified on this property โœจ

Conformance: This property can be specified in a VEVENT or VTODO calendar component ๐ŸŒธ

Description: Priority is an integer from zero to nine ๐Ÿ”ข A value of zero (US-ASCII decimal 48) means the priority is undefined ๐Ÿซฅ A value of one (US-ASCII decimal 49) is the highest priority ๐Ÿ‘‘ A value of two (US-ASCII decimal 50) is the second highest, and so on. The numbers keep going down in ordinal priority, and nine (US-ASCII decimal 58) is the lowest priority ๐Ÿ“‰

Some CUAs use a three-level scheme of "HIGH", "MEDIUM" and "LOW". Those get mapped onto this property like so: a value from one (US-ASCII decimal 49) through four (US-ASCII decimal 52) means "HIGH" priority ๐Ÿ”ด. A value of five (US-ASCII decimal 53) is the normal or "MEDIUM" priority ๐ŸŸก. A value from six (US-ASCII decimal 54) through nine (US-ASCII decimal 58) means "LOW" priority ๐ŸŸข

Other CUAs use a priority schema of "A1", "A2", "A3", "B1", "B2", ... "C3". That gets mapped as: a value of one (US-ASCII decimal 49) is "A1", a value of two (US-ASCII decimal 50) is "A2", a value of three (US-ASCII decimal 51) is "A3", and so on, up to a value of 9 (US-ASCII decimal 58) for "C3" ๐Ÿงฉ

Other integer values are reserved for future use ๐Ÿ”ฎ

Inside a VEVENT, this property sets a priority for the event. It may be handy when more than one event is scheduled for the same time period ๐Ÿ“…

Inside a VTODO, this property sets a priority for the to-do. It's useful for ranking multiple action items in the same time period ๐Ÿ—‚๏ธ

Format Definition: The property is specified by the following notation:

priority   = "PRIORITY" prioparam ":" privalue CRLF
;Default is zero

prioparam  = *(";" xparam)

privalue   = integer       ;Must be in the range [0..9]
   ; All other values are reserved for future use

Here's an example of a property with the highest priority ๐Ÿ‘‘

PRIORITY:1

And here's one with the next highest priority โญ

PRIORITY:2

Example: Here's a property with no priority. This is the same as not specifying the PRIORITY property at all ๐Ÿ™ˆ

PRIORITY:0

4.8.1.10 Resources ๐ŸŽ€

Property Name: RESOURCES

Purpose: okay so this one lets you list the equipment or resources you expect an activity on a calendar entry to need ๐Ÿงฐ

Value Type: TEXT

Property Parameters: non-standard, alternate text representation and language property parameters can be specified on this property โœจ

Conformance: this property can be specified in a "VEVENT" or "VTODO" calendar component ๐Ÿ“…

Description: the property value is just arbitrary text ๐Ÿ“ You can list more than one resource by separating them with the COMMA character (US-ASCII decimal 44), so it's basically a little comma-separated list ๐Ÿ“

Format Definition: the property is defined by the following notation:

  resources  = "RESOURCES" resrcparam ":" text *("," text) CRLF

  resrcparam = *(

             ; the following are optional,
             ; but MUST NOT occur more than once

             (";" altrepparam) / (";" languageparam) /

             ; the following is optional,
             ; and MAY occur more than once
             (";" xparam)

             )

Example: here's what it looks like ๐Ÿ‘€

  RESOURCES:EASEL,PROJECTOR,VCR

  RESOURCES;LANGUAGE=fr:1 raton-laveur

4.8.1.11 Status ๐Ÿ’…

Property Name: STATUS

Purpose: this property shows the overall status or confirmation for the calendar component ๐Ÿ’–

Value Type: TEXT

Property Parameters: non-standard property parameters can be specified on this property ๐ŸŽ€

Conformance: this property can be specified in "VEVENT", "VTODO" or "VJOURNAL" calendar components ๐Ÿฆ‹

Description: in a group scheduled calendar component, the "Organizer" uses this property to confirm the event for the "Attendees" ๐Ÿซถ In a "VEVENT", the "Organizer" can say that a meeting is tentative, confirmed or cancelled. In a "VTODO", the "Organizer" can say that an action item needs action, is completed, is in process or being worked on, or has been cancelled ๐Ÿ”ฅ In a "VJOURNAL", the "Organizer" can say that a journal entry is draft, final or has been cancelled or removed ๐Ÿ““

Format Definition: the property is defined by the following notation:

  status     = "STATUS" statparam] ":" statvalue CRLF

  statparam  = *(";" xparam)

  statvalue  = "TENTATIVE"           ;Indicates event is
                                     ;tentative.
             / "CONFIRMED"           ;Indicates event is
                                     ;definite.
             / "CANCELLED"           ;Indicates event was
                                     ;cancelled.
     ;Status values for a "VEVENT"

  statvalue  =/ "NEEDS-ACTION"       ;Indicates to-do needs action.
             / "COMPLETED"           ;Indicates to-do completed.
             / "IN-PROCESS"          ;Indicates to-do in process of
             / "CANCELLED"           ;Indicates to-do was cancelled.
     ;Status values for "VTODO".

  statvalue  =/ "DRAFT"              ;Indicates journal is draft.
             / "FINAL"               ;Indicates journal is final.
             / "CANCELLED"           ;Indicates journal is removed.
     ;Status values for "VJOURNAL".

Example: for a "VEVENT" component, it looks like this โœจ

  STATUS:TENTATIVE

For a "VTODO" component, it's this ๐Ÿงš

  STATUS:NEEDS-ACTION

And for a "VJOURNAL" component, it's this ๐ŸŒธ

  STATUS:DRAFT

4.8.1.12 Summary ๐ŸŒˆ

Property Name: SUMMARY

Purpose: this property gives a short summary or subject for the calendar component ๐Ÿ’œ

Value Type: TEXT

Property Parameters: non-standard, alternate text representation and language property parameters can be specified on this property ๐ŸŽ€

Conformance: the property can be specified in "VEVENT", "VTODO", "VJOURNAL" or "VALARM" calendar components ๐Ÿฆ‹

Description: in the "VEVENT", "VTODO" and "VJOURNAL" components, this property captures a short, one line summary about the activity or journal entry โœจ

In the "VALARM" component, this property captures the subject of an EMAIL category of alarm ๐Ÿ“ง

Format Definition: the property is defined by the following notation:

  summary    = "SUMMARY" summparam ":" text CRLF

  summparam  = *(

             ; the following are optional,
             ; but MUST NOT occur more than once

             (";" altrepparam) / (";" languageparam) /

             ; the following is optional,
             ; and MAY occur more than once

             (";" xparam)

             )

Example: here's an example ๐Ÿ’–

  SUMMARY:Department Party

4.8.2 Date and Time Component Properties โฐ

The following properties specify date and time related information in calendar components ๐Ÿ•ฐ๏ธ

4.8.2.1 Date/Time Completed โœ…

Property Name: COMPLETED

Purpose: this property defines the date and time that a to-do was actually completed ๐ŸŽ‰

Value Type: DATE-TIME

Property Parameters: non-standard property parameters can be specified on this property โœจ

Conformance: the property can be specified in a "VTODO" calendar component ๐Ÿ“

Description: the date and time MUST be in a UTC format ๐ŸŒ

Format Definition: the property is defined by the following notation:

  completed  = "COMPLETED" compparam ":" date-time CRLF
  compparam  = *(";" xparam)

Example: here's an example ๐Ÿ’…

  COMPLETED:19960401T235959Z

4.8.2.2 Date/Time End ๐Ÿ

Property Name: DTEND

Purpose: this property specifies the date and time that a calendar component ends ๐ŸŒ…

Value Type: the default value type is DATE-TIME, and it can be set to a DATE value type ๐Ÿ’ซ

Property Parameters: non-standard, value data type, time zone identifier property parameters can be specified on this property ๐ŸŒ

Conformance: this property can be specified in "VEVENT" or "VFREEBUSY" calendar components ๐Ÿ—“๏ธ

Description: within the "VEVENT" component, this property defines the date and time the event ends by. The value MUST be later in time than the value of the "DTSTART" property ๐Ÿ™ˆ

Within the "VFREEBUSY" component, this property defines the end date and time for the free or busy time information. The time MUST be specified in the UTC time format. The value MUST be later in time than the value of the "DTSTART" property ๐Ÿซง

Format Definition: the property is defined by the following notation:

  dtend      = "DTEND" dtendparam":" dtendval CRLF

  dtendparam = *(

             ; the following are optional,
             ; but MUST NOT occur more than once

             (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
             (";" tzidparam) /

             ; the following is optional,
             ; and MAY occur more than once
             (";" xparam)

             )



  dtendval   = date-time / date
  ;Value MUST match value type

Example: here are two examples ๐Ÿ’–

  DTEND:19960401T235959Z

  DTEND;VALUE=DATE:19980704

4.8.2.3 Date/Time Due ๐Ÿ“

Property Name: DUE

Purpose: this property defines the date and time that a to-do is expected to be completed ๐Ÿ—“๏ธ

Value Type: the default value type is DATE-TIME, and it can be set to a DATE value type ๐Ÿ’ซ

Property Parameters: non-standard, value data type, time zone identifier property parameters can be specified on this property ๐ŸŒ

Conformance: the property can be specified once in a "VTODO" calendar component โ˜๏ธ

Description: the value MUST be a date/time equal to or after the DTSTART value, if specified ๐Ÿ™Œ

Format Definition: the property is defined by the following notation:

  due        = "DUE" dueparam":" dueval CRLF

  dueparam   = *(
             ; the following are optional,
             ; but MUST NOT occur more than once

             (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
             (";" tzidparam) /

             ; the following is optional,
             ; and MAY occur more than once

               *(";" xparam)

             )



  dueval     = date-time / date
  ;Value MUST match value type

Example: here's an example ๐ŸŒธ

  DUE:19980430T235959Z

4.8.2.4 Date/Time Start ๐Ÿš€

Property Name: DTSTART

Purpose: this property specifies when the calendar component begins ๐ŸŒ…

Value Type: the default value type is DATE-TIME. The time value MUST be one of the forms defined for the DATE-TIME value type. The value type can be set to a DATE value type ๐Ÿงฉ

Property Parameters: non-standard, value data type, time zone identifier property parameters can be specified on this property ๐ŸŒ

Conformance: this property can be specified in the "VEVENT", "VTODO", "VFREEBUSY", or "VTIMEZONE" calendar components ๐Ÿ—‚๏ธ

Description: within the "VEVENT" component, this property defines the start date and time for the event. The property is REQUIRED in "VEVENT" calendar components. Events can have a start date/time but no end date/time. In that case, the event does not take up any time โณ

Within the "VFREEBUSY" component, this property defines the start date and time for the free or busy time information. The time MUST be specified in UTC time ๐ŸŒ

Within the "VTIMEZONE" component, this property defines the effective start date and time for a time zone specification. This property is REQUIRED within each STANDARD and DAYLIGHT part included in "VTIMEZONE" calendar components and MUST be specified as a local DATE-TIME without the "TZID" property parameter ๐ŸŒ™

Format Definition: the property is defined by the following notation:

  dtstart    = "DTSTART" dtstparam ":" dtstval CRLF
  dtstparam  = *(

             ; the following are optional,
             ; but MUST NOT occur more than once

             (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
             (";" tzidparam) /

             ; the following is optional,
             ; and MAY occur more than once

               *(";" xparam)

             )



  dtstval    = date-time / date
  ;Value MUST match value type

Example: here's an example ๐Ÿฆ‹

  DTSTART:19980118T073000Z

4.8.2.5 Duration โŒ›

Property Name: DURATION

Purpose: the property specifies a positive duration of time ๐Ÿ’œ

Value Type: DURATION

Property Parameters: non-standard property parameters can be specified on this property ๐ŸŽ€

Conformance: the property can be specified in "VEVENT", "VTODO", "VFREEBUSY" or "VALARM" calendar components ๐Ÿฆ‹

Description: in a "VEVENT" component the property may be used to specify a duration of the event, instead of an explicit end date/time. In a "VTODO" component the property may be used to specify a duration for the to-do, instead of an explicit due date/time. In a "VFREEBUSY" component the property may be used to specify the interval of free time being requested. In a "VALARM" component the property may be used to specify the delay period prior to repeating an alarm ๐Ÿ””

Format Definition: the property is defined by the following notation:

  duration   = "DURATION" durparam ":" dur-value CRLF
               ;consisting of a positive duration of time.

  durparam   = *(";" xparam)

Example: this example specifies an interval of time of 1 hour and zero minutes and zero seconds ๐Ÿ•

  DURATION:PT1H0M0S

And this one specifies an interval of time of 15 minutes โฑ๏ธ

  DURATION:PT15M

4.8.2.6 Free/Busy Time

Property Name: FREEBUSY ๐ŸŽ€

Purpose: Okay bestie, this one lays out one or more free or busy time intervals so everyone can see exactly when someone is open or booked ๐Ÿ’…

Value Type: PERIOD. The date and time values MUST be in an UTC time format ๐ŸŒธ

Property Parameters: Non-standard or free/busy time type property parameters can be specified on this property โœจ

Conformance: The property can be specified in a VFREEBUSY calendar component ๐Ÿฆ‹

Property Parameter: FBTYPE and non-standard parameters can be specified on this property ๐Ÿ’œ

Description: These time periods can be specified as either a start and end date-time, or a start date-time and a duration. The date and time MUST be a UTC time format. No exceptions, periodt ๐Ÿซถ

FREEBUSY properties within the VFREEBUSY calendar component SHOULD be sorted in ascending order, based on start time and then end time, with the earliest periods first. Main character energy is the earliest one going first ๐Ÿ‘‘

The FREEBUSY property can specify more than one value, separated by the COMMA character (US-ASCII decimal 44). In those cases, the FREEBUSY property values SHOULD all be of the same FBTYPE property parameter type. For example, all the values of a particular FBTYPE get listed together in a single property ๐Ÿ“

Format Definition: The property is defined by the following notation:

freebusy   = "FREEBUSY" fbparam ":" fbvalue
             CRLF

fbparam    = *(
           ; the following is optional,
           ; but MUST NOT occur more than once

           (";" fbtypeparam) /

           ; the following is optional,
           ; and MAY occur more than once

           (";" xparam)

           )

fbvalue    = period *["," period]
;Time value MUST be in the UTC time format.

Example: Here are some examples of this property ๐Ÿงš

FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:19970308T160000Z/PT8H30M

FREEBUSY;FBTYPE=FREE:19970308T160000Z/PT3H,19970308T200000Z/PT1H

FREEBUSY;FBTYPE=FREE:19970308T160000Z/PT3H,19970308T200000Z/PT1H,
 19970308T230000Z/19970309T000000Z

4.8.2.7 Time Transparency

Property Name: TRANSP ๐Ÿฆ‹

Purpose: This property defines whether an event is transparent or not to busy time searches. It's giving "see-through or solid" energy โœจ

Value Type: TEXT

Property Parameters: Non-standard property parameters can be specified on this property.

Conformance: This property can be specified once in a VEVENT calendar component.

Description: Time Transparency is the characteristic of an event that determines whether it appears to consume time on a calendar. Events that consume actual time for the individual or resource associated with the calendar SHOULD be recorded as OPAQUE, so they can be detected by free-busy time searches. Other events, which don't take up the individual's (or resource's) time, SHOULD be recorded as TRANSPARENT, which makes them invisible to free-busy time searches ๐Ÿซง

Format Definition: The property is specified by the following notation:

transp     = "TRANSP" tranparam ":" transvalue CRLF

tranparam  = *(";" xparam)

transvalue = "OPAQUE"      ;Blocks or opaque on busy time searches.
           / "TRANSPARENT" ;Transparent on busy time searches.
   ;Default value is OPAQUE

Example: Here's the one for an event that's transparent, meaning it doesn't block free/busy time searches ๐ŸŒˆ

TRANSP:TRANSPARENT

And here's the one for an event that's opaque, meaning it does block free/busy time searches ๐Ÿ”ฅ

TRANSP:OPAQUE

4.8.3 Time Zone Component Properties

The following properties specify time zone information in calendar components ๐ŸŒ

4.8.3.1 Time Zone Identifier

Property Name: TZID ๐ŸŽ€

Purpose: This property specifies the text value that uniquely identifies the VTIMEZONE calendar component. It's the name tag for the time zone ๐Ÿท๏ธ

Value Type: TEXT

Property Parameters: Non-standard property parameters can be specified on this property.

Conformance: This property MUST be specified in a VTIMEZONE calendar component ๐Ÿ’–

Description: This is the label that any iCalendar properties use to reference a time zone calendar component, as long as their data type is either DATE-TIME or TIME and they aren't meant to be a UTC or a "floating" time. A SOLIDUS character (US-ASCII decimal 47) at the front signals that this TZID is an unique ID in a globally defined time zone registry (when such a registry is defined) ๐ŸŒ

Note: This document does not define a naming convention for time zone identifiers. Implementers may want to use the naming conventions defined in existing time zone specifications, such as the public-domain Olson database [TZ]. Globally unique time zone identifiers aren't addressed by this document and are left for future study. Lowkey a plot twist for later ๐Ÿ™ˆ

Format Definition: This property is defined by the following notation:

tzid       = "TZID" tzidpropparam ":" [tzidprefix] text CRLF

tzidpropparam      = *(";" xparam)

;tzidprefix        = "/"
; Defined previously. Just listed here for reader convenience.

Example: These are examples of non-globally unique time zone identifiers ๐Ÿญ

TZID:US-Eastern

TZID:California-Los_Angeles

And this is a fictitious globally unique time zone identifier ๐Ÿง

TZID:/US-New_York-New_York

4.8.3.2 Time Zone Name

Property Name: TZNAME ๐ŸŽ€

Purpose: This property specifies the customary designation for a time zone description. Basically the time zone's official nickname ๐Ÿ’…

Value Type: TEXT

Property Parameters: Non-standard and language property parameters can be specified on this property.

Conformance: This property can be specified in a VTIMEZONE calendar component.

Description: This property may be specified in multiple languages, so it can meet different language needs ๐ŸŒธ

Format Definition: This property is defined by the following notation:

tzname     = "TZNAME" tznparam ":" text CRLF

tznparam   = *(

           ; the following is optional,
           ; but MUST NOT occur more than once

           (";" languageparam) /

           ; the following is optional,
           ; and MAY occur more than once

           (";" xparam)

           )

Example: Here's an example of this property ๐Ÿงš

TZNAME:EST

And here's one where two different languages are specified for the time zone name ๐ŸŒˆ

TZNAME;LANGUAGE=en:EST
TZNAME;LANGUAGE=fr-CA:HNE

4.8.3.3 Time Zone Offset From

Property Name: TZOFFSETFROM ๐Ÿฆ‹

Purpose: This property specifies the offset that's in use before this time zone observance kicks in โฐ

Value Type: UTC-OFFSET

Property Parameters: Non-standard property parameters can be specified on this property.

Conformance: This property MUST be specified in a VTIMEZONE calendar component. Non-negotiable, bestie ๐Ÿ‘‘

Description: This property specifies the offset that's in use before this time observance. It's used to calculate the absolute time at which the transition to a given observance happens. This property MUST only be specified in a VTIMEZONE calendar component, and a VTIMEZONE calendar component MUST include this property. The value is a signed numeric that shows the number of hours, and possibly minutes, from UTC. Positive numbers mean time zones east of the prime meridian (ahead of UTC). Negative numbers mean time zones west of the prime meridian (behind UTC) ๐ŸŒโœจ

Format Definition: The property is defined by the following notation:

tzoffsetfrom       = "TZOFFSETFROM" frmparam ":" utc-offset
                     CRLF

frmparam   = *(";" xparam)

Example: Here are examples of this property ๐Ÿ’–

TZOFFSETFROM:-0500

TZOFFSETFROM:+1345

4.8.3.4 Time Zone Offset To

Property Name: TZOFFSETTO ๐ŸŽ€

Purpose: This property specifies the offset that's in use in this time zone observance. The new vibe after the switch ๐ŸŒ™

Value Type: UTC-OFFSET

Property Parameters: Non-standard property parameters can be specified on this property.

Conformance: This property MUST be specified in a VTIMEZONE calendar component ๐Ÿ’…

Description: This property specifies the offset that's in use in this time zone observance. It's used to calculate the absolute time for the new observance. The value is a signed numeric that shows the number of hours, and possibly minutes, from UTC. Positive numbers mean time zones east of the prime meridian (ahead of UTC). Negative numbers mean time zones west of the prime meridian (behind UTC) ๐Ÿซถ

Format Definition: The property is defined by the following notation:

tzoffsetto = "TZOFFSETTO" toparam ":" utc-offset CRLF

toparam    = *(";" xparam)

Example: Here are examples of this property ๐Ÿง

TZOFFSETTO:-0400

TZOFFSETTO:+1245

4.8.3.5 Time Zone URL

Property Name: TZURL ๐Ÿฆ‹

Purpose: The TZURL gives a VTIMEZONE component a way to point to a network location where it can grab an up-to-date version of itself. It's like a little link to the freshest info ๐Ÿ”—

Value Type: URI

Property Parameters: Non-standard property parameters can be specified on this property.

Conformance: This property can be specified in a VTIMEZONE calendar component.

Description: The TZURL gives a VTIMEZONE component a way to point to a network location that can be used to retrieve an up-to-date version of itself. This is a hook for handling changes that government bodies make to time zone definitions, which is so iconic of them ๐Ÿ›๏ธโœจ. Retrieving this resource gives you an iCalendar object containing a single VTIMEZONE component and a METHOD property set to PUBLISH ๐ŸŒธ

Format Definition: The property is defined by the following notation:

tzurl      = "TZURL" tzurlparam ":" uri CRLF

tzurlparam = *(";" xparam)

Example: Here's an example of this property ๐ŸŒˆ

TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles

4.8.4 Relationship Component Properties

The following properties specify relationship information in calendar components ๐Ÿ’œ

4.8.4.1 Attendee

Property Name: ATTENDEE ๐Ÿ’–

Purpose: okay so this property is how you define an "Attendee" inside a calendar component ๐ŸŽ€

Value Type: CAL-ADDRESS

Property Parameters: non-standard, language, calendar user type, group or list membership, participation role, participation status, RSVP expectation, delegatee, delegator, sent by, common name, or directory entry reference property parameters can all go on this property โœจ

Conformance: bestie, this part is serious ๐Ÿซถ This property MUST be specified in an iCalendar object that specifies a group scheduled calendar entity. This property MUST NOT be specified in an iCalendar object when you're publishing calendar info (so NOT in one that publishes a calendar user's busy time, event, to-do or journal). It's also not in an iCalendar object that only has a time zone definition, or one that defines calendar entities that aren't group scheduled and only live on a single user's calendar. ๐Ÿ’…

Description: the property MUST only be specified within calendar components, to list the participants, non-participants and the chair of a group scheduled calendar entity ๐Ÿ‘‘ It also shows up inside an "EMAIL" category of the "VALARM" calendar component, where it gives the email address that gets the email type of iCalendar alarm ๐Ÿ“ง

The parameters are the glow-up squad ๐ŸŒธ CN is the common or displayable name tied to the calendar address. ROLE is the role the attendee is meant to have in the calendar component. PARTSTAT is the status of their participation. RSVP says whether a reply is requested (the favor of a reply, basically). CUTYPE tells you what kind of calendar user it is. MEMBER shows which groups the attendee belongs to. DELEGATED-TO lists the calendar users the original request got delegated to, and DELEGATED-FROM shows who it was delegated from. SENT-BY is for whoever is acting on behalf of the ATTENDEE, and DIR is a URI that points to the directory info for the attendee ๐Ÿ—‚๏ธ

These parameters can go on an "ATTENDEE" property in a "VEVENT", "VTODO" or "VJOURNAL" calendar component. They MUST not be specified in an "ATTENDEE" property in a "VFREEBUSY" or "VALARM" calendar component ๐Ÿ™ˆ And if the LANGUAGE parameter is there, that language applies to the CN parameter ๐ŸŒˆ

A recipient who got a delegated request MUST inherit the RSVP and ROLE values from the attendee who delegated it to them ๐Ÿฆ‹

You can have multiple attendees by including multiple "ATTENDEE" properties in the calendar component. The more the merrier โœจ

Format Definition: here's the notation, no cap ๐Ÿงš

attendee   = "ATTENDEE" attparam ":" cal-address CRLF

attparam   = *(

           ; the following are optional,
           ; but MUST NOT occur more than once

           (";" cutypeparam) / (";"memberparam) /
           (";" roleparam) / (";" partstatparam) /
           (";" rsvpparam) / (";" deltoparam) /
           (";" delfromparam) / (";" sentbyparam) /
           (";"cnparam) / (";" dirparam) /
           (";" languageparam) /

           ; the following is optional,
           ; and MAY occur more than once

           (";" xparam)

           )

Example: here's how it looks for a to-do ๐Ÿ“

ORGANIZER:MAILTO:jsmith@host1.com
ATTENDEE;MEMBER="MAILTO:DEV-GROUP@host2.com":
 MAILTO:joecool@host2.com
ATTENDEE;DELEGATED-FROM="MAILTO:immud@host3.com":
 MAILTO:ildoit@host1.com

And for multiple attendees on an event ๐Ÿ‘‘

ORGANIZER:MAILTO:jsmith@host1.com
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;CN=Henry Cabot
 :MAILTO:hcabot@host2.com
ATTENDEE;ROLE=REQ-PARTICIPANT;DELEGATED-FROM="MAILTO:bob@host.com"
 ;PARTSTAT=ACCEPTED;CN=Jane Doe:MAILTO:jdoe@host1.com

Here's one with a URI to the attendee's directory info ๐Ÿ”

ATTENDEE;CN=John Smith;DIR="ldap://host.com:6666/o=eDABC%
 20Industries,c=3DUS??(cn=3DBJim%20Dolittle)":MAILTO:jimdo@
 host1.com

Now one with "delegatee" and "delegator" info for an event ๐ŸŽ€

ORGANIZER;CN=John Smith:MAILTO:jsmith@host.com
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;DELEGATED-FROM=
 "MAILTO:iamboss@host2.com";CN=Henry Cabot:MAILTO:hcabot@
 host2.com
ATTENDEE;ROLE=NON-PARTICIPANT;PARTSTAT=DELEGATED;DELEGATED-TO=
 "MAILTO:hcabot@host2.com";CN=The Big Cheese:MAILTO:iamboss
 @host2.com
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;CN=Jane Doe
 :MAILTO:jdoe@host1.com

And this one is for when another calendar user is acting on behalf of the "Attendee" ๐Ÿ™Œ

ATTENDEE;SENT-BY=MAILTO:jan_doe@host1.com;CN=John Smith:MAILTO:
 jsmith@host1.com

4.8.4.2 Contact

Property Name: CONTACT ๐Ÿ“‡

Purpose: this one holds contact info, or a reference to contact info, linked to the calendar component ๐Ÿ’Œ

Value Type: TEXT

Property Parameters: non-standard, alternate text representation and language property parameters can be specified on this property ๐ŸŒธ

Conformance: this property can be specified in a "VEVENT", "VTODO", "VJOURNAL" or "VFREEBUSY" calendar component โœจ

Description: the property value is textual contact info. You can also give an alternative representation that points to a URI for another form of the contact info, like a vCard [RFC 2426] ๐Ÿงš

Format Definition: the notation, slay ๐Ÿ’…

contact    = "CONTACT" contparam ":" text CRLF

contparam  = *(
           ; the following are optional,
           ; but MUST NOT occur more than once

           (";" altrepparam) / (";" languageparam) /

           ; the following is optional,
           ; and MAY occur more than once

           (";" xparam)

           )

Example: plain textual contact info ๐Ÿ“

CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234

Now with an alternate representation as an LDAP URI to a directory entry with the contact info ๐Ÿ”

CONTACT;ALTREP="ldap://host.com:6666/o=3DABC%20Industries\,
 c=3DUS??(cn=3DBJim%20Dolittle)":Jim Dolittle\, ABC Industries\,
 +1-919-555-1234

Here's an alternate representation as a MIME body part with the contact info, like a vCard [RFC 2426] embedded in a [MIME-DIR] content-type ๐Ÿฆ‹

CONTACT;ALTREP="CID=<part3.msg970930T083000SILVER@host.com>":Jim
  Dolittle\, ABC Industries\, +1-919-555-1234

And one referencing a network resource, like a vCard [RFC 2426] object with the contact info ๐ŸŒˆ

CONTACT;ALTREP="http://host.com/pdi/jdoe.vcf":Jim
  Dolittle\, ABC Industries\, +1-919-555-1234

4.8.4.3 Organizer

Property Name: ORGANIZER ๐Ÿ‘‘

Purpose: this property defines the organizer for a calendar component ๐ŸŽ€

Value Type: CAL-ADDRESS

Property Parameters: non-standard, language, common name, directory entry reference, sent by property parameters can be specified on this property โœจ

Conformance: this property MUST be specified in an iCalendar object that specifies a group scheduled calendar entity. It MUST also be specified in an iCalendar object that specifies the publication of a calendar user's busy time ๐Ÿซถ This property MUST NOT be specified in an iCalendar object that specifies only a time zone definition, or that defines calendar entities that aren't group scheduled and are only on a single user's calendar ๐Ÿ’…

Description: the property shows up within the "VEVENT", "VTODO", "VJOURNAL" calendar components to say who the organizer of a group scheduled calendar entity is ๐Ÿ‘‘ In a "VFREEBUSY" component it says which calendar user is requesting the free or busy time. When a "VFREEBUSY" component is published, the property tells you which calendar the published busy time came from ๐Ÿ—“๏ธ

It has the parameters CN, for the common or display name of the "Organizer"; DIR, for a pointer to the directory info for the "Organizer"; and SENT-BY, for another calendar user who's acting on the "Organizer"'s behalf. The non-standard parameters can be specified on it too. If the LANGUAGE parameter is there, that language applies to the CN parameter value ๐ŸŒธ

Format Definition: the notation, periodt ๐Ÿ’–

organizer  = "ORGANIZER" orgparam ":"
             cal-address CRLF

orgparam   = *(

           ; the following are optional,
           ; but MUST NOT occur more than once

           (";" cnparam) / (";" dirparam) / (";" sentbyparam) /
           (";" languageparam) /

           ; the following is optional,
           ; and MAY occur more than once

           (";" xparam)

           )

Example: the simplest version ๐Ÿงš

ORGANIZER;CN=John Smith:MAILTO:jsmith@host1.com

With a pointer to the directory info for the organizer ๐Ÿ”

ORGANIZER;CN=JohnSmith;DIR="ldap://host.com:6666/o=3DDC%20Associ
 ates,c=3DUS??(cn=3DJohn%20Smith)":MAILTO:jsmith@host1.com

And this one is used by another calendar user acting on behalf of the organizer. Responses are meant to go back to the organizer, not to that other calendar user ๐Ÿ™ˆ

ORGANIZER;SENT-BY="MAILTO:jane_doe@host.com":
 MAILTO:jsmith@host1.com

4.8.4.4 Recurrence ID โœจ

Property Name: RECURRENCE-ID

Purpose: okay so this one works together with the UID and SEQUENCE properties ๐ŸŽ€ to point at one specific instance of a recurring VEVENT, VTODO or VJOURNAL component. Its value is the effective value of the DTSTART property of that recurrence instance. ๐Ÿฆ‹

Value Type: the default is DATE-TIME ๐Ÿ’– and the time can be any of the valid DATE-TIME forms (see the DATE-TIME value type definition for what each form means). You can also set the value type to DATE. ๐Ÿ“…

Property Parameters: non-standard, value data type, time zone identifier and recurrence identifier range parameters can all go on this one ๐Ÿ’…

Conformance: this property shows up in an iCalendar object that has a recurring calendar component. ๐ŸŒธ

Description: the whole recurrence set is referenced by just the UID value of the component, and then RECURRENCE-ID lets you zoom in on one instance inside that set. โœจ

If the DTSTART value is a DATE type value, then the value MUST be the calendar date for the recurrence instance. ๐Ÿ“†

The date/time value is set to the time when the original recurrence instance would occur. So if you want to move a Friday meeting to Thursday, the date/time is still the original Friday meeting ๐Ÿ™ˆ (the vibe is "remember where it started, bestie").

Okay, here's the lore: for a given pair of UID and SEQUENCE values, the RECURRENCE-ID value for a recurrence instance is fixed. ๐Ÿ”’ But when the definition of the recurrence set changes (so the SEQUENCE value changes too), the RECURRENCE-ID for a given instance might also change. ๐ŸŒˆ

The RANGE parameter tells you the effective range of recurrence instances starting from the instance named by the RECURRENCE-ID value. By default it's just that one single instance ๐Ÿงš The value can also be THISANDPRIOR, which covers the given instance and all the earlier ones, or THISANDFUTURE, which covers the given instance and all the later ones. ๐Ÿ’œ

Format Definition: the property is defined by the following notation:

   recurid    = "RECURRENCE-ID" ridparam ":" ridval CRLF

   ridparam   = *(

              ; the following are optional,
              ; but MUST NOT occur more than once

              (";" "VALUE" "=" ("DATE-TIME" / "DATE)) /
              (";" tzidparam) / (";" rangeparam) /
              ; the following is optional,
              ; and MAY occur more than once

              (";" xparam)

              )

   ridval     = date-time / date
   ;Value MUST match value type

Example: here are some examples of this property ๐Ÿ“

   RECURRENCE-ID;VALUE=DATE:19960401

   RECURRENCE-ID;RANGE=THISANDFUTURE:19960120T120000Z

Property Name: RELATED-TO

Purpose: this property is how one calendar component refers to, or has a relationship with, another one. ๐Ÿซถ

Value Type: TEXT ๐Ÿ“

Property Parameters: non-standard and relationship type property parameters can go on this property ๐ŸŒท

Conformance: this property can show up one or more times in the VEVENT, VTODO or VJOURNAL calendar components. ๐Ÿ’ซ

Description: the value is the persistent, globally unique identifier of another calendar component. In a calendar component, that identifier shows up as the UID property. ๐Ÿ†”

By default, the value points to a calendar component that has a PARENT relationship to the component doing the referencing. The RELTYPE property parameter can either spell out that default PARENT relationship, or override it so you get a CHILD or SIBLING relationship instead. ๐Ÿ‘‘ A PARENT relationship means the component is a subordinate of the referenced component. A CHILD relationship means the component is a superior of the referenced component. A SIBLING relationship means the component is a peer of the referenced component. ๐Ÿ‘ฏโ€โ™€๏ธ

Changes to a component referenced by this property can have an implicit impact on the related component. For example, if a group event changes its start or end date or time, then the related, dependent events will need to have their start and end dates changed in a corresponding way. ๐Ÿ—“๏ธ Similarly, if a PARENT component is canceled or deleted, there's an implied impact on the related CHILD components. ๐Ÿ’€ This property is only meant to give information about how calendar components relate to each other. It's up to the target calendar system to keep up with any property implications of that relationship. ๐Ÿง 

Format Definition: the property is defined by the following notation:

   related    = "RELATED-TO" [relparam] ":" text CRLF

   relparam   = *(

              ; the following is optional,
              ; but MUST NOT occur more than once

              (";" reltypeparam) /

              ; the following is optional,
              ; and MAY occur more than once

              (";" xparm)

              )

Example: the following are examples of this property ๐Ÿงšโ€โ™€๏ธ

   RELATED-TO:<jsmith.part7.19960817T083000.xyzMail@host3.com>

   RELATED-TO:<19960401-080045-4000F192713-0052@host1.com>

4.8.4.6 Uniform Resource Locator ๐ŸŒ

Property Name: URL

Purpose: this property defines a Uniform Resource Locator (URL) that goes with the iCalendar object. ๐Ÿฆ‹

Value Type: URI ๐Ÿ”—

Property Parameters: non-standard property parameters can go on this property ๐ŸŽ€

Conformance: this property can be specified once in the VEVENT, VTODO, VJOURNAL or VFREEBUSY calendar components. ๐Ÿ’…

Description: a component can use this property to point to a place where a more dynamic version of the calendar info for that component can be found. โœจ This memo doesn't try to standardize the form of the URI, or the format of the resource it points to. ๐Ÿคทโ€โ™€๏ธ And if both the URL property and the Content-Location MIME header are specified, they MUST point to the same resource. ๐Ÿ”ฅ

Format Definition: the property is defined by the following notation:

   url        = "URL" urlparam ":" uri CRLF

   urlparam   = *(";" xparam)

Example: the following is an example of this property ๐ŸŒˆ

   URL:http://abc.com/pub/calendars/jsmith/mytime.ics

4.8.4.7 Unique Identifier ๐Ÿ†”

Property Name: UID

Purpose: this property defines the persistent, globally unique identifier for the calendar component. ๐Ÿ’–

Value Type: TEXT ๐Ÿ“

Property Parameters: non-standard property parameters can go on this property ๐ŸŒธ

Conformance: the property MUST be specified in the VEVENT, VTODO, VJOURNAL or VFREEBUSY calendar components. This one is non-negotiable, bestie ๐Ÿ˜ญ

Description: the UID itself MUST be a globally unique identifier, and whoever generates it MUST guarantee that it's unique. ๐Ÿ” There are several algorithms that can do this ๐Ÿงš The identifier is RECOMMENDED to use the same syntax as the [RFC 822] addr-spec. A good way to make it unique is to put the domain name, or a domain literal IP address, of the host where the identifier was created on the right-hand side of the "@". On the left-hand side, put a combination of the current calendar date and time of day (formatted as a DATE-TIME value) along with some other currently unique (maybe sequential) identifier available on the system, like a process id number. ๐Ÿ“ Using a date/time value on the left and a domain name or domain literal on the right makes uniqueness guaranteeable, since no two hosts should be using the same domain name or IP address at the same time. ๐Ÿซถ Other algorithms will work too, but it is RECOMMENDED that the right-hand side contain some domain identifier (either the host's own or some other one), so that the generator can guarantee uniqueness of the left-hand side within the scope of that domain. ๐Ÿ‘‘

This is how scheduling messages get matched up with the VEVENT, VTODO, or VJOURNAL calendar component they refer to. ๐Ÿ“ฌ

Same as before, the full range of components in a recurrence set is referenced by just the UID value of the component. The RECURRENCE-ID property lets you point at one individual instance inside that set. ๐ŸŽฏ

This property is a big deal for group scheduling apps ๐Ÿ”ฅ It's how they match requests with later replies, modifications or deletion requests. Calendaring and scheduling applications MUST generate this property in VEVENT, VTODO and VJOURNAL calendar components so they interoperate with other group scheduling apps. ๐Ÿค The calendar system that generates the iCalendar object is the one that creates this identifier. ๐Ÿงšโ€โ™€๏ธ

Implementations MUST be able to receive and persist values of at least 255 characters for this property. ๐Ÿ’พ

Format Definition: the property is defined by the following notation:

   uid        = "UID" uidparam ":" text CRLF

   uidparam   = *(";" xparam)

Example: the following is an example of this property ๐ŸŒŸ

   UID:19960401T080045Z-4000F192713-0052@host1.com

4.8.5 Recurrence Component Properties โœจ

The following properties specify recurrence information in calendar components. ๐Ÿ”

4.8.5.1 Exception Date/Times ๐Ÿšซ๐Ÿ“…

Property Name: EXDATE ๐Ÿ’…

Purpose: This property is the VIP list of date/time exceptions for a recurring calendar component. ๐Ÿ™…โ€โ™€๏ธ

Value Type: The default value type is DATE-TIME, but you can switch it to DATE. ๐ŸŽ€

Property Parameters: Non-standard, value data type and time zone identifier params are allowed here. โœจ

Conformance: You can put this on an iCalendar object that has a recurring calendar component in it. ๐ŸŒธ

Description: Okay so, exception dates are used when figuring out the recurrence set, which is basically the full guest list of every instance a calendar component shows up on. ๐Ÿฆ‹ The recurrence set gets built by looking at the starting DTSTART along with every RRULE, RDATE, EXDATE and EXRULE in the iCalendar object. DTSTART is the first instance in the set, period. You can stack multiple RRULE and EXRULE properties to make really fancy patterns. ๐Ÿ’– The final set is made by gathering every start date-time from the RRULE and RDATE properties, then kicking out anything that lands in the union of start date-times from the EXRULE and EXDATE properties. So the exclusion ones (EXDATE and EXRULE) always win over the inclusion ones (RDATE and RRULE). ๐Ÿ‘‘ If RRULE and RDATE make the same instance twice, it only counts once. Duplicates get ignored, bye bye. ๐Ÿ™ˆ

Here's the tea though: you can use EXDATE to exclude the DTSTART value, but the original DTSTART date MUST still be maintained by the calendaring and scheduling system. Why? Because other properties, like RECURRENCE-ID, depend on that original value. Don't delete it just because it's been excluded, bestie. ๐Ÿซถ

Format Definition: The property is defined by the following notation:

exdate     = "EXDATE" exdtparam ":" exdtval *("," exdtval) CRLF

exdtparam  = *(

           ; the following are optional,
           ; but MUST NOT occur more than once

           (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
           (";" tzidparam) /

           ; the following is optional,
           ; and MAY occur more than once

           (";" xparam)

           )

exdtval    = date-time / date
;Value MUST match value type

Example: The following is an example of this property:

EXDATE:19960402T010000Z,19960403T010000Z,19960404T010000Z

4.8.5.2 Exception Rule ๐Ÿ™…โ€โ™€๏ธโœจ

Property Name: EXRULE ๐Ÿงš

Purpose: This property defines a rule or repeating pattern for an exception to a recurrence set. ๐ŸŒˆ

Value Type: RECUR ๐Ÿ’œ

Property Parameters: Non-standard property parameters can be specified on this property. ๐Ÿ“

Conformance: You can specify this property in VEVENT, VTODO or VJOURNAL calendar components. ๐ŸŽ€

Description: Same energy as EXDATE, just with a rule instead of a list. ๐Ÿ’… The exception rule is used when computing the recurrence set, which is the complete set of recurrence instances for a calendar component. That set is built by looking at the starting DTSTART along with every RRULE, RDATE, EXDATE and EXRULE in the iCalendar object. DTSTART defines the first instance, and you can use multiple RRULE and EXRULE properties for more sophisticated sets. โœจ The final set gathers every start date-time from the RRULE and RDATE properties, and then removes any start date-time that falls within the union of start date-times from the EXRULE and EXDATE properties. The exclusion properties (EXDATE and EXRULE) take precedence over the inclusion properties (RDATE and RRULE). Duplicates from RRULE and RDATE only count once, and extra copies get ignored. ๐Ÿฆ‹

Same as before: you can use EXRULE to exclude the DTSTART value, but the original DTSTART date MUST still be maintained by the calendaring and scheduling system, because other properties like RECURRENCE-ID depend on it. ๐Ÿ˜ญ Do not delete your starting point, periodt. ๐Ÿ’€

Format Definition: The property is defined by the following notation:

exrule     = "EXRULE" exrparam ":" recur CRLF

exrparam   = *(";" xparam)

Example: The following are examples of this property. Okay so this one means except every other week, on Tuesday and Thursday, for 4 occurrences:

EXRULE:FREQ=WEEKLY;COUNT=4;INTERVAL=2;BYDAY=TU,TH

Except daily for 10 occurrences:

EXRULE:FREQ=DAILY;COUNT=10

Except yearly in June and July for 8 occurrences:

EXRULE:FREQ=YEARLY;COUNT=8;BYMONTH=6,7

4.8.5.3 Recurrence Date/Times ๐Ÿ“†๐ŸŒธ

Property Name: RDATE ๐Ÿฆ‹

Purpose: This property defines the list of date/times for a recurrence set. ๐Ÿ’–

Value Type: The default value type is DATE-TIME, but you can set it to DATE or PERIOD. ๐ŸŒˆ

Property Parameters: Non-standard, value data type and time zone identifier params are allowed here. โœจ

Conformance: You can put this property in VEVENT, VTODO, VJOURNAL or VTIMEZONE calendar components. ๐ŸŽ€

Description: This one can hang out alongside RRULE to build an aggregate set of repeating occurrences. ๐Ÿ‘‘ When both show up in an iCalendar object, the recurring events are the union of the occurrences from RDATE and RRULE combined. Iconic. ๐Ÿซถ

The recurrence dates, if you specify them, get used when computing the recurrence set. That set is built by looking at the starting DTSTART along with every RRULE, RDATE, EXDATE and EXRULE in the iCalendar object. DTSTART is the first instance, and you can use multiple RRULE and EXRULE properties for fancier sets. ๐Ÿ’… The final set collects every start date/time from the RRULE and RDATE properties, then drops anything inside the union of start date/times from EXRULE and EXDATE. Exclusion (EXDATE and EXRULE) beats inclusion (RDATE and RRULE) every single time. ๐Ÿ”ฅ Duplicate instances from RRULE and RDATE only count once, and the copies get ignored. ๐Ÿ™ˆ

Format Definition: The property is defined by the following notation:

rdate      = "RDATE" rdtparam ":" rdtval *("," rdtval) CRLF

rdtparam   = *(

           ; the following are optional,
           ; but MUST NOT occur more than once

           (";" "VALUE" "=" ("DATE-TIME" / "DATE" / "PERIOD")) /
           (";" tzidparam) /

           ; the following is optional,
           ; and MAY occur more than once

           (";" xparam)

           )

rdtval     = date-time / date / period
;Value MUST match value type

Example: The following are examples of this property:

RDATE:19970714T123000Z

RDATE;TZID=US-EASTERN:19970714T083000

RDATE;VALUE=PERIOD:19960403T020000Z/19960403T040000Z,
 19960404T010000Z/PT3H

RDATE;VALUE=DATE:19970101,19970120,19970217,19970421
 19970526,19970704,19970901,19971014,19971128,19971129,19971225

4.8.5.4 Recurrence Rule ๐Ÿ”๐Ÿ’•

Property Name: RRULE ๐ŸŒท

Purpose: This property defines a rule or repeating pattern for recurring events, to-dos, or time zone definitions. ๐Ÿง

Value Type: RECUR ๐Ÿ’œ

Property Parameters: Non-standard property parameters can be specified on this property. ๐Ÿ“

Conformance: You can specify this property one or more times in recurring VEVENT, VTODO and VJOURNAL calendar components. You can also specify it once in each STANDARD or DAYLIGHT sub-component of the VTIMEZONE calendar component. ๐ŸŒˆ

Description: Ngl, this is the main event. ๐ŸŽ€ The recurrence rule is used when computing the recurrence set, which is the complete set of recurrence instances for a calendar component. That set is built by looking at the starting DTSTART along with every RRULE, RDATE, EXDATE and EXRULE in the iCalendar object. DTSTART defines the first instance, and you can stack multiple RRULE and EXRULE properties for more sophisticated sets. โœจ The final set gathers all the start date/times from the RRULE and RDATE properties, then excludes anything inside the union of start date/times from EXRULE and EXDATE. Exclusion always takes precedence over inclusion. ๐Ÿ‘‘ Duplicates from RRULE and RDATE only count once. ๐Ÿฆ‹

The DTSTART and DTEND pair, or the DTSTART and DURATION pair, in the iCalendar object defines the first instance of the recurrence. When you use a recurrence rule, the DTSTART and DTEND properties MUST be specified in local time, and the right set of VTIMEZONE calendar components MUST be included. For more on how VTIMEZONE works, check out its own calendar component definition. ๐ŸŒ๐Ÿ’–

Any duration tied to the iCalendar object applies to every member of the generated recurrence set. If a specific recurrence needs a modified duration, that MUST be explicitly specified using the RDATE property. ๐Ÿ™Œ

Format Definition: This property is defined by the following notation:

rrule      = "RRULE" rrulparam ":" recur CRLF

rrulparam  = *(";" xparam)

Example: All of these examples assume the Eastern United States time zone. ๐Ÿ—ฝ Daily for 10 occurrences:

DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=DAILY;COUNT=10

==> (1997 9:00 AM EDT)September 2-11

Daily until December 24, 1997:

DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=DAILY;UNTIL=19971224T000000Z

==> (1997 9:00 AM EDT)September 2-30;October 1-25
    (1997 9:00 AM EST)October 26-31;November 1-30;December 1-23

Every other day, forever:

DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=DAILY;INTERVAL=2
==> (1997 9:00 AM EDT)September2,4,6,8...24,26,28,30;
     October 2,4,6...20,22,24
    (1997 9:00 AM EST)October 26,28,30;November 1,3,5,7...25,27,29;
     Dec 1,3,...

Every 10 days, 5 occurrences:

DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5

==> (1997 9:00 AM EDT)September 2,12,22;October 2,12

Everyday in January, for 3 years:

     DTSTART;TZID=US-Eastern:19980101T090000
     RRULE:FREQ=YEARLY;UNTIL=20000131T090000Z;
      BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA
     or
     RRULE:FREQ=DAILY;UNTIL=20000131T090000Z;BYMONTH=1

     ==> (1998 9:00 AM EDT)January 1-31
         (1999 9:00 AM EDT)January 1-31
         (2000 9:00 AM EDT)January 1-31

Weekly for 10 occurrences ๐ŸŽ€

     DTSTART;TZID=US-Eastern:19970902T090000
     RRULE:FREQ=WEEKLY;COUNT=10

     ==> (1997 9:00 AM EDT)September 2,9,16,23,30;October 7,14,21
         (1997 9:00 AM EST)October 28;November 4

Weekly until December 24, 1997 ๐Ÿ—“๏ธ

     DTSTART;TZID=US-Eastern:19970902T090000
     RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z

     ==> (1997 9:00 AM EDT)September 2,9,16,23,30;October 7,14,21
         (1997 9:00 AM EST)October 28;November 4,11,18,25;
                           December 2,9,16,23

Every other week, forever ๐Ÿฆ‹

     DTSTART;TZID=US-Eastern:19970902T090000
     RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU

     ==> (1997 9:00 AM EDT)September 2,16,30;October 14
         (1997 9:00 AM EST)October 28;November 11,25;December 9,23
         (1998 9:00 AM EST)January 6,20;February
     ...

Weekly on Tuesday and Thursday for 5 weeks ๐Ÿ’…

    DTSTART;TZID=US-Eastern:19970902T090000
    RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH
    or
    RRULE:FREQ=WEEKLY;COUNT=10;WKST=SU;BYDAY=TU,TH

    ==> (1997 9:00 AM EDT)September 2,4,9,11,16,18,23,25,30;October 2

Every other week on Monday, Wednesday and Friday until December 24, 1997, but starting on Tuesday, September 2, 1997 ๐ŸŒธ

     DTSTART;TZID=US-Eastern:19970902T090000
     RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;
      BYDAY=MO,WE,FR
     ==> (1997 9:00 AM EDT)September 2,3,5,15,17,19,29;October
     1,3,13,15,17
         (1997 9:00 AM EST)October 27,29,31;November 10,12,14,24,26,28;
                           December 8,10,12,22

Every other week on Tuesday and Thursday, for 8 occurrences โœจ

     DTSTART;TZID=US-Eastern:19970902T090000
     RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH

     ==> (1997 9:00 AM EDT)September 2,4,16,18,30;October 2,14,16

Monthly on the 1st Friday for ten occurrences ๐Ÿ‘‘

     DTSTART;TZID=US-Eastern:19970905T090000
     RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR

     ==> (1997 9:00 AM EDT)September 5;October 3
         (1997 9:00 AM EST)November 7;Dec 5
         (1998 9:00 AM EST)January 2;February 6;March 6;April 3
         (1998 9:00 AM EDT)May 1;June 5

Monthly on the 1st Friday until December 24, 1997 ๐ŸŒˆ

     DTSTART;TZID=US-Eastern:19970905T090000
     RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR

     ==> (1997 9:00 AM EDT)September 5;October 3
         (1997 9:00 AM EST)November 7;December 5

Every other month on the 1st and last Sunday of the month for 10 occurrences ๐Ÿ“

     DTSTART;TZID=US-Eastern:19970907T090000
     RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU

     ==> (1997 9:00 AM EDT)September 7,28
         (1997 9:00 AM EST)November 2,30
         (1998 9:00 AM EST)January 4,25;March 1,29
         (1998 9:00 AM EDT)May 3,31

Monthly on the second to last Monday of the month for 6 months ๐Ÿงš

     DTSTART;TZID=US-Eastern:19970922T090000
     RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO

     ==> (1997 9:00 AM EDT)September 22;October 20
         (1997 9:00 AM EST)November 17;December 22
         (1998 9:00 AM EST)January 19;February 16

Monthly on the third to the last day of the month, forever ๐ŸŒ™

     DTSTART;TZID=US-Eastern:19970928T090000
     RRULE:FREQ=MONTHLY;BYMONTHDAY=-3

     ==> (1997 9:00 AM EDT)September 28
         (1997 9:00 AM EST)October 29;November 28;December 29
         (1998 9:00 AM EST)January 29;February 26
     ...

Monthly on the 2nd and 15th of the month for 10 occurrences ๐Ÿ’œ

     DTSTART;TZID=US-Eastern:19970902T090000
     RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15

     ==> (1997 9:00 AM EDT)September 2,15;October 2,15
         (1997 9:00 AM EST)November 2,15;December 2,15
         (1998 9:00 AM EST)January 2,15

Monthly on the first and last day of the month for 10 occurrences ๐Ÿซถ

     DTSTART;TZID=US-Eastern:19970930T090000
     RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1

     ==> (1997 9:00 AM EDT)September 30;October 1
         (1997 9:00 AM EST)October 31;November 1,30;December 1,31
         (1998 9:00 AM EST)January 1,31;February 1

Every 18 months on the 10th thru 15th of the month for 10 occurrences ๐Ÿ”ฅ

     DTSTART;TZID=US-Eastern:19970910T090000
     RRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,
      15

     ==> (1997 9:00 AM EDT)September 10,11,12,13,14,15

         (1999 9:00 AM EST)March 10,11,12,13

Every Tuesday, every other month ๐ŸŽ€

     DTSTART;TZID=US-Eastern:19970902T090000
     RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU

     ==> (1997 9:00 AM EDT)September 2,9,16,23,30
         (1997 9:00 AM EST)November 4,11,18,25
         (1998 9:00 AM EST)January 6,13,20,27;March 3,10,17,24,31
     ...

Yearly in June and July for 10 occurrences โ˜€๏ธ

     DTSTART;TZID=US-Eastern:19970610T090000
     RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7
     ==> (1997 9:00 AM EDT)June 10;July 10
         (1998 9:00 AM EDT)June 10;July 10
         (1999 9:00 AM EDT)June 10;July 10
         (2000 9:00 AM EDT)June 10;July 10
         (2001 9:00 AM EDT)June 10;July 10
Note: Since none of the BYDAY, BYMONTHDAY or BYYEARDAY components are specified, the day is gotten from DTSTART ๐Ÿ‘€

Every other year on January, February, and March for 10 occurrences โ„๏ธ

     DTSTART;TZID=US-Eastern:19970310T090000
     RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3

     ==> (1997 9:00 AM EST)March 10
         (1999 9:00 AM EST)January 10;February 10;March 10
         (2001 9:00 AM EST)January 10;February 10;March 10
         (2003 9:00 AM EST)January 10;February 10;March 10

Every 3rd year on the 1st, 100th and 200th day for 10 occurrences ๐ŸŒท

     DTSTART;TZID=US-Eastern:19970101T090000
     RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200

     ==> (1997 9:00 AM EST)January 1
         (1997 9:00 AM EDT)April 10;July 19
         (2000 9:00 AM EST)January 1
         (2000 9:00 AM EDT)April 9;July 18
         (2003 9:00 AM EST)January 1
         (2003 9:00 AM EDT)April 10;July 19
         (2006 9:00 AM EST)January 1

Every 20th Monday of the year, forever ๐ŸŒŸ

     DTSTART;TZID=US-Eastern:19970519T090000
     RRULE:FREQ=YEARLY;BYDAY=20MO

     ==> (1997 9:00 AM EDT)May 19
         (1998 9:00 AM EDT)May 18
         (1999 9:00 AM EDT)May 17
     ...

Monday of week number 20 (where the default start of the week is Monday), forever ๐Ÿง

     DTSTART;TZID=US-Eastern:19970512T090000
     RRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO

     ==> (1997 9:00 AM EDT)May 12
         (1998 9:00 AM EDT)May 11
         (1999 9:00 AM EDT)May 17
     ...

Every Thursday in March, forever ๐ŸŒผ

     DTSTART;TZID=US-Eastern:19970313T090000
     RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH

     ==> (1997 9:00 AM EST)March 13,20,27
         (1998 9:00 AM EST)March 5,12,19,26
         (1999 9:00 AM EST)March 4,11,18,25
     ...

Every Thursday, but only during June, July, and August, forever ๐Ÿ–๏ธ

     DTSTART;TZID=US-Eastern:19970605T090000
     RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8

     ==> (1997 9:00 AM EDT)June 5,12,19,26;July 3,10,17,24,31;
                       August 7,14,21,28
         (1998 9:00 AM EDT)June 4,11,18,25;July 2,9,16,23,30;
                       August 6,13,20,27
         (1999 9:00 AM EDT)June 3,10,17,24;July 1,8,15,22,29;
                       August 5,12,19,26
     ...

Every Friday the 13th, forever ๐Ÿ–ค

     DTSTART;TZID=US-Eastern:19970902T090000
     EXDATE;TZID=US-Eastern:19970902T090000
     RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13
     ==> (1998 9:00 AM EST)February 13;March 13;November 13
         (1999 9:00 AM EDT)August 13
         (2000 9:00 AM EDT)October 13
     ...

The first Saturday that follows the first Sunday of the month, forever ๐Ÿฅณ

     DTSTART;TZID=US-Eastern:19970913T090000
     RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13

     ==> (1997 9:00 AM EDT)September 13;October 11
         (1997 9:00 AM EST)November 8;December 13
         (1998 9:00 AM EST)January 10;February 7;March 7
         (1998 9:00 AM EDT)April 11;May 9;June 13...
     ...

Every four years, the first Tuesday after a Monday in November, forever (U.S. Presidential Election day) ๐Ÿ‡บ๐Ÿ‡ธ

     DTSTART;TZID=US-Eastern:19961105T090000
     RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,
      5,6,7,8

     ==> (1996 9:00 AM EST)November 5
         (2000 9:00 AM EST)November 7
         (2004 9:00 AM EST)November 2
     ...

The 3rd instance into the month of one of Tuesday, Wednesday or Thursday, for the next 3 months ๐Ÿฅ‡

     DTSTART;TZID=US-Eastern:19970904T090000
     RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3

     ==> (1997 9:00 AM EDT)September 4;October 7
         (1997 9:00 AM EST)November 6

The 2nd to last weekday of the month ๐Ÿซ 

     DTSTART;TZID=US-Eastern:19970929T090000
     RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2

     ==> (1997 9:00 AM EDT)September 29
         (1997 9:00 AM EST)October 30;November 27;December 30
         (1998 9:00 AM EST)January 29;February 26;March 30
     ...

Every 3 hours from 9:00 AM to 5:00 PM on a specific day โฐ

     DTSTART;TZID=US-Eastern:19970902T090000
     RRULE:FREQ=HOURLY;INTERVAL=3;UNTIL=19970902T170000Z

     ==> (September 2, 1997 EDT)09:00,12:00,15:00

Every 15 minutes for 6 occurrences โฑ๏ธ

     DTSTART;TZID=US-Eastern:19970902T090000
     RRULE:FREQ=MINUTELY;INTERVAL=15;COUNT=6

     ==> (September 2, 1997 EDT)09:00,09:15,09:30,09:45,10:00,10:15

Every hour and a half for 4 occurrences ๐Ÿช

     DTSTART;TZID=US-Eastern:19970902T090000
     RRULE:FREQ=MINUTELY;INTERVAL=90;COUNT=4

     ==> (September 2, 1997 EDT)09:00,10:30;12:00;13:30

Every 20 minutes from 9:00 AM to 4:40 PM every day ๐Ÿฅฐ

     DTSTART;TZID=US-Eastern:19970902T090000
     RRULE:FREQ=DAILY;BYHOUR=9,10,11,12,13,14,15,16;BYMINUTE=0,20,40
     or
     RRULE:FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16

     ==> (September 2, 1997 EDT)9:00,9:20,9:40,10:00,10:20,
                                ... 16:00,16:20,16:40
         (September 3, 1997 EDT)9:00,9:20,9:40,10:00,10:20,
                               ...16:00,16:20,16:40
     ...

An example where the days generated makes a difference because of WKST ๐Ÿง 

     DTSTART;TZID=US-Eastern:19970805T090000
     RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO

     ==> (1997 EDT)Aug 5,10,19,24

Changing only WKST from MO to SU yields different results, so watch that one ๐Ÿ‘€

     DTSTART;TZID=US-Eastern:19970805T090000
     RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU
     ==> (1997 EDT)August 5,17,19,31

4.8.6 Alarm Component Properties โฐ

The following properties specify alarm information in calendar components ๐Ÿ””

4.8.6.1 Action ๐Ÿ’ฅ

Property Name: ACTION

Purpose: This property defines the action to be invoked when an alarm is triggered ๐Ÿšจ

Value Type: TEXT

Property Parameters: Non-standard property parameters can be specified on this property.

Conformance: This property MUST be specified once in a "VALARM" calendar component.

Description: Each "VALARM" calendar component has a particular type of action associated with it. This property specifies the type of action

Format Definition: The property is defined by the following notation:

     action     = "ACTION" actionparam ":" actionvalue CRLF

     actionparam        = *(";" xparam)

     actionvalue        = "AUDIO" / "DISPLAY" / "EMAIL" / "PROCEDURE"
                        / iana-token / x-name

Example: The following are examples of this property in a "VALARM" calendar component ๐Ÿ“

     ACTION:AUDIO

     ACTION:DISPLAY

     ACTION:PROCEDURE

4.8.6.2 Repeat Count ๐Ÿ”

Property Name: REPEAT

Purpose: okay so this one defines how many times the alarm gets repeated after the initial trigger. bestie, it's giving snooze button ๐Ÿ’…

Value Type: INTEGER

Property Parameters: non-standard property parameters can be specified on this property โœจ

Conformance: this property can be specified in a "VALARM" calendar component ๐ŸŽ€

Description: if the alarm triggers more than once, then this property MUST be specified along with the "DURATION" property. no skipping this one, it's literally the rule ๐Ÿ™ˆ

Format Definition: the property is defined by the following notation:

repeatcnt  = "REPEAT" repparam ":" integer CRLF
;Default is "0", zero.

repparam   = *(";" xparam)

Example: here's an alarm that repeats 4 additional times, with a 5 minute delay after the initial trigger. so cute ๐Ÿฆ‹

REPEAT:4
DURATION:PT5M

4.8.6.3 Trigger โฐ

Property Name: TRIGGER

Purpose: this one specifies when an alarm will trigger. main character timing, obviously ๐Ÿ‘‘

Value Type: the default value type is DURATION. you can switch it to a DATE-TIME value type, but then the value MUST be a UTC formatted DATE-TIME value ๐ŸŒ

Property Parameters: non-standard, value data type, time zone identifier or trigger relationship property parameters can be specified on this property. the trigger relationship property parameter MUST only be specified when the value type is DURATION. be careful with that one, bestie ๐Ÿ’€

Conformance: this property MUST be specified in the "VALARM" calendar component. no excuses ๐Ÿซถ

Description: inside a "VALARM" component, this property decides when the alarm goes off. the default value type is DURATION, which means a relative time for the trigger. by default that duration is measured from the start of the event or to-do the alarm belongs to. you can explicitly anchor it to the end or the start of the associated event or to-do with the "RELATED" parameter. a value of START triggers off the start, and a value of END triggers off the end โœจ

Either a positive or negative duration can be used for "TRIGGER". a positive duration fires after the associated start or end of the event or to-do. a negative duration fires before it. so it's giving time travel, but make it chronological ๐Ÿงš

The "RELATED" property parameter is NOT valid when the value type is DATE-TIME (aka an absolute date and time alarm trigger), because there's nothing to be relative to there ๐Ÿ™…โ€โ™€๏ธ. If the value type is DATE-TIME, the property value MUST be in UTC time format. And if an absolute trigger is set on an alarm for a recurring event or to-do, the alarm only goes off at that specified absolute date/time, plus any repeating instances you've set up ๐Ÿ”

Now the anchoring rules, which are kind of a lot but so important ๐Ÿ’…. If the trigger is set relative to START, then the "DTSTART" property MUST be present in the associated "VEVENT" or "VTODO" calendar component. If an event's alarm has its trigger set relative to the END, then the "DTEND" property, or the "DSTART" and "DURATION" properties, MUST be present in the associated "VEVENT" calendar component. For a to-do with a trigger set relative to the END, either the "DUE" property or the "DSTART" and "DURATION" properties MUST be present in the associated "VTODO" calendar component ๐ŸŒธ

Alarms on an event or to-do that's defined with a DATE value type trigger relative to 00:00:00 UTC on that specified date. For example, if DTSTART:19980205 is set, then the duration trigger is relative to 19980205T000000Z ๐Ÿ“

Format Definition: the property is defined by the following notation:

trigger    = "TRIGGER" (trigrel / trigabs)

trigrel    = *(

           ; the following are optional,
           ; but MUST NOT occur more than once

             (";" "VALUE" "=" "DURATION") /
             (";" trigrelparam) /

           ; the following is optional,
           ; and MAY occur more than once

             (";" xparam)
             ) ":"  dur-value

trigabs    = 1*(

           ; the following is REQUIRED,
           ; but MUST NOT occur more than once

             (";" "VALUE" "=" "DATE-TIME") /

           ; the following is optional,
           ; and MAY occur more than once

             (";" xparam)

             ) ":" date-time

Example: a trigger set 15 minutes before the start of the event or to-do ๐ŸŒˆ

TRIGGER:-P15M

A trigger set 5 minutes after the end of the event or to-do ๐Ÿ’œ

TRIGGER;RELATED=END:P5M

A trigger set to an absolute date/time โญ

TRIGGER;VALUE=DATE-TIME:19980101T050000Z

4.8.7. Change Management Component Properties ๐Ÿ“

The following properties specify change management information in calendar components. this is the paper trail section, and honestly it's so organized ๐ŸŽ€

4.8.7.1 Date/Time Created ๐ŸŒท

Property Name: CREATED

Purpose: this one records the date and time the calendar information was created by the calendar user agent in the calendar store โœจ

Note: this is basically the creation date and time for a file in the file system. same energy, different app ๐Ÿ’…

Value Type: DATE-TIME

Property Parameters: non-standard property parameters can be specified on this property โœจ

Conformance: the property can be specified once in "VEVENT", "VTODO" or "VJOURNAL" calendar components ๐Ÿฆ‹

Description: the date and time is a UTC value ๐ŸŒ

Format Definition: the property is defined by the following notation:

created    = "CREATED" creaparam ":" date-time CRLF

creaparam  = *(";" xparam)

Example: here's an example of this property:

CREATED:19960329T133000Z

4.8.7.2 Date/Time Stamp ๐Ÿ’Œ

Property Name: DTSTAMP

Purpose: this one shows the date/time the instance of the iCalendar object was created. it's giving receipt timestamp ๐Ÿงพ

Value Type: DATE-TIME

Property Parameters: non-standard property parameters can be specified on this property ๐ŸŒธ

Conformance: this property MUST be included in the "VEVENT", "VTODO", "VJOURNAL" or "VFREEBUSY" calendar components. literally non-negotiable ๐Ÿ”ฅ

Description: the value MUST be specified in the UTC time format ๐ŸŒ

This property is also useful to protocols such as [IMIP] that have inherent latency issues when delivering content. it helps keep messages containing iCalendar objects in the right order, so nothing arrives out of sequence and gets confusing ๐Ÿซถ

This property is different from "CREATED" and "LAST-MODIFIED". those two track when the particular calendar data in the calendar store was created and last modified. "DTSTAMP" is different, because it's about when the iCalendar object representation of the calendar service information was created or last modified. two timestamps, two jobs, no drama ๐Ÿ’œ

Format Definition: the property is defined by the following notation:

dtstamp    = "DTSTAMP" stmparam ":" date-time CRLF

stmparam   = *(";" xparam)

Example:

DTSTAMP:19971210T080000Z

4.8.7.3 Last Modified โœ๏ธ

Property Name: LAST-MODIFIED

Purpose: this one specifies the date and time the information associated with the calendar component was last revised in the calendar store ๐Ÿ“

Note: this is basically the modification date and time for a file in the file system. the glow-up timeline, iykyk ๐Ÿ’–

Value Type: DATE-TIME

Property Parameters: non-standard property parameters can be specified on this property โœจ

Conformance: this property can be specified in the "EVENT", "VTODO", "VJOURNAL" or "VTIMEZONE" calendar components ๐Ÿฆ‹

Description: the property value MUST be specified in the UTC time format ๐ŸŒ

Format Definition: the property is defined by the following notation:

last-mod   = "LAST-MODIFIED" lstparam ":" date-time CRLF

lstparam   = *(";" xparam)

Example: here are examples of this property:

LAST-MODIFIED:19960817T133000Z

4.8.7.4 Sequence Number ๐Ÿ”ข

Property Name: SEQUENCE

Purpose: this one defines the revision sequence number of the calendar component within a sequence of revisions. it's like a version number, but make it cute ๐ŸŽ€

Value Type: integer

Property Parameters: non-standard property parameters can be specified on this property โœจ

Conformance: the property can be specified in "VEVENT", "VTODO" or "VJOURNAL" calendar components ๐Ÿฆ‹

Description: when a calendar component is created, its sequence number is zero (US-ASCII decimal 48). after that, the "Organizer's" CUA increments it monotonically, one step at a time, each time the "Organizer" makes a significant revision to the component. so it only goes up, never back ๐Ÿ“ˆ

When the "Organizer" changes any of these properties, the sequence number MUST be incremented:

  • "DTSTART" ๐Ÿ›ซ
  • "DTEND" ๐Ÿ›ฌ
  • "DUE" ๐Ÿ“…
  • "RDATE" ๐Ÿ”
  • "RRULE" ๐ŸŒ€
  • "EXDATE" ๐Ÿ™…โ€โ™€๏ธ
  • "EXRULE" ๐Ÿšซ
  • "STATUS" ๐Ÿšฆ

Changes the "Organizer" makes to other properties can also force the sequence number to go up. The "Organizer" CUA MUST increment the sequence number whenever it changes properties in the calendar component that the "Organizer" thinks could jeopardize the validity of the "Attendees'" participation status. for example, moving a meeting from one locale to a distant locale could really mess with the "Attendees'" participation status, so the sequence number has to reflect that ๐Ÿ—บ๏ธ

The "Organizer" includes this property in an iCalendar object it sends to an "Attendee", to specify the current version of the calendar component ๐Ÿ“ฌ

The "Attendee" includes this property in an iCalendar object it sends to the "Organizer", to specify which version of the calendar component the "Attendee" is referring to ๐Ÿ’Œ

Bumping the sequence number is NOT how an "Organizer" asks for a response from the "Attendees". that job belongs to the "RSVP" parameter on the "ATTENDEE" property, which the "Organizer" uses to say a response is requested ๐Ÿ™‹โ€โ™€๏ธ

Format Definition: this property is defined by the following notation:

seq = "SEQUENCE" seqparam ":" integer CRLF
; Default is "0"

seqparam   = *(";" xparam)

Example: here's an example for a calendar component that the "Organizer" just created ๐ŸŒฑ

SEQUENCE:0

And here's one for a calendar component the "Organizer" has revised two different times ๐ŸŒŸ

SEQUENCE:2

4.8.8 Miscellaneous Component Properties ๐Ÿงš

The following properties specify information about a number of miscellaneous features of calendar components. this is the grab bag, and I'm obsessed ๐Ÿ’–

4.8.8.1 Non-standard Properties โœจ

Property Name: Any property name with a "X-" prefix

Purpose: okay bestie, this one is a whole framework for making your own properties ๐Ÿงš It's basically the extension zone, and it's giving creative freedom ๐Ÿ’…

Value Type: TEXT

Property Parameters: Non-standard and language property parameters can be specified on this property.

Conformance: This property can be specified in any calendar component.

Description: So the MIME Calendaring and Scheduling Content Type gives us a "standard mechanism for doing non-standard things" ๐Ÿฆ‹ This extension support is there so implementers can "push the envelope" on the existing version of the memo. Extension properties are named by property and/or property parameter names that start with the prefix text "X-" (that's the two character sequence: LATIN CAPITAL LETTER X character followed by the HYPEN-MINUS character). Vendors are recommended to tack on another short prefix text right after that sentinel to identify themselves ๐Ÿท๏ธ This keeps things readable and cuts down on name collisions between different vendors โœจ

User agents that support this content type are expected to be able to parse the extension properties and property parameters, but they can ignore them ๐Ÿซถ

At present, there is no registration authority for names of extension properties and property parameters. The data type for this property is TEXT. Optionally, the data type can be any of the other valid data types ๐ŸŒธ

Format Definition: The property is defined by the following notation:

     x-prop     = x-name *(";" xparam) [";" languageparam] ":" text CRLF
        ; Lines longer than 75 octets should be folded

Example: The following might be the ABC vendor's extension for an audio-clip form of subject property ๐ŸŽง

     X-ABC-MMSUBJ;X-ABC-MMSUBJTYPE=wave:http://load.noise.org/mysubj.wav

4.8.8.2 Request Status ๐Ÿ“ฌ

Property Name: REQUEST-STATUS

Purpose: This property tells you the status code that came back for a scheduling request ๐Ÿ’Œ

Value Type: TEXT

Property Parameters: Non-standard and language property parameters can be specified on this property.

Conformance: The property can be specified in "VEVENT", "VTODO", "VJOURNAL" or "VFREEBUSY" calendar component.

Description: This property is used to return status code information related to the processing of an associated iCalendar object. The data type for this property is TEXT.

The value is made up of a short return status component, a longer return status description component, and optionally a status-specific data component. The components of the value are separated by the SEMICOLON character (US-ASCII decimal 59) โœจ

The short return status is a PERIOD character (US-ASCII decimal 46) separated 3-tuple of integers. For example, "3.1.1". The successive levels of integers give you a finer and finer level of status code granularity ๐Ÿ”

The following are the initial classes for the return status code. Individual iCalendar object methods will define specific return status codes for these classes. Other classes for the return status code may also be defined using the registration process defined later in this memo ๐Ÿ—‚๏ธ

     |==============+===============================================|
     | Short Return | Longer Return Status Description              |
     | Status Code  |                                               |
     |==============+===============================================|
     |    1.xx      | Preliminary success. This class of status     |
     |              | of status code indicates that the request has |
     |              | request has been initially processed but that |
     |              | completion is pending.                        |
     |==============+===============================================|
     |    2.xx      | Successful. This class of status code         |
     |              | indicates that the request was completed      |
     |              | successfuly. However, the exact status code   |
     |              | can indicate that a fallback has been taken.  |
     |==============+===============================================|
     |    3.xx      | Client Error. This class of status code       |
     |              | indicates that the request was not successful.|
     |              | The error is the result of either a syntax or |
     |              | a semantic error in the client formatted      |
     |              | request. Request should not be retried until  |
     |              | the condition in the request is corrected.    |
     |==============+===============================================|
     |    4.xx      | Scheduling Error. This class of status code   |
     |              | indicates that the request was not successful.|
     |              | Some sort of error occurred within the        |
     |              | calendaring and scheduling service, not       |
     |              | directly related to the request itself.       |
     |==============+===============================================|

Heads up, this one has some sharp edges ๐Ÿ’€ Read the format rules closely!

Format Definition: The property is defined by the following notation:

     rstatus    = "REQUEST-STATUS" rstatparam ":"
                  statcode ";" statdesc [";" extdata]

     rstatparam = *(

                ; the following is optional,
                ; but MUST NOT occur more than once
                (";" languageparm) /

                ; the following is optional,
                ; and MAY occur more than once

                (";" xparam)

                )

     statcode   = 1*DIGIT *("." 1*DIGIT)
     ;Hierarchical, numeric return status code

     statdesc   = text
     ;Textual status description

     extdata    = text
     ;Textual exception data. For example, the offending property
     ;name and value or complete property line.

Example: Here are some possible examples of this property ๐ŸŽ€ The COMMA and SEMICOLON separator characters in the property value are BACKSLASH character escaped because they appear in a text value ๐Ÿ’…

     REQUEST-STATUS:2.0;Success

     REQUEST-STATUS:3.1;Invalid property value;DTSTART:96-Apr-01

     REQUEST-STATUS:2.8; Success\, repeating event ignored. Scheduled
      as a single event.;RRULE:FREQ=WEEKLY\;INTERVAL=2

     REQUEST-STATUS:4.1;Event conflict. Date/time is busy.

     REQUEST-STATUS:3.7;Invalid calendar user;ATTENDEE:
      MAILTO:jsmith@host.com

5 iCalendar Object Examples โœจ

okay bestie, this part is all about examples ๐Ÿฆ‹ these are informational only, just illustrative iCalendar objects that fit this content type ๐Ÿ’–

The first one is a three-day conference that starts at 8:00 AM EDT on September 18, 1996 and ends at 6:00 PM EDT on September 20, 1996 ๐ŸŽ€

BEGIN:VCALENDAR PRODID:-//xyz Corp//NONSGML PDA Calendar Verson
1.0//EN VERSION:2.0 BEGIN:VEVENT DTSTAMP:19960704T120000Z
UID:uid1@host.com ORGANIZER:MAILTO:jsmith@host.com
DTSTART:19960918T143000Z DTEND:19960920T220000Z STATUS:CONFIRMED
CATEGORIES:CONFERENCE SUMMARY:Networld+Interop Conference
DESCRIPTION:Networld+Interop Conference
  and Exhibit\nAtlanta World Congress Center\n
 Atlanta, Georgia END:VEVENT END:VCALENDAR

Next up is a group scheduled meeting that starts at 8:30 AM EST on March 12, 1998 and ends at 9:30 AM EST on March 12, 1998 ๐Ÿงš The "Organizer" has scheduled it with one or more calendar users in a group, and there's a time zone specification for Eastern United States in there too ๐ŸŒธ

BEGIN:VCALENDAR
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:US-Eastern
BEGIN:STANDARD
DTSTART:19981025T020000
RDATE:19981025T020000
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19990404T020000
RDATE:19990404T020000
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:19980309T231000Z
UID:guid-1.host1.com
ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
 MAILTO:employee-A@host.com
DESCRIPTION:Project XYZ Review Meeting
CATEGORIES:MEETING
CLASS:PUBLIC
CREATED:19980309T130000Z
SUMMARY:XYZ Project Review
DTSTART;TZID=US-Eastern:19980312T083000
DTEND;TZID=US-Eastern:19980312T093000
LOCATION:1CP Conference Room 4350
END:VEVENT
END:VCALENDAR

Here's an iCalendar object passed in a MIME message, with a single body part that's a "text/calendar" Content Type ๐Ÿ’Œ

TO:jsmith@host1.com
FROM:jdoe@host1.com
MIME-VERSION:1.0
MESSAGE-ID:<id3@host1.com>
CONTENT-TYPE:text/calendar

BEGIN:VCALENDAR
METHOD:xyz
VERSION:2.0
PRODID:-//ABC Corporation//NONSGML My Product//EN
BEGIN:VEVENT
DTSTAMP:19970324T1200Z
SEQUENCE:0
UID:uid3@host1.com
ORGANIZER:MAILTO:jdoe@host1.com
ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host1.com
DTSTART:19970324T123000Z
DTEND:19970324T210000Z
CATEGORIES:MEETING,PROJECT
CLASS:PUBLIC
SUMMARY:Calendaring Interoperability Planning Meeting
DESCRIPTION:Discuss how we can test c&s interoperability\n
 using iCalendar and other IETF standards.
LOCATION:LDB Lobby
ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/
 conf/bkgrnd.ps
END:VEVENT
END:VCALENDAR

Now a to-do that's due on April 15, 1998 ๐Ÿ“ It has an audio alarm that reminds the calendar user at noon on the day before the to-do is expected to be completed, and it repeats hourly four additional times. The to-do definition has been modified twice since it was first created, which you can see from the SEQUENCE value ๐Ÿซถ

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//ABC Corporation//NONSGML My Product//EN
BEGIN:VTODO
DTSTAMP:19980130T134500Z
SEQUENCE:2
UID:uid4@host1.com
ORGANIZER:MAILTO:unclesam@us.gov
ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com
DUE:19980415T235959
STATUS:NEEDS-ACTION
SUMMARY:Submit Income Taxes
BEGIN:VALARM
ACTION:AUDIO
TRIGGER:19980403T120000
ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-
 files/ssbanner.aud
REPEAT:4
DURATION:PT1H
END:VALARM
END:VTODO
END:VCALENDAR

Here's a journal entry ๐Ÿ““โœจ

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//ABC Corporation//NONSGML My Product//EN
BEGIN:VJOURNAL
DTSTAMP:19970324T120000Z
UID:uid5@host1.com
ORGANIZER:MAILTO:jsmith@host.com
STATUS:DRAFT
CLASS:PUBLIC
CATEGORY:Project Report, XYZ, Weekly Meeting
DESCRIPTION:Project xyz Review Meeting Minutes\n
 Agenda\n1. Review of project version 1.0 requirements.\n2.
Definition
 of project processes.\n3. Review of project schedule.\n
 Participants: John Smith, Jane Doe, Jim Dandy\n-It was
  decided that the requirements need to be signed off by
  product marketing.\n-Project processes were accepted.\n
 -Project schedule needs to account for scheduled holidays
  and employee vacation time. Check with HR for specific
  dates.\n-New schedule will be distributed by Friday.\n-
 Next weeks meeting is cancelled. No meeting until 3/23.
END:VJOURNAL
END:VCALENDAR

And finally, an example of published busy time information ๐ŸŒˆ The iCalendar object might be placed at the network resource www.host.com/calendar/busytime/jsmith.ifb ๐Ÿ’œ

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//RDU Software//NONSGML HandCal//EN
BEGIN:VFREEBUSY
ORGANIZER:MAILTO:jsmith@host.com
DTSTART:19980313T141711Z
DTEND:19980410T141711Z
FREEBUSY:19980314T233000Z/19980315T003000Z
FREEBUSY:19980316T153000Z/19980316T163000Z
FREEBUSY:19980318T030000Z/19980318T040000Z
URL:http://www.host.com/calendar/busytime/jsmith.ifb
END:VFREEBUSY
END:VCALENDAR

these are the recommended practices you should follow so everyone handles these cases the same way, no drama ๐Ÿ’…

  1. Content lines longer than 75 octets SHOULD be folded.
  2. A calendar entry with a DTSTART property but no DTEND property doesn't take up any time ๐Ÿ•ฐ๏ธ It's meant to represent an event tied to a specific calendar date and time of day, like an anniversary. Since it doesn't take up any time, it MUST NOT be used to record busy time, no matter what the value for the TRANSP property is.
  3. When the DTSTART and DTEND, for VEVENT, VJOURNAL and VFREEBUSY calendar components, and DTSTART and DUE, for VTODO calendar components, have the same value data type (e.g., DATE-TIME), they SHOULD specify values in the same time format (e.g., UTC time format). โฐ
  4. When the combination of the RRULE and RDATE properties on an iCalendar object produces multiple instances having the same start date/time, they should be collapsed to, and considered as, a single instance. ๐Ÿงฉ
  5. When a calendar user receives multiple requests for the same calendar component (e.g., REQUEST for a VEVENT calendar component) because they're on multiple mailing lists specified by ATTENDEE properties in the request, they SHOULD respond to only one of the requests. The calendar user SHOULD also specify (using the MEMBER parameter of the ATTENDEE property) which mailing list they're a member of. ๐Ÿ“ฌ
  6. An implementation can truncate a SUMMARY property value to 255 characters. โœ‚๏ธ
  7. If seconds of the minute aren't supported by an implementation, then a value of "00" SHOULD be specified for the seconds component in a time value. โฑ๏ธ
  8. If the value type parameter (VALUE=) contains an unknown value type, it SHOULD be treated as TEXT. ๐Ÿคทโ€โ™€๏ธ
  9. TZURL values SHOULD NOT be specified as a FILE URI type. This URI form can be useful within an organization, but it's problematic on the Internet ๐Ÿ™ˆ
  10. Some possible English values for the CATEGORIES property are "ANNIVERSARY", "APPOINTMENT", "BUSINESS", "EDUCATION", "HOLIDAY", "MEETING", "MISCELLANEOUS", "NON-WORKING HOURS", "NOT IN OFFICE", "PERSONAL", "PHONE CALL", "SICK DAY", "SPECIAL OCCASION", "TRAVEL", and "VACATION". Categories can be specified in any registered language ๐ŸŒ
  11. Some possible English values for the RESOURCES property are "CATERING", "CHAIRS", "COMPUTER PROJECTOR", "EASEL", "OVERHEAD PROJECTOR", "SPEAKER PHONE", "TABLE", "TV", "VCR", "VIDEO PHONE", and "VEHICLE". Resources can be specified in any registered language ๐ŸŽฅ

7 Registration of Content Type Elements ๐Ÿ“

this section explains how to register MIME Calendaring and Scheduling Content Type iCalendar object methods and new or modified properties, so let's get into it ๐Ÿฆ‹

7.1 Registration of New and Modified iCalendar Object Methods

New MIME Calendaring and Scheduling Content Type iCalendar object methods are registered by publishing an IETF Request for Comments (RFC) ๐Ÿ“œ Changes to an iCalendar object method are registered by publishing a revision of the RFC that defines the method โœจ

7.2 Registration of New Properties

this part defines the procedures for registering new properties, or new enumerated property values, for the MIME Calendaring and Scheduling Content Type with the IANA ๐ŸŒธ Non-IANA properties can be used by bilateral agreement, as long as the property names follow the "X-" convention ๐Ÿ’œ

The procedures here are built to allow public comment and review of new properties, while posing only a small hurdle to defining new properties ๐Ÿซถ

Here's how registering a new property goes, step by step ๐Ÿ‘‘

7.2.1 Define the property

A property is defined by filling out the following template ๐Ÿ“‹

To: ietf-calendar@imc.org

Subject: Registration of text/calendar MIME property XXX

Property name:

Property purpose:

Property value type(s):

Property parameter (s):

Conformance:

Description:

Format definition:

Examples:

Here's what each field in the template means ๐Ÿงš

  • Property name: The name of the property, as it will appear in the body of a text/calendar MIME Content-Type "property: value" line, to the left of the colon ":".
  • Property purpose: The purpose of the property (e.g., to indicate a delegate for the event or to-do, etc.). Give a short but clear description โœจ
  • Property value type (s): Any of the valid value types for the property value needs to be specified. The default value type also needs to be specified. If a new value type is specified, it needs to be declared in this section ๐ŸŽ€
  • Property parameter (s): Any of the valid property parameters for the property needs to be specified.
  • Conformance: The calendar components that the property can appear in needs to be specified.
  • Description: Any special notes about the property, how it's to be used, etc. ๐Ÿ’…
  • Format definition: The ABNF for the property definition needs to be specified.
  • Examples: One or more examples of instances of the property need to be specified ๐Ÿ“

7.2.2 Post the Property definition

The property description MUST be posted to the new property discussion list, ietf-calendar@imc.org ๐Ÿ“ฃ

7.2.3 Allow a comment period

Discussion on the new property MUST be allowed to take place on the list for a minimum of two weeks โณ Consensus MUST be reached on the property before moving on to the next step ๐Ÿซถ

7.2.4 Submit the property for approval โœจ

Okay so once the two-week comment period is over and the proposer is convinced consensus has been reached on the property, the registration application should be submitted to the Method Reviewer for approval ๐Ÿซถ. The Method Reviewer is appointed to the Application Area Directors, and they can either accept or reject the property registration ๐Ÿ’…. If it's accepted, the Method Reviewer should pass it on to the IANA so it gets added to the official IANA method registry ๐ŸŒธ. It can be rejected for any of these reasons: 1) Insufficient comment period; 2) Consensus not reached; 3) Technical deficiencies raised on the list or elsewhere have not been addressed ๐Ÿ’€. If the Method Reviewer rejects a property, the proposer can appeal to the IESG ๐Ÿ”ฅ. Or the proposer can deal with the objections and resubmit the property instead ๐Ÿฆ‹.

7.3 Property Change Control ๐ŸŒˆ

Existing properties can be changed using the same process they were registered with, bestie ๐Ÿ’–.

  1. Define the change
  2. Post the change
  3. Allow a comment period
  4. Submit the property for approval

Lowkey important: the original author or any other interested party can propose a change to an existing property, but those changes should only be proposed when there are serious omissions or errors in the published memo ๐Ÿ™ˆ. The Method Reviewer can object to a change if it isn't backward compatible, but they aren't required to do so โœจ.

Property definitions can never be deleted from the IANA registry ๐Ÿ˜ญ. Properties that are no longer believed to be useful can be declared OBSOLETE by a change to their intended use field ๐Ÿงš.

8 References ๐ŸŽ€

  • [IMIP] Dawson, F., Mansour, S. and S. Silverberg, "iCalendar Message-based Interoperability Protocol (IMIP)", RFC 2447, November 1998.
  • [ITIP] Silverberg, S., Mansour, S., Dawson, F. and R. Hopson, "iCalendar Transport-Independent Interoperability Protocol (iTIP) : Scheduling Events, Busy Time, To-dos and Journal Entries", RFC 2446, November 1998.
  • [ISO 8601] ISO 8601, "Data elements and interchange formats- Information interchange--Representation of dates and times", International Organization for Standardization, June, 1988.
  • [ISO 9070] ISO/IEC 9070, "Information Technology_SGML Support Facilities--Registration Procedures for Public Text Owner Identifiers", Second Edition, International Organization for Standardization, April 1991.
  • [RFC 822] Crocker, D., "Standard for the Format of ARPA Internet Text Messages", STD 11, RFC 822, August 1982.
  • [RFC 1738] Berners-Lee, T., Masinter, L. and M. McCahill, "Uniform Resource Locators (URL)", RFC 1738, December 1994.
  • [RFC 1766] Alvestrand, H., "Tags for the Identification of Languages", RFC 1766, March 1995.
  • [RFC 2045] Freed, N. and N. Borenstein, " Multipurpose Internet Mail Extensions (MIME) - Part One: Format of Internet Message Bodies", RFC 2045, November 1996.
  • [RFC 2046] Freed, N. and N. Borenstein, " Multipurpose Internet Mail Extensions (MIME) - Part Two: Media Types", RFC 2046, November 1996.
  • [RFC 2048] Freed, N., Klensin, J. and J. Postel, "Multipurpose Internet Mail Extensions (MIME) - Part Four: Registration Procedures", RFC 2048, January 1997.
  • [RFC 2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
  • [RFC 2234] Crocker, D. and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", RFC 2234, November 1997.
  • [RFC 2279] Yergeau, F., "UTF-8, a transformation format of ISO 10646", RFC 2279, January 1998.
  • [RFC 2425] Howes, T., Smith, M. and F. Dawson, "A MIME Content-Type for Directory Information", RFC 2425, September 1998.
  • [RFC 2426] Dawson, F. and T. Howes, "vCard MIME Directory Profile", RFC 2426, September 1998.
  • [TZ] Olson, A.D., et al, Time zone code and data, ftp://elsie.nci.nih.gov/pub/, updated periodically.
  • [VCAL] Internet Mail Consortium, "vCalendar - The Electronic Calendaring and Scheduling Exchange Format", http://www.imc.org/pdi/vcal-10.txt, September 18, 1996.

9 Acknowledgments ๐Ÿซถ

A hearty thanks to the IETF Calendaring and Scheduling Working Group ๐Ÿฅฐ, and also to the following individuals who helped with drafting, reviewing and discussing this memo ๐ŸŒธ: Roland Alden, Harald T. Alvestrand, Eric Berman, Denis Bigorgne, John Binici, Bill Bliss, Philippe Boucher, Steve Carter, Andre Courtemanche, Dave Crocker, David Curley, Alec Dun, John Evans, Ross Finlayson, Randell Flint, Ned Freed, Patrik Faltstrom, Chuck Grandgent, Mark Handley, Steve Hanna, Paul B. Hill, Paul Hoffman, Ross Hopson, Mark Horton, Daryl Huff, Bruce Kahn, C. Harald Koch, Ryan Jansen, Don Lavange, Antoine Leca, Theodore Lorek, Steve Mansour, Skip Montanaro, Keith Moore, Cecil Murray, Chris Newman, John Noerenberg, Ralph Patterson, Pete Resnick, Keith Rhodes, Robert Ripberger, John Rose, Doug Royer, Andras Salamar, Ted Schuh, Vinod Seraphin, Derrick Shadel, Ken Shan, Andrew Shuman, Steve Silverberg, William P. Spencer, John Sun, Mark Towfiq, Yvonne Tso, Robert Visnov, James L. Weiner, Mike Weston, William Wyatt. ๐Ÿ‘‘


10 Authors' and Chairs' Addresses ๐Ÿ’Œ

The following address info comes in MIME-VCARD format, which is basically an electronic business card ๐Ÿชช.

The authors of this memo are:

BEGIN:VCARD
VERSION:3.0
N:Dawson;Frank
FN:Frank Dawson
ORG:Lotus Development Corporation
ADR;TYPE=WORK,POSTAL,PARCEL:;;6544 Battleford Drive;
 Raleigh;NC;27613-3502;USA
TEL;TYPE=WORK,MSG:+1-919-676-9515
TEL;TYPE=WORK,FAX:+1-919-676-9564
EMAIL;TYPE=PREF,INTERNET:Frank_Dawson@Lotus.com
EMAIL;TYPE=INTERNET:fdawson@earthlink.net
URL:http://home.earthlink.net/~fdawson
END:VCARD

BEGIN:VCARD
VERSION:3.0
N:Stenerson;Derik
FN:Derik Stenerson
ORG:Microsoft Corporation
ADR;TYPE=WORK,POSTAL,PARCEL:;;One Microsoft Way;
 Redmond;WA;98052-6399;USA
TEL;TYPE=WORK,MSG:+1-425-936-5522
TEL;TYPE=WORK,FAX:+1-425-936-7329
EMAIL;TYPE=INTERNET:deriks@Microsoft.com
END:VCARD

The iCalendar object is a result of the work of the Internet Engineering Task Force Calendaring and Scheduling Working Group ๐Ÿ—“๏ธ. The chairmen of that working group are:

BEGIN:VCARD
VERSION:3.0
N:Ganguly;Anik
FN:Anik Ganguly
ORG: Open Text Inc.
ADR;TYPE=WORK,POSTAL,PARCEL:;Suite 101;38777 West Six Mile Road;
 Livonia;MI;48152;USA
TEL;TYPE=WORK,MSG:+1-734-542-5955
EMAIL;TYPE=INTERNET:ganguly@acm.org
END:VCARD

The co-chairman of that working group is:

BEGIN:VCARD
VERSION:3.0
N:Moskowitz;Robert
FN:Robert Moskowitz
EMAIL;TYPE=INTERNET:rgm-ietf@htt-consult.com
END:VCARD

Copyright (C) The Internet Society (1998). All Rights Reserved. ๐Ÿ”’

This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards, in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into languages other than English ๐ŸŒ.

The limited permissions granted above are perpetual and will not be revoked by the Internet Society or its successors or assigns โ™พ๏ธ.

This document and the information contained herein is provided on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ๐Ÿฆ‹.

๐Ÿ“ฆ where this page comes from