Calendaring extensions R. Stepanek Internet-Draft Fastmail Updates: 5545, jscalendarbis (if approved) 2 November 2026 Intended status: Standards Track Expires: 6 May 2027 JSCalendar: Converting from and to iCalendar draft-ietf-calext-jscalendar-icalendar-29 Abstract This document defines how to convert calendaring information between the JSCalendar and iCalendar data formats. It considers every JSCalendar and iCalendar element registered at IANA at the time of publication. It defines conversion rules for all elements that are common to both formats, as well as how convert arbitrary or unknown JSCalendar and iCalendar elements. This document updates RFC 5545 ("iCalendar") and jscalendarbis ("JSCalendar") by defining new properties and parameters for JSCalendar and iCalendar conversion. Status of This Memo This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet- Drafts is at https://datatracker.ietf.org/drafts/current/. Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress." This Internet-Draft will expire on 6 May 2027. Copyright Notice Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved. This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/ license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components Stepanek Expires 6 May 2027 [Page 1] Internet-Draft JSCalendar November 2026 extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License. Table of Contents 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4 1.2. Scope and Goals . . . . . . . . . . . . . . . . . . . . . 4 1.3. How to Read the Examples . . . . . . . . . . . . . . . . 5 1.3.1. iCalendar Examples . . . . . . . . . . . . . . . . . 5 1.3.2. JSCalendar Examples . . . . . . . . . . . . . . . . . 7 1.3.3. Conversion Examples . . . . . . . . . . . . . . . . . 9 1.4. Lossy versus Lossless Conversion . . . . . . . . . . . . 9 2. Converting iCalendar to JSCalendar . . . . . . . . . . . . . 10 2.1. General rules . . . . . . . . . . . . . . . . . . . . . . 10 2.1.1. iCalendar Objects . . . . . . . . . . . . . . . . . . 10 2.1.2. Recurring Components . . . . . . . . . . . . . . . . 12 2.1.3. JSCalendar Ids . . . . . . . . . . . . . . . . . . . 17 2.1.4. Timezone identifiers . . . . . . . . . . . . . . . . 17 2.1.5. DATE and DATE-TIME . . . . . . . . . . . . . . . . . 18 2.2. Components . . . . . . . . . . . . . . . . . . . . . . . 18 2.2.1. PARTICIPANT . . . . . . . . . . . . . . . . . . . . . 18 2.2.2. VALARM . . . . . . . . . . . . . . . . . . . . . . . 20 2.2.3. VEVENT . . . . . . . . . . . . . . . . . . . . . . . 22 2.2.4. VLOCATION . . . . . . . . . . . . . . . . . . . . . . 25 2.2.5. VTODO . . . . . . . . . . . . . . . . . . . . . . . . 27 2.3. Properties . . . . . . . . . . . . . . . . . . . . . . . 30 2.3.1. ACKNOWLEDGED . . . . . . . . . . . . . . . . . . . . 30 2.3.2. ACTION . . . . . . . . . . . . . . . . . . . . . . . 31 2.3.3. ATTACH . . . . . . . . . . . . . . . . . . . . . . . 33 2.3.4. ATTENDEE . . . . . . . . . . . . . . . . . . . . . . 34 2.3.5. CALENDAR-ADDRESS . . . . . . . . . . . . . . . . . . 40 2.3.6. CATEGORIES . . . . . . . . . . . . . . . . . . . . . 41 2.3.7. CLASS . . . . . . . . . . . . . . . . . . . . . . . . 42 2.3.8. COLOR . . . . . . . . . . . . . . . . . . . . . . . . 43 2.3.9. CONCEPT . . . . . . . . . . . . . . . . . . . . . . . 44 2.3.10. CONFERENCE . . . . . . . . . . . . . . . . . . . . . 44 2.3.11. COORDINATES . . . . . . . . . . . . . . . . . . . . . 45 2.3.12. CREATED . . . . . . . . . . . . . . . . . . . . . . . 46 2.3.13. DESCRIPTION . . . . . . . . . . . . . . . . . . . . . 46 2.3.14. DTEND . . . . . . . . . . . . . . . . . . . . . . . . 47 2.3.15. DTSTAMP . . . . . . . . . . . . . . . . . . . . . . . 49 2.3.16. DTSTART . . . . . . . . . . . . . . . . . . . . . . . 50 2.3.17. DUE . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.3.18. DURATION . . . . . . . . . . . . . . . . . . . . . . 54 2.3.19. ESTIMATED-DURATION . . . . . . . . . . . . . . . . . 54 2.3.20. EXDATE . . . . . . . . . . . . . . . . . . . . . . . 54 Stepanek Expires 6 May 2027 [Page 2] Internet-Draft JSCalendar November 2026 2.3.21. GEO . . . . . . . . . . . . . . . . . . . . . . . . . 55 2.3.22. IMAGE . . . . . . . . . . . . . . . . . . . . . . . . 59 2.3.23. LAST-MODIFIED . . . . . . . . . . . . . . . . . . . . 60 2.3.24. LINK . . . . . . . . . . . . . . . . . . . . . . . . 61 2.3.25. LOCATION . . . . . . . . . . . . . . . . . . . . . . 62 2.3.26. LOCATION-TYPE . . . . . . . . . . . . . . . . . . . . 64 2.3.27. METHOD . . . . . . . . . . . . . . . . . . . . . . . 65 2.3.28. NAME . . . . . . . . . . . . . . . . . . . . . . . . 66 2.3.29. ORGANIZER . . . . . . . . . . . . . . . . . . . . . . 67 2.3.30. PERCENT-COMPLETE . . . . . . . . . . . . . . . . . . 72 2.3.31. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 73 2.3.32. PRODID . . . . . . . . . . . . . . . . . . . . . . . 73 2.3.33. RDATE . . . . . . . . . . . . . . . . . . . . . . . . 74 2.3.34. RECURRENCE-ID . . . . . . . . . . . . . . . . . . . . 76 2.3.35. RELATED-TO . . . . . . . . . . . . . . . . . . . . . 77 2.3.36. RRULE . . . . . . . . . . . . . . . . . . . . . . . . 79 2.3.37. SEQUENCE . . . . . . . . . . . . . . . . . . . . . . 81 2.3.38. SHOW-WITHOUT-TIME . . . . . . . . . . . . . . . . . . 82 2.3.39. STATUS . . . . . . . . . . . . . . . . . . . . . . . 82 2.3.40. SOURCE . . . . . . . . . . . . . . . . . . . . . . . 83 2.3.41. STYLED-DESCRIPTION . . . . . . . . . . . . . . . . . 84 2.3.42. SUMMARY . . . . . . . . . . . . . . . . . . . . . . . 84 2.3.43. TRANSP . . . . . . . . . . . . . . . . . . . . . . . 85 2.3.44. TRIGGER . . . . . . . . . . . . . . . . . . . . . . . 86 2.3.45. UID . . . . . . . . . . . . . . . . . . . . . . . . . 88 2.3.46. URL . . . . . . . . . . . . . . . . . . . . . . . . . 88 3. Converting JSCalendar to iCalendar . . . . . . . . . . . . . 89 3.1. Alert . . . . . . . . . . . . . . . . . . . . . . . . . . 89 3.2. Event and Task . . . . . . . . . . . . . . . . . . . . . 89 3.3. Group . . . . . . . . . . . . . . . . . . . . . . . . . . 93 3.4. Link . . . . . . . . . . . . . . . . . . . . . . . . . . 95 3.5. Location . . . . . . . . . . . . . . . . . . . . . . . . 96 3.6. Participant . . . . . . . . . . . . . . . . . . . . . . . 97 3.7. VirtualLocation . . . . . . . . . . . . . . . . . . . . . 100 4. Updates to iCalendar . . . . . . . . . . . . . . . . . . . . 101 4.1. New Properties . . . . . . . . . . . . . . . . . . . . . 101 4.1.1. JSID . . . . . . . . . . . . . . . . . . . . . . . . 101 4.1.2. JSPROP . . . . . . . . . . . . . . . . . . . . . . . 102 4.2. New Parameters . . . . . . . . . . . . . . . . . . . . . 105 4.2.1. JSID . . . . . . . . . . . . . . . . . . . . . . . . 105 4.2.2. JSPTR . . . . . . . . . . . . . . . . . . . . . . . . 106 5. Updates to JSCalendar . . . . . . . . . . . . . . . . . . . . 106 5.1. New Properties . . . . . . . . . . . . . . . . . . . . . 106 5.1.1. iCalendar . . . . . . . . . . . . . . . . . . . . . . 106 6. Security Considerations . . . . . . . . . . . . . . . . . . . 109 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 109 7.1. Changes to the "iCalendar Element Registries" . . . . . . 109 7.2. Changes to the "JSCalendar Registries" . . . . . . . . . 110 Stepanek Expires 6 May 2027 [Page 3] Internet-Draft JSCalendar November 2026 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 114 8.1. Normative References . . . . . . . . . . . . . . . . . . 114 8.2. Informative References . . . . . . . . . . . . . . . . . 116 Appendix A. Discrepancies between iCalendar and JSCalendar . . . 116 A.1. Unsupported iCalendar Elements . . . . . . . . . . . . . 117 A.1.1. Components . . . . . . . . . . . . . . . . . . . . . 117 A.1.2. Properties by Component . . . . . . . . . . . . . . . 117 A.1.3. Subcomponents by Component . . . . . . . . . . . . . 120 A.1.4. Properties by Value Type . . . . . . . . . . . . . . 120 A.1.5. Parameters by Property . . . . . . . . . . . . . . . 120 Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 122 1. Introduction 1.1. Notational 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 interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. The ABNF definitions in this document use the notations of [RFC5234]. ABNF rules not defined in this document either are defined in [RFC5234] or [RFC5545]. 1.2. Scope and Goals This document outlines how to convert between the iCalendar [RFC5545] and JSCalendar [JSCALENDAR] data formats. It describes which elements are common to both, but also highlights where the two formats differ. For each common element, it defines a conversion rule and includes an example of how to convert that element. All iCalendar and JSCalendar elements currently registered at IANA are in scope, but not all of these elements are common to both formats. For elements that have no counterpart in the other format, it is the goal of this document to define how to preserve them during conversion, but in general it is not the goal to achieve this by defining new standard elements. Instead, this document updates [RFC5545] and [JSCALENDAR] by defining iCalendar and JSCalendar elements to preserve elements that have no equivalent in the other format. These conversion-specific properties are defined in Section 4.1.2 for iCalendar, and Section 5.1.1 for JSCalendar. Appendix A further outlines the discrepancies between the two formats. Stepanek Expires 6 May 2027 [Page 4] Internet-Draft JSCalendar November 2026 1.3. How to Read the Examples Later sections contain examples that illustrate how to convert between the iCalendar and JSCalendar data formats. The notation of these examples is such that their main points should be clear to the reader, but their contents can also be parsed for automated testing. The following sections define the notation for such examples. 1.3.1. iCalendar Examples An iCalendar example contains either an extract or a complete representation of iCalendar data. It always represents an iCalendar object, even if the example only depicts non-VCALENDAR components or properties. The following rules apply: * An example that only contains iCalendar properties implicitly represents a VEVENT component having these properties set and that is part of a VCALENDAR component. * An example that only contains one or more VEVENT, VTODO, VJOURNAL, FREEBUSY or VTIMEZONE components implicitly represents a VCALENDAR component that contains them. An example that only contains one or more other components implicitly represents a VEVENT component having these components set and that is part of a VCALENDAR components. * An example that only contains VEVENT or VTODO components implicitly represents a VCALENDAR component that contains them. * An example that only contains a VCALENDAR component but no contained components implicitly represents a VCALENDAR component that contains a VEVENT component. * Implicit components (those without a BEGIN and END, or omitted completely) are assumed to contain all mandatory properties with some value, but the actual value is irrelevant for the example. Figures 1, 2, and 3 contain three examples, all of which represent the same iCalendar data. In Figure 1, both the VEVENT component and VCALENDAR component are implicit. In Figure 2, only the VCALENDAR component and its mandatory properties are implicit. Figure 3 depicts a complete VCALENDAR component, nothing is implicit. SUMMARY:hello Figure 1: Example for implicit VCALENDAR and VEVENT components Stepanek Expires 6 May 2027 [Page 5] Internet-Draft JSCalendar November 2026 BEGIN:VEVENT DTSTAMP:20060102T030405Z DTSTART:20060102T030405Z SUMMARY:hello UID:CC0A494A-6E07-4827-8294-0752DD1ECFA4 END:VEVENT Figure 2: Example for an implicit VCALENDAR component BEGIN:VCALENDAR PRODID:-//FOO//bar//EN VERSION:2.0 BEGIN:VEVENT DTSTAMP:20060102T030405Z DTSTART:20060102T030405Z SUMMARY:hello UID:CC0A494A-6E07-4827-8294-0752DD1ECFA4 END:VEVENT END:VCALENDAR Figure 3: Example for explicit VCALENDAR and VEVENT components A line containing just the value ... stands for any other properties that might be present in a component but are irrelevant for this example. This includes mandatory properties as described for implicit components, but the value ... does not represent a property in a component for which at least one same-named property is explicitly stated for that component in the example. The line ... at the end of the example additionally stands for any END content lines to complete components that started with BEGIN content lines, and any of their missing mandatory properties. Figure 4 illustrates this as an alternative representation for the examples of Figures 1, 2, and 3. BEGIN:VCALENDAR BEGIN:VEVENT SUMMARY:hello ... Figure 4: Example for additional properties and component ENDs represented by ... A line starting with a single space represents the continuation of a folded content line (Section 3.1 of [RFC5545]). Figure 5 illustrates this. SUMMARY:he llo Stepanek Expires 6 May 2027 [Page 6] Internet-Draft JSCalendar November 2026 Figure 5: Example for a folded content line 1.3.2. JSCalendar Examples A JSCalendar example always represents a Group object, even if the example only depicts one of the Group entries or properties. E.g., an example containing only an Alert object is implied to be the sole value of the "alerts" property of an Event object, which is implied to be the sole list member in the "entries" property of a Group object. The Group object has its "version" property set to "2.0", unless the example explicitly defines a complete Group object. JSCalendar objects are depicted either explicitly or implicitly. An explicit JSCalendar object starts and ends with braces. An implicit JSCalendar object omits braces, it only consists of JSON name/value pairs, separated by comma. An implicit JSCalendar object is assumed to be of type Event, unless it contains the "@type" property with a different value. It is assumed to contain all mandatory properties with some value; if they are not depicted, their actual value is irrelevant for the main point of the example. Figures 6, 7, 8, and 9 illustrate this with multiple examples, all of which represent the same JSCalendar data. Figure 6 contains an implicit JSCalendar object of type Event. Figure 7 contains an implicit JSCalendar object with a "@type" property. Figure 8 contains an explicit Event object but the Group object containing it is omitted. Figure 9 contains the full Group object, nothing is omitted. "title": "hello" Figure 6: Example for an implicit JSCalendar object of type Event "@type": "Event", "title": "hello" Figure 7: Example for an implicit JSCalendar object with "@type" property Stepanek Expires 6 May 2027 [Page 7] Internet-Draft JSCalendar November 2026 { "@type": "Event", "title": "hello", "start": "2006-01-02T03:04:05", "timeZone": "Etc/UTC", "uid": "CC0A494A-6E07-4827-8294-0752DD1ECFA4", "updated": "2006-01-02T03:04:05Z" } Figure 8: Example for an explicit Event object with implicit Group object { "@type": "Group", "version": "2.0", "entries": [ { "@type": "Event", "title": "hello", "start": "2006-01-02T03:04:05", "timeZone": "Etc/UTC", "uid": "CC0A494A-6E07-4827-8294-0752DD1ECFA4", "updated": "2006-01-02T03:04:05Z" } ] } Figure 9: Example for an explicit Group object A property with name "..." and value "" stands for additional properties that might be present in a JSCalendar object but are irrelevant for this example, including mandatory properties. The "..." property requires the "@type" property to be set. Figure 10 illustrates this as an alternative representation for the examples of Figures 6, 7, 8, and 9. { "@type": "Event", "title": "hello", "...": "" } Figure 10: Example for additional properties represented by ... Stepanek Expires 6 May 2027 [Page 8] Internet-Draft JSCalendar November 2026 1.3.3. Conversion Examples A conversion example depicts iCalendar data together with the JSCalendar data it converts to. The iCalendar data follows the notation defined in Section 1.3.1, the JSCalendar data follows the notation defined in Section 1.3.2. The iCalendar data is preceded by a line containing just --- iCalendar:, and the JSCalendar data is preceded by a line containing just --- JSCalendar:. These marker lines are not part of the example data. Empty lines are not part of the example data either and are ignored. Figure 11 illustrates this. --- iCalendar: SUMMARY:hello --- JSCalendar: "title": "hello" Figure 11: Example for the notation of a conversion example 1.4. Lossy versus Lossless Conversion This document outlines how to convert iCalendar elements to JSCalendar elements, and the other way round. Many of these can be represented by standard elements in both formats, meaning that they are registered in the iCalendar and JSCalendar IANA registries and differ from the special-purpose elements introduced in Section 4 and Section 5. Still, a number of elements in either format have no standard counterpart in the other. When converting between between iCalendar and JSCalendar, implementations MAY choose to only convert elements that have standard element in the target format, or aim to preserve as many elements as possible. When to choose between lossy and lossless conversion is implementation-specific. For example: * For lossy conversion, an implementation that internally stores calendar data in JSCalendar format might only want to convert to a subset of iCalendar elements for iMIP scheduling [RFC6047]. In this case, it might not make use any of the conversion-specific iCalendar properties introduced in Section 4. * For lossless conversion, an implementation that internally stores calendar data in iCalendar format might want to convert without loss to JSCalendar when updating calendar events with JMAP [JMAP-CAL]. For that, it can use the conversion-specific properties defined in Section 5. Stepanek Expires 6 May 2027 [Page 9] Internet-Draft JSCalendar November 2026 All the examples in this document illustrate lossless conversion, if not explicitly stated otherwise in the example. 2. Converting iCalendar to JSCalendar 2.1. General rules 2.1.1. iCalendar Objects Section 3.4 of [RFC5545] allows for an iCalendar stream to contain one or more iCalendar objects. In contrast, this specification only defines conversion for streams consisting of a single iCalendar object. Converting streams of multiple iCalendar objects is implementation-specific. All following sections of this document use the terms "iCalendar object" and "VCALENDAR component" interchangeably. The VCALENDAR component [RFC5545] (Section 3.4) converts to a Group object [JSCALENDAR] (Section 2.3). Its properties convert as follows: Stepanek Expires 6 May 2027 [Page 10] Internet-Draft JSCalendar November 2026 +====================+==========================+=========+ | iCalendar property | JSCalendar property | Section | +====================+==========================+=========+ | ATTACH | links | 2.3.3 | +--------------------+--------------------------+---------+ | CATEGORIES | keywords | 2.3.6 | +--------------------+--------------------------+---------+ | COLOR | color | 2.3.8 | +--------------------+--------------------------+---------+ | CONCEPT | categories | 2.3.9 | +--------------------+--------------------------+---------+ | CREATED | created | 2.3.12 | +--------------------+--------------------------+---------+ | DESCRIPTION | description | 2.3.13 | +--------------------+--------------------------+---------+ | IMAGE | links | 2.3.22 | +--------------------+--------------------------+---------+ | LAST-MODIFIED | updated | 2.3.23 | +--------------------+--------------------------+---------+ | LINK | links | 2.3.24 | +--------------------+--------------------------+---------+ | METHOD | entries/*/method | 2.3.27 | +--------------------+--------------------------+---------+ | NAME | title | 2.3.28 | +--------------------+--------------------------+---------+ | PRODID | prodId, entries/*/prodId | 2.3.32 | +--------------------+--------------------------+---------+ | SOURCE | source | 2.3.40 | +--------------------+--------------------------+---------+ | UID | uid | 2.3.45 | +--------------------+--------------------------+---------+ | URL | links | 2.3.46 | +--------------------+--------------------------+---------+ Table 1: Properties of the VCALENDAR component Its components convert as follows: +=====================+=====================+=========+ | iCalendar component | JSCalendar property | Section | +=====================+=====================+=========+ | VEVENT | entries | 2.2.3 | +---------------------+---------------------+---------+ | VTODO | entries | 2.2.5 | +---------------------+---------------------+---------+ Table 2: Components of the VCALENDAR component Stepanek Expires 6 May 2027 [Page 11] Internet-Draft JSCalendar November 2026 Other properties or components MAY be converted to the "iCalendar" property (Section 5.1.1) of the Group object. The order of elements in the "entries" property is implementation- specific, e.g. entries need not be in the same order as their source components in the iCalendar object. The following example illustrates how to convert the VCALENDAR component: --- iCalendar: BEGIN:VCALENDAR UID:41aa02b6-42d0-4f45-8cb4-8b5075be2e14 BEGIN:VEVENT ... --- JSCalendar: { "@type": "Group", "entries": [ { "...": "", "@type": "Event" } ], "uid": "41aa02b6-42d0-4f45-8cb4-8b5075be2e14", "...": "" } Figure 12: Converting the VCALENDAR component 2.1.2. Recurring Components Components in an iCalendar object generally convert to distinct JSCalendar objects. For example, two VEVENT components with different UID property values in the same iCalendar object convert to two separate Event objects in the Group object's entries. As an exception to this rule, this does not apply to recurrence overrides, defined as follows. A VEVENT (or VTODO) component is a recurrence override if it has the RECURRENCE-ID property set, and the iCalendar object contains a VEVENT (or VTODO) component that does not have the RECURRENCE-ID but the RRULE property set, and the UID property values of the two components are equal. The component without the RECURRENCE-ID property is in that case referred to as the "main component". Stepanek Expires 6 May 2027 [Page 12] Internet-Draft JSCalendar November 2026 The main component converts to an entry in the Group object's "entries" property. The recurrence override converts to the converted main component's "recurrenceOverrides" property. Its RECURRENCE-ID property value converts to the key in the "recurrenceOverrides" property. The value of the "recurrenceOverrides" property at that key is a PatchObject that transforms the converted main component into the converted recurrence override, but it MUST NOT contain any of the patches that are forbidden for the "recurrenceOverrides" property [JSCALENDAR] (Section 3.3.4). The following example illustrates how to convert a main component and its recurrence override: Stepanek Expires 6 May 2027 [Page 13] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VCALENDAR ... BEGIN:VEVENT UID:F4257E1D-5461-4EF6-840F-9DFC653EB559 RRULE:FREQ=DAILY DTSTART;TZID=Europe/Berlin:20240101T140000 ... END:VEVENT BEGIN:VEVENT UID:F4257E1D-5461-4EF6-840F-9DFC653EB559 RECURRENCE-ID;TZID=Europe/Berlin:20240202T140000 DTSTART;TZID=Europe/Berlin:20240202T160000 ... END:VEVENT END:VCALENDAR --- JSCalendar: { "@type": "Group", "entries": [ { "...": "", "@type": "Event", "recurrenceOverrides": { "2024-02-02T14:00:00": { "start": "2024-02-02T16:00:00" } }, "recurrenceRule": { "@type": "RecurrenceRule", "frequency": "daily" }, "start": "2024-01-01T14:00:00", "timeZone": "Europe/Berlin", "uid": "F4257E1D-5461-4EF6-840F-9DFC653EB559" } ], "...": "" } Figure 13: Converting VEVENT recurrence overrides Stepanek Expires 6 May 2027 [Page 14] Internet-Draft JSCalendar November 2026 A VEVENT (or VTODO) component is a stand-alone recurrence instance if it has the RECURRENCE-ID property set and the iCalendar object does not contain its related main component. Each stand-alone recurrence instance converts to a distinct Event (or Task) object in the Group object's "entries" property. The "recurrenceId" property MUST be set. The following example illustrates how to convert stand-alone recurrence instances: Stepanek Expires 6 May 2027 [Page 15] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VCALENDAR ... BEGIN:VEVENT UID:F4257E1D-5461-4EF6-840F-9DFC653EB559 RECURRENCE-ID;TZID=Europe/Berlin:20240202T140000 DTSTART;TZID=Europe/Berlin:20240202T160000 ... END:VEVENT BEGIN:VEVENT UID:F4257E1D-5461-4EF6-840F-9DFC653EB559 RECURRENCE-ID;TZID=Europe/Berlin:20240103T140000 DTSTART;TZID=Europe/Berlin:20240103T170000 ... END:VEVENT END:VCALENDAR --- JSCalendar: { "@type": "Group", "entries": [ { "...": "", "@type": "Event", "recurrenceId": "2024-02-02T14:00:00", "recurrenceIdTimeZone": "Europe/Berlin", "start": "2024-02-02T16:00:00", "timeZone": "Europe/Berlin", "uid": "F4257E1D-5461-4EF6-840F-9DFC653EB559" }, { "...": "", "@type": "Event", "recurrenceId": "2024-01-03T14:00:00", "recurrenceIdTimeZone": "Europe/Berlin", "start": "2024-01-03T17:00:00", "timeZone": "Europe/Berlin", "uid": "F4257E1D-5461-4EF6-840F-9DFC653EB559" } ], "...": "" } Figure 14: Converting VEVENT recurrence instances Stepanek Expires 6 May 2027 [Page 16] Internet-Draft JSCalendar November 2026 2.1.3. JSCalendar Ids JSCalendar generally uses JSON objects to represent a collection of same-typed values. The keys are of type Id [JSCALENDAR] (Section 1.5.1), the values are JSCalendar object types. If an iCalendar element converts to a value in such a collection then an implementation needs to choose an identifier as key. If the JSID parameter (Section 4.2.1) or JSID property (Section 4.1.1) is set on a property or component, then its value MUST be used as key when converting that element from iCalendar to JSCalendar. In absence of the JSID parameter or property key generation is implementation-specific. Some sections later in this document describe key generation schemes for specific iCalendar elements by making use of UUID Version 5 with SHA1 hash [RFC9562] (Section 5.5). The Namespace ID to generate such keys is "7f1e1965-ae73-4454-b088-232c90730ce2". These key generation schemes are not mandatory, nor is making use of that particular Namespace ID when using UUID Version 5 (UUIDv5) as keys. Irrespective of the key generation scheme, all keys MUST be valid according to the definition of the Id type. For consistency, keys SHOULD be stable such that converting the same iCalendar data to JSCalendar multiple times produces the same keys. 2.1.4. Timezone identifiers Converting temporal properties such as DTSTART, DTEND, and RECURRENCE-ID requires to not only determine the date and time of the property value, but also the timezone it references. If the property value type is DATE [RFC5545] (Section 3.3.4) or DATE-TIME in FORM #1: DATE WITH LOCAL TIME [RFC5545] (Section 3.3.5) then the timezone is not set in JSCalendar. If the property value type is DATE-TIME in FORM #2: DATE WITH UTC TIME [RFC5545] (Section 3.3.5) then the timezone identifier is "Etc/ UTC" in JSCalendar. If the property value type is DATE-TIME in FORM #3: DATE WITH LOCAL TIME AND TIME ZONE REFERENCE [RFC5545] (Section 3.3.5) then the timezone identifier is determined by the TZID parameter value as follows: If the TZID parameter value is equal to a name in the IANA Time Zone Database [TZDB] then the timezone identifier is that verbatim name. Otherwise, how to convert the TZID parameter value is implementation- Stepanek Expires 6 May 2027 [Page 17] Internet-Draft JSCalendar November 2026 specific: software libraries such as the International Components for Unicode (https://icu.unicode.org/) support converting Microsoft time zone names to IANA time zone identifiers. Alternatively, an implementation might determine the name of an IANA time zone which has identical time zone rules over the time span of the calendar object. Implementations MAY preserve a TZID parameter set to a non-IANA timezone identifier and its related VTIMEZONE by use of the "convertedProperties" and "components" properties (see Section 5.1.1), but MUST NOT expect other implementations to consider them when processing the calendar object. 2.1.5. DATE and DATE-TIME iCalendar provides the DATE and DATE-TIME value types to distinguish date-only from date-time values. JSCalendar only supports date-time values. When converting from iCalendar to JSCalendar, a property value of type DATE-TIME converts to either a LocalDateTime or UTCDateTime, depending on the JSCalendar property definition. A DATE value type converts to a LocalDateTime with zero time. Section 3.2 defines which iCalendar value type to choose when converting from JSCalendar to iCalendar. 2.2. Components 2.2.1. PARTICIPANT The PARTICIPANT component [RFC9073] (Section 7.1) in a VEVENT or VTODO component converts to a Participant object [JSCALENDAR] (Section 3.4.6). The converted object is set in the Event or Task object's "participants" property. The key of the Participant object MUST be the value of the JSID property (Section 4.1.1), if set. If no JSID property but the CALENDAR-ADDRESS property is set, then the key MAY be a UUIDv5 generated from the property value (see Section 2.1.3). Otherwise, the key MAY be the UID property value. When converting to iCalendar, implementations MAY omit setting the JSID property if key matches the UUIDv5 of the CALENDAR-ADDRESS property value or the key matches the UID property, and the key is not part of a JSON pointer in any JSPTR parameter value. Its properties convert as follows: Stepanek Expires 6 May 2027 [Page 18] Internet-Draft JSCalendar November 2026 +====================+=====================+=========+ | iCalendar property | JSCalendar property | Section | +====================+=====================+=========+ | ATTACH | links | 2.3.3 | +--------------------+---------------------+---------+ | CALENDAR-ADDRESS | calendarAddress | 2.3.5 | +--------------------+---------------------+---------+ | DESCRIPTION | description | 2.3.13 | +--------------------+---------------------+---------+ | LINK | links | 2.3.24 | +--------------------+---------------------+---------+ | STYLED-DESCRIPTION | description | 2.3.41 | +--------------------+---------------------+---------+ | SUMMARY | name | 2.3.42 | +--------------------+---------------------+---------+ | URL | links | 2.3.46 | +--------------------+---------------------+---------+ Table 3: Properties of the PARTICIPANT component Other properties or components MAY be converted to the "iCalendar" property (Section 5.1.1) of the Participant object. This includes mandatory properties such as UID [RFC5545] (Section 3.8.4.7). The following example illustrates how to convert the PARTICIPANT component: Stepanek Expires 6 May 2027 [Page 19] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:PARTICIPANT UID:47AD2E1C-49D4-45DF-BD83-8398ACC7D8E2 DESCRIPTION:A participant ... END:PARTICIPANT --- JSCalendar: "participants": { "47AD2E1C-49D4-45DF-BD83-8398ACC7D8E2": { "@type": "Participant", "description": "A participant", "iCalendar": { "@type": "ICalComponent", "name": "participant", "properties": [ [ "uid", {}, "text", "47AD2E1C-49D4-45DF-BD83-8398ACC7D8E2" ] ] } } } Figure 15: Converting the PARTICIPANT component 2.2.2. VALARM The VALARM component [RFC5545] (Section 3.6.6) in a VEVENT or VTODO component converts to an Alert object [JSCALENDAR] (Section 3.5.1). The converted object is set in the Event or Task object's "alerts" property. The key of the Alert object MUST be the value of the JSID property (Section 4.1.1), if set. Otherwise, the key MAY be the value of the UID property. When converting to iCalendar, implementations MAY omit setting the JSID property if the key matches the value of the UID property, and the key is not part of a JSON pointer in any JSPTR parameter value. Its properties convert as follows: Stepanek Expires 6 May 2027 [Page 20] Internet-Draft JSCalendar November 2026 +====================+=====================+===============+ | iCalendar property | JSCalendar property | Section | +====================+=====================+===============+ | ACKNOWLEDGED | acknowledged | 2.3.1 | +--------------------+---------------------+---------------+ | ACTION | action | 2.3.2, and | | | | remarks below | +--------------------+---------------------+---------------+ | RELATED-TO | relatedTo | 2.3.35 | +--------------------+---------------------+---------------+ | TRIGGER | trigger | 2.3.44 | +--------------------+---------------------+---------------+ Table 4: Properties of the VALARM component Remarks: * The ACTION property only converts if its value is EMAIL or DISPLAY. Other properties or components MAY be converted to the "iCalendar" property (Section 5.1.1) of the Alert object. This includes mandatory properties such as ATTENDEE [RFC5545] (Section 3.8.4.1), DESCRIPTION [RFC5545] (Section 3.8.1.5), or SUMMARY [RFC5545] (Section 3.8.1.12). The following example illustrates how to convert the VALARM component: Stepanek Expires 6 May 2027 [Page 21] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VALARM UID:04DC2968-6468-4B92-BC09-5A17D7D3D4E TRIGGER:-PT30M ACTION:DISPLAY DESCRIPTION:Breakfast meeting END:VALARM --- JSCalendar: "alerts": { "04DC2968-6468-4B92-BC09-5A17D7D3D4E": { "@type": "Alert", "iCalendar": { "@type": "ICalComponent", "name": "valarm", "properties": [ [ "description", {}, "text", "Breakfast meeting" ], [ "uid", {}, "text", "04DC2968-6468-4B92-BC09-5A17D7D3D4E" ] ] }, "trigger": { "@type": "OffsetTrigger", "offset": "-PT30M" }, "action": "display" } } Figure 16: Converting the VALARM component 2.2.3. VEVENT The VEVENT component [RFC5545] (Section 3.6.1) converts to a Event object [JSCALENDAR] (Section 2.1). Its properties convert as follows: Stepanek Expires 6 May 2027 [Page 22] Internet-Draft JSCalendar November 2026 +====================+==========================+=========+ | iCalendar property | JSCalendar property | Section | +====================+==========================+=========+ | ATTACH | links | 2.3.3 | +--------------------+--------------------------+---------+ | ATTENDEE | participants | 2.3.4 | +--------------------+--------------------------+---------+ | CATEGORIES | keywords | 2.3.6 | +--------------------+--------------------------+---------+ | CLASS | privacy | 2.3.7 | +--------------------+--------------------------+---------+ | COLOR | color | 2.3.8 | +--------------------+--------------------------+---------+ | CONCEPT | categories | 2.3.9 | +--------------------+--------------------------+---------+ | CONFERENCE | virtualLocations | 2.3.10 | +--------------------+--------------------------+---------+ | CREATED | created | 2.3.12 | +--------------------+--------------------------+---------+ | DESCRIPTION | description | 2.3.13 | +--------------------+--------------------------+---------+ | DTEND | duration, endTimeZone | 2.3.14 | +--------------------+--------------------------+---------+ | DTSTAMP | updated | 2.3.15 | +--------------------+--------------------------+---------+ | DTSTART | start | 2.3.16 | +--------------------+--------------------------+---------+ | DURATION | duration | 2.3.18 | +--------------------+--------------------------+---------+ | EXDATE | recurrenceOverrides | 2.3.20 | +--------------------+--------------------------+---------+ | GEO | locations | 2.3.21 | +--------------------+--------------------------+---------+ | IMAGE | links | 2.3.22 | +--------------------+--------------------------+---------+ | LAST-MODIFIED | updated | 2.3.23 | +--------------------+--------------------------+---------+ | LINK | links | 2.3.24 | +--------------------+--------------------------+---------+ | LOCATION | locations | 2.3.25 | +--------------------+--------------------------+---------+ | ORGANIZER | organizerCalendarAddress | 2.3.29 | +--------------------+--------------------------+---------+ | PRIORITY | priority | 2.3.31 | +--------------------+--------------------------+---------+ | RDATE | recurrenceOverrides | 2.3.33 | +--------------------+--------------------------+---------+ | RECURRENCE-ID | recurrenceId | 2.3.34 | Stepanek Expires 6 May 2027 [Page 23] Internet-Draft JSCalendar November 2026 +--------------------+--------------------------+---------+ | RELATED-TO | relatedTo | 2.3.35 | +--------------------+--------------------------+---------+ | RRULE | recurrenceRule | 2.3.36 | +--------------------+--------------------------+---------+ | SEQUENCE | sequence | 2.3.37 | +--------------------+--------------------------+---------+ | SHOW-WITHOUT-TIME | showWithoutTime | 2.3.38 | +--------------------+--------------------------+---------+ | STATUS | status | 2.3.39 | +--------------------+--------------------------+---------+ | STYLED-DESCRIPTION | description | 2.3.41 | +--------------------+--------------------------+---------+ | SUMMARY | title | 2.3.42 | +--------------------+--------------------------+---------+ | TRANSP | freeBusyStatus | 2.3.43 | +--------------------+--------------------------+---------+ | UID | uid | 2.3.45 | +--------------------+--------------------------+---------+ | URL | links | 2.3.46 | +--------------------+--------------------------+---------+ Table 5: Properties of the VEVENT component Its components convert as follows: +=====================+=====================+=========+ | iCalendar component | JSCalendar property | Section | +=====================+=====================+=========+ | VALARM | alerts | 2.2.2 | +---------------------+---------------------+---------+ Table 6: Components of the VEVENT component Other properties or components MAY be converted to the "iCalendar" property (Section 5.1.1) of the Event object. VEVENT components with different UID property values in the same iCalendar object convert to different entries in the Group. They sort in the same order as in the VCALENDAR component. The following example illustrates how to convert the VEVENT component: Stepanek Expires 6 May 2027 [Page 24] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VCALENDAR ... BEGIN:VEVENT UID:DE935D01-3DF7-4201-B61A-D77D05C8B21A DTSTART:20060102T030405Z ... END:VEVENT BEGIN:VEVENT UID:60BE3D6E-6383-473A-BCF1-3C43EA1FA571 ... END:VEVENT END:VCALENDAR --- JSCalendar: { "...": "", "@type": "Group", "entries": [ { "@type": "Event", "start": "2006-01-02T03:04:05", "timeZone": "Etc/UTC", "uid": "DE935D01-3DF7-4201-B61A-D77D05C8B21A", "...": "" }, { "@type": "Event", "uid": "60BE3D6E-6383-473A-BCF1-3C43EA1FA571", "...": "" } ] } Figure 17: Converting the VEVENT component 2.2.4. VLOCATION The VLOCATION component [RFC9073] (Section 7.2) in a VEVENT or VTODO component converts to a Location object [JSCALENDAR] (Section 3.2.5). The converted object is set in the Event or Task object's "locations" property. Stepanek Expires 6 May 2027 [Page 25] Internet-Draft JSCalendar November 2026 The key of the Location object MUST be the value of the JSID property (Section 4.1.1), if set. Otherwise, the key MAY be the value of the UID property. When converting to iCalendar, implementations MAY omit setting the JSID property if the key matches the value of the UID property, and the key is not part of a JSON pointer in any JSPTR parameter value. Its properties convert as follows: +====================+=====================+=========+ | iCalendar property | JSCalendar property | Section | +====================+=====================+=========+ | ATTACH | links | 2.3.3 | +--------------------+---------------------+---------+ | COORDINATES | coordinates | 2.3.11 | +--------------------+---------------------+---------+ | GEO | coordinates | 2.3.21 | +--------------------+---------------------+---------+ | IMAGE | links | 2.3.22 | +--------------------+---------------------+---------+ | LINK | links | 2.3.24 | +--------------------+---------------------+---------+ | LOCATION-TYPE | locationTypes | 2.3.26 | +--------------------+---------------------+---------+ | NAME | name | 2.3.28 | +--------------------+---------------------+---------+ | URL | links | 2.3.46 | +--------------------+---------------------+---------+ Table 7: Properties of the VLOCATION component Other properties or components MAY be converted to the "iCalendar" property (Section 5.1.1) of the Location object. This includes mandatory properties such as UID [RFC5545] (Section 3.8.4.7). The following example illustrates how to convert the VLOCATION component: Stepanek Expires 6 May 2027 [Page 26] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VLOCATION UID:4954DC22-5BD6-4E98-844D-0302982F54AC NAME:The venue STRUCTURED-DATA;VALUE=URI: http://dir.example.com/venues/big-hall.vcf ... END:VLOCATION --- JSCalendar: "locations": { "4954DC22-5BD6-4E98-844D-0302982F54AC": { "@type": "Location", "name": "The venue", "iCalendar": { "@type": "ICalComponent", "name": "vlocation", "properties": [ [ "structured-data", {}, "uri", "http://dir.example.com/venues/big-hall.vcf" ], [ "uid", {}, "text", "4954DC22-5BD6-4E98-844D-0302982F54AC" ] ] } } } Figure 18: Converting the VLOCATION component 2.2.5. VTODO The VTODO component [RFC5545] (Section 3.6.2) converts to a Task object [JSCALENDAR] (Section 2.2). Its properties convert as follows: Stepanek Expires 6 May 2027 [Page 27] Internet-Draft JSCalendar November 2026 +====================+==========================+=========+ | iCalendar property | JSCalendar property | Section | +====================+==========================+=========+ | ATTACH | links | 2.3.3 | +--------------------+--------------------------+---------+ | ATTENDEE | participants | 2.3.4 | +--------------------+--------------------------+---------+ | CATEGORIES | keywords | 2.3.6 | +--------------------+--------------------------+---------+ | CLASS | privacy | 2.3.7 | +--------------------+--------------------------+---------+ | COLOR | color | 2.3.8 | +--------------------+--------------------------+---------+ | CONCEPT | categories | 2.3.9 | +--------------------+--------------------------+---------+ | CONFERENCE | virtualLocations | 2.3.10 | +--------------------+--------------------------+---------+ | CREATED | created | 2.3.12 | +--------------------+--------------------------+---------+ | DESCRIPTION | description | 2.3.13 | +--------------------+--------------------------+---------+ | DTSTAMP | updated | 2.3.15 | +--------------------+--------------------------+---------+ | DTSTART | start | 2.3.16 | +--------------------+--------------------------+---------+ | DUE | due | 2.3.17 | +--------------------+--------------------------+---------+ | DURATION | duration | 2.3.18 | +--------------------+--------------------------+---------+ | ESTIMATED-DURATION | estimatedDuration | 2.3.19 | +--------------------+--------------------------+---------+ | EXDATE | recurrenceOverrides | 2.3.20 | +--------------------+--------------------------+---------+ | GEO | locations | 2.3.21 | +--------------------+--------------------------+---------+ | IMAGE | links | 2.3.22 | +--------------------+--------------------------+---------+ | LAST-MODIFIED | updated | 2.3.23 | +--------------------+--------------------------+---------+ | LINK | links | 2.3.24 | +--------------------+--------------------------+---------+ | LOCATION | locations | 2.3.25 | +--------------------+--------------------------+---------+ | ORGANIZER | organizerCalendarAddress | 2.3.29 | +--------------------+--------------------------+---------+ | PERCENT-COMPLETE | percentComplete | 2.3.30 | +--------------------+--------------------------+---------+ | PRIORITY | priority | 2.3.31 | Stepanek Expires 6 May 2027 [Page 28] Internet-Draft JSCalendar November 2026 +--------------------+--------------------------+---------+ | RDATE | recurrenceOverrides | 2.3.33 | +--------------------+--------------------------+---------+ | RECURRENCE-ID | recurrenceId | 2.3.34 | +--------------------+--------------------------+---------+ | RELATED-TO | relatedTo | 2.3.35 | +--------------------+--------------------------+---------+ | RRULE | recurrenceRule | 2.3.36 | +--------------------+--------------------------+---------+ | SEQUENCE | sequence | 2.3.37 | +--------------------+--------------------------+---------+ | SHOW-WITHOUT-TIME | showWithoutTime | 2.3.38 | +--------------------+--------------------------+---------+ | STYLED-DESCRIPTION | description | 2.3.41 | +--------------------+--------------------------+---------+ | SUMMARY | title | 2.3.42 | +--------------------+--------------------------+---------+ | TRANSP | freeBusyStatus | 2.3.43 | +--------------------+--------------------------+---------+ | UID | uid | 2.3.45 | +--------------------+--------------------------+---------+ | URL | links | 2.3.46 | +--------------------+--------------------------+---------+ Table 8: Properties of the VTODO component Its components convert as follows: +=====================+=====================+=========+ | iCalendar component | JSCalendar property | Section | +=====================+=====================+=========+ | VALARM | alerts | 2.2.2 | +---------------------+---------------------+---------+ Table 9: Components of the VTODO component Other properties or components MAY be converted to the "iCalendar" property (Section 5.1.1) of the Task object. VTODO components with different UID property values in the same iCalendar object convert to different entries in the Group. They sort in the same order as in the VCALENDAR component. The following example illustrates how to convert the VTODO component: Stepanek Expires 6 May 2027 [Page 29] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VCALENDAR BEGIN:VTODO UID:83C80482-806D-41C4-8029-E438F793005D DUE:20060102T030405Z ... --- JSCalendar: { "...": "", "@type": "Group", "entries": [ { "...": "", "@type": "Task", "due": "2006-01-02T03:04:05", "timeZone": "Etc/UTC", "uid": "83C80482-806D-41C4-8029-E438F793005D" } ] } Figure 19: Converting the VTODO component 2.3. Properties 2.3.1. ACKNOWLEDGED The ACKNOWLEDGED property [RFC9074] (Section 6.1) in a VALARM component converts to the "acknowledged" property [JSCALENDAR] (Section 3.5.1) of the Alert object. The following example illustrates how to convert the ACKNOWLEDGED property: Stepanek Expires 6 May 2027 [Page 30] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VEVENT BEGIN:VALARM ACKNOWLEDGED:20241002T114703Z ... --- JSCalendar: "alerts": { "1204B2FA-E4A0-4335-B7CD-0DDC09C9B890": { "@type": "Alert", "acknowledged": "2024-10-02T11:47:03Z", "...": "" } } Figure 20: Converting the ACKNOWLEDGED property 2.3.2. ACTION The ACTION property [RFC5545] (Section 3.8.6.1) in a VALARM component converts to the "action" property [JSCALENDAR] (Section 3.5.1) of the Alert object. Its values convert as follows: +=========+=========+ | ACTION | action | +=========+=========+ | DISPLAY | display | +---------+---------+ | EMAIL | email | +---------+---------+ Table 10: Values of the ACTION property An ACTION property with value AUDIO or any other not listed in Table 10 does not convert to the "action" property. Instead, the property converts to the iCalendar/properties property (Section 5.1.1) of the Alert. The following example illustrates how to convert the ACTION property with value DISPLAY: Stepanek Expires 6 May 2027 [Page 31] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VEVENT BEGIN:VALARM ACTION:DISPLAY ... --- JSCalendar: "alerts": { "02E4CAD6-B7A7-4EE4-93A6-4AA5AFD080E2": { "@type": "Alert", "action": "display", "...": "" } } Figure 21: Converting the ACTION property for value DISPLAY The following example illustrates how to convert the ACTION property with value AUDIO: --- iCalendar: BEGIN:VEVENT BEGIN:VALARM ACTION:AUDIO ... --- JSCalendar: "alerts": { "FC529A2B-D10F-461D-BDCF-55C77BB4B933": { "@type": "Alert", "iCalendar": { "@type": "ICalComponent", "name": "valarm", "properties": [ [ "action", {}, "text", "AUDIO" ] ] }, "...": "" } } Figure 22: Converting the ACTION property for value AUDIO Stepanek Expires 6 May 2027 [Page 32] Internet-Draft JSCalendar November 2026 2.3.3. ATTACH The ATTACH property [RFC5545] (Section 3.8.1.1) in a VEVENT, VTODO, PARTICIPANT, VLOCATION, or VCALENDAR component converts to a Link object [JSCALENDAR] (Section 1.5.11). The converted object is set in the Event, Task, Participant, Location, or Group object's "links" property. The "rel" property value is set to "enclosure". The key of the Link object MUST be the value of the JSID parameter (Section 4.2.1), if set. If no JSID parameter is set, then the key MAY be the UUIDv5 generated from the property value (see Section 2.1.3). When converting to iCalendar, implementations MAY omit setting the JSID parameter if the key matches the UUIDv5 of the ATTACH property value and the key is not part of a JSON pointer in any JSPTR parameter value. The ATTACH property value converts to the Link object's "href" property. A value of type URI converts as-is. A value of type BINARY converts to a URI in the "data" URL scheme ([RFC2397]. If the FMTTYPE parameter is set on the ATTACH property, then the parameter value MUST be set in the "mediatype" part of the data URL. The ATTACH property parameters convert as follows: +=====================+=====================+ | iCalendar parameter | JSCalendar property | +=====================+=====================+ | FILENAME | title | +---------------------+---------------------+ | FMTTYPE | contentType | +---------------------+---------------------+ | SIZE | size | +---------------------+---------------------+ Table 11: Parameters of the ATTACH property These parameters are defined in [RFC8607]: FILENAME (Section 4.2), SIZE (Section 4.1); and in [RFC5545]: FMTTYPE (Section 3.2.8). The following example illustrates how to convert the ATTACH property with a URI value: Stepanek Expires 6 May 2027 [Page 33] Internet-Draft JSCalendar November 2026 --- iCalendar: ATTACH:https://example.com/foo.pdf --- JSCalendar: "links": { "245708bf-8e07-5d3b-a5da-2974a63c3b91": { "@type": "Link", "href": "https://example.com/foo.pdf" } } Figure 23: Converting the ATTACH property with URI value The following example illustrates how to convert the ATTACH property with a BINARY value: --- iCalendar: ATTACH;ENCODING=BASE64;VALUE=BINARY;FMTTYPE=application/octet-stream: AAECAwQF --- JSCalendar: "links": { "6c16f063-d57d-5692-8822-2dceec9f9487": { "@type": "Link", "href": "data:application/octet-stream;base64,AAECAwQF", "contentType": "application/octet-stream", "...": "" } } Figure 24: Converting the ATTACH property with BINARY value 2.3.4. ATTENDEE The ATTENDEE property [RFC5545] (Section 3.8.4.1) in a VEVENT or VTODO component converts to a Participant object [JSCALENDAR] (Section 3.4.6). The converted object is set in the Event or Task object's "participants" property. The property value converts to the Participant object's "calendarAddress" property. The key of the Participant object MUST be the value of the JSID parameter (Section 4.2.1), if set. If no JSID parameter is set, then the key MAY be the UUIDv5 generated from the property value (see Section 2.1.3). When converting to iCalendar, implementations MAY omit setting the JSID parameter if the key matches the UUIDv5 of the ATTENDEE property value and the key is not part of a JSON pointer in any JSPTR parameter value. Stepanek Expires 6 May 2027 [Page 34] Internet-Draft JSCalendar November 2026 An ATTENDEE property and a PARTICIPANT component in the same iCalendar component convert to the same Participant object, if their converted "calendarAddress" property values are equal. How to deal with conflicting values is implementation-specific. The ATTENDEE property parameters convert as follows: +=====================+=====================+====================+ | iCalendar parameter | JSCalendar property | Note | +=====================+=====================+====================+ | CN | name | | +---------------------+---------------------+--------------------+ | CUTYPE | kind | ROOM converts to | | | | "location" | +---------------------+---------------------+--------------------+ | DELEGATED-FROM | delegatedFrom | | +---------------------+---------------------+--------------------+ | DELEGATED-TO | delegatedTo | | +---------------------+---------------------+--------------------+ | EMAIL | email | | +---------------------+---------------------+--------------------+ | MEMBER | memberOf | | +---------------------+---------------------+--------------------+ | PARTSTAT | participationStatus | | +---------------------+---------------------+--------------------+ | ROLE | roles | OWNER role defined | | | | in [JSCAL-EXT] | +---------------------+---------------------+--------------------+ | RSVP | expectReply | | +---------------------+---------------------+--------------------+ | SENT-BY | sentBy | | +---------------------+---------------------+--------------------+ Table 12: Parameters of the ATTENDEE property These parameters are defined in [RFC5545]: CN (Section 3.2.2), CUTYPE (Section 3.2.3), DELEGATED-FROM (Section 3.2.4), DELEGATED-TO (Section 3.2.5), MEMBER (Section 3.2.11), PARTSTAT (Section 3.2.12), ROLE (Section 3.2.16), RSVP (Section 3.2.17), SENT-BY (Section 3.2.18); and in [RFC7986]: EMAIL (Section 6.2). The PARTSTAT of an ATTENDEE property in a VTODO component converts not only to the Participant object's "participationStatus" property, but also to its "progress" property if the PARTSTAT parameter value is specific for VTODO components: Stepanek Expires 6 May 2027 [Page 35] Internet-Draft JSCalendar November 2026 +==============+=====================+============+ | PARTSTAT | participationStatus | progress | +==============+=====================+============+ | NEEDS-ACTION | needs-action | | +--------------+---------------------+------------+ | ACCEPTED | accepted | | +--------------+---------------------+------------+ | DECLINED | declined | | +--------------+---------------------+------------+ | TENTATIVE | tentative | | +--------------+---------------------+------------+ | DELEGATED | delegated | | +--------------+---------------------+------------+ | COMPLETED | accepted | completed | +--------------+---------------------+------------+ | IN-PROCESS | accepted | in-process | +--------------+---------------------+------------+ | FAILED | accepted | failed | +--------------+---------------------+------------+ Table 13: Converting the PARTSTAT parameter in a VTODO component to Participant properties These values are defined in [RFC5545]: NEEDS-ACTION, ACCEPTED, DECLINED, TENTATIVE, DELEGATED, COMPLETED, IN-PROCESS (Section 3.2.12); and in [RFC10051]: FAILED (Section 9.1). The following example illustrates how to convert the ATTENDEE property: Stepanek Expires 6 May 2027 [Page 36] Internet-Draft JSCalendar November 2026 --- iCalendar: ATTENDEE;RSVP=TRUE;PARTSTAT=TENTATIVE;CN=Henry Cabot: mailto:hcabot@example.com ORGANIZER:mailto:organizer@example.com --- JSCalendar: "participants": { "0b235cc4-f04d-5fc4-98a3-c066650b3fbf": { "@type": "Participant", "calendarAddress": "mailto:hcabot@example.com", "name": "Henry Cabot", "participationStatus": "tentative", "expectReply": true }, "251d3e9f-d83f-534c-8c45-c2896c75670c": { "@type": "Participant", "calendarAddress": "mailto:organizer@example.com", "roles": { "owner": true } } }, "organizerCalendarAddress": "mailto:organizer@example.com" Figure 25: Converting the ATTENDEE property The following example illustrates how to convert the ATTENDEE property together with a PARTICIPANT component for the same calendar address: Stepanek Expires 6 May 2027 [Page 37] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:PARTICIPANT UID:6CF544E4-BBC7-45A2-97FF-DFD1908CCE40 CALENDAR-ADDRESS:mailto:foo@example.com DESCRIPTION:some description ... END:PARTICIPANT ATTENDEE;RSVP=TRUE;PARTSTAT=TENTATIVE:mailto:foo@example.com ORGANIZER:mailto:organizer@example.com ... --- JSCalendar: "participants": { "59eb121c-e8f2-558a-9049-ef750a5976bd": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "participationStatus": "tentative", "expectReply": true, "description": "some description", "iCalendar": { "@type": "ICalComponent", "name": "participant", "properties": [ [ "uid", {}, "text", "6CF544E4-BBC7-45A2-97FF-DFD1908CCE40" ] ] }, "...": "" }, "251d3e9f-d83f-534c-8c45-c2896c75670c": { "@type": "Participant", "calendarAddress": "mailto:organizer@example.com", "...": "" } }, "organizerCalendarAddress": "mailto:organizer@example.com" Figure 26: Converting the ATTENDEE property and PARTICIPANT component The following example illustrates how to convert the ATTENDEE property with a participation status that is specific to VTODO components: Stepanek Expires 6 May 2027 [Page 38] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VTODO ATTENDEE;RSVP=TRUE;PARTSTAT=COMPLETED:mailto:foo@example.com ORGANIZER:mailto:organizer@example.com ... --- JSCalendar: "@type": "Task", "participants": { "59eb121c-e8f2-558a-9049-ef750a5976bd": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "participationStatus": "accepted", "progress": "completed", "expectReply": true, "...": "" }, "251d3e9f-d83f-534c-8c45-c2896c75670c": { "@type": "Participant", "calendarAddress": "mailto:organizer@example.com", "...": "" } }, "organizerCalendarAddress": "mailto:organizer@example.com" Figure 27: Converting the ATTENDEE property with VTODO-specific PARTSTAT The following example illustrates how to convert the ATTENDEE property with the OWNER role: Stepanek Expires 6 May 2027 [Page 39] Internet-Draft JSCalendar November 2026 --- iCalendar: ATTENDEE;RSVP=TRUE:mailto:foo@example.com ATTENDEE;ROLE=OWNER;RSVP=TRUE:mailto:bar@example.com ORGANIZER:mailto:organizer@example.com --- JSCalendar: "participants": { "59eb121c-e8f2-558a-9049-ef750a5976bd": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "expectReply": true }, "5b6f4fa0-3695-53a7-904b-d0a6f8bc326f": { "@type": "Participant", "calendarAddress": "mailto:bar@example.com", "expectReply": true, "roles": { "owner": true } } }, "organizerCalendarAddress": "mailto:organizer@example.com" Figure 28: Converting the ATTENDEE property with the OWNER role 2.3.5. CALENDAR-ADDRESS The CALENDAR-ADDRESS property [RFC9073] (Section 6.4) in a PARTICIPANT component converts to the "calendarAddress" property [JSCALENDAR] (Section 3.4.6) of the Participant object. Implementations MAY preserve the fact that a Participant object's "calendarAddress" property converted from the CALENDAR-ADDRESS property of a PARTICIPANT component, rather than an ATTENDEE property. In this case, they MUST add an entry for the "calendarAddress" property in the "iCalendar/convertedProperties" property of the Participant object. The following example illustrates how to convert the CALENDAR-ADDRESS property: Stepanek Expires 6 May 2027 [Page 40] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:PARTICIPANT CALENDAR-ADDRESS:mailto:foo@example.com UID:47AD2E1C-49D4-45DF-BD83-8398ACC7D8E2 ... END:PARTICIPANT ORGANIZER:mailto:organizer@example.com ... --- JSCalendar: "participants": { "59eb121c-e8f2-558a-9049-ef750a5976bd": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "iCalendar": { "@type": "ICalComponent", "name": "participant", "convertedProperties": { "calendarAddress": { "@type": "ICalProperty", "name": "calendar-address" } }, "properties": [ [ "uid", {}, "text", "47AD2E1C-49D4-45DF-BD83-8398ACC7D8E2" ] ] } }, "251d3e9f-d83f-534c-8c45-c2896c75670c": { "@type": "Participant", "calendarAddress": "mailto:organizer@example.com", "...": "" } }, "organizerCalendarAddress": "mailto:organizer@example.com" Figure 29: Converting the CALENDAR-ADDRESS property 2.3.6. CATEGORIES The CATEGORIES property [RFC5545] (Section 3.8.1.2) in a VEVENT, VTODO, or VCALENDAR component converts to the "keywords" property [JSCALENDAR] (Section 3.2.10) of the Event, Task, or Group object. Stepanek Expires 6 May 2027 [Page 41] Internet-Draft JSCalendar November 2026 The list of category values converts to a set of keywords. The values convert case-sensitively. All CATEGORIES properties in the same iCalendar component convert to the "keywords" property in the JSCalendar object. The following example illustrates how to convert the CATEGORIES property: --- iCalendar: CATEGORIES:Favorites CATEGORIES:Meeting --- JSCalendar: "keywords": { "Favorites": true, "Meeting": true } Figure 30: Converting the CATEGORIES property 2.3.7. CLASS The CLASS property [RFC5545] (Section 3.8.1.3) in a VEVENT or VTODO component converts to the "privacy" property [JSCALENDAR] (Section 3.4.3) of the Event or Task object. JSCalendar requires all recurrences of a calendar object to have the same "privacy" property value, including recurrence instances for which no base object is given. In contrast, iCalendar supports setting different CLASS property values for recurrence overrides. How to choose the effective CLASS property value for all recurrences when converting to JSCalendar is implementation-specific. One option is to choose the most restrictive classification in any recurrence of a calendar object, where CONFIDENTIAL is the most restrictive, then PRIVATE or an unknown classification, and PUBLIC or the absent CLASS property is the least restrictive. The CLASS property values convert as follows: Stepanek Expires 6 May 2027 [Page 42] Internet-Draft JSCalendar November 2026 +==============+=========+ | CLASS | privacy | +==============+=========+ | PUBLIC | public | +--------------+---------+ | PRIVATE | private | +--------------+---------+ | CONFIDENTIAL | secret | +--------------+---------+ Table 14: Values of the CLASS property Any other value MUST convert to the "private" value. Implementations MAY preserve the original value in the iCalendar/properties property (Section 5.1.1). The following example illustrates how to convert the CLASS property: --- iCalendar: CLASS:PRIVATE --- JSCalendar: "privacy": "private" Figure 31: Converting the CLASS property 2.3.8. COLOR The COLOR property [RFC7986] (Section 5.9) in a VEVENT, VTODO, or VCALENDAR component converts to the "color" property [JSCALENDAR] (Section 3.2.12) of the Event, Task, or Group object. Its value converts verbatim. The following example illustrates how to convert the COLOR property with a color name: --- iCalendar: COLOR:maroon --- JSCalendar: "color": "maroon" Figure 32: Converting the COLOR property with color name The following example illustrates how to convert the COLOR property with a numeric RGB value: Stepanek Expires 6 May 2027 [Page 43] Internet-Draft JSCalendar November 2026 --- iCalendar: COLOR:#ffa07a --- JSCalendar: "color": "#ffa07a" Figure 33: Converting the COLOR property with numeric value 2.3.9. CONCEPT The CONCEPT property [RFC9253] (Section 8.1) in a VEVENT, VTODO, or VCALENDAR component converts to the "categories" property [JSCALENDAR] (Section 3.2.11) of the Event, Task, or Group object. The list of URI values converts to a set of URIs. Multiple occurrences of the CONCEPT property in the same iCalendar component convert to the same "categories" property in the JSCalendar object. The following example illustrates how to convert the CONCEPT property: --- iCalendar: CONCEPT:https://example.com/event-types/arts/music CONCEPT:https://example.com/event-types/arts/literature --- JSCalendar: "categories": { "https://example.com/event-types/arts/music": true, "https://example.com/event-types/arts/literature": true } Figure 34: Converting the CONCEPT property 2.3.10. CONFERENCE The CONFERENCE property [RFC7986] (Section 5.11) in a VEVENT or VTODO component converts to a VirtualLocation object [JSCALENDAR] (Section 3.2.7). The converted object is set in the Event or Task object's "virtualLocations" property. The property value converts to the VirtualLocation object's "uri" property. The key of the VirtualLocation object MUST be the value of the JSID parameter (Section 4.2.1), if set. If no JSID parameter is set, then the key MAY be the UUIDv5 generated from the property value (see Section 2.1.3). When converting to iCalendar, implementations MAY omit setting the JSID parameter if the key matches the UUIDv5 of the CONFERENCE property value and the key is not part of a JSON pointer in any JSPTR parameter value. Stepanek Expires 6 May 2027 [Page 44] Internet-Draft JSCalendar November 2026 The property value converts to the VirtualLocation object's "uri" property. Its parameters convert as follows: +=====================+=====================+ | iCalendar parameter | JSCalendar property | +=====================+=====================+ | FEATURE | features | +---------------------+---------------------+ | LABEL | name | +---------------------+---------------------+ Table 15: Parameters of the CONFERENCE property These parameters are defined in [RFC7986]: FEATURE (Section 6.3), LABEL (Section 6.4). The following example illustrates how to convert the CONFERENCE property: --- iCalendar: CONFERENCE;VALUE=URI;FEATURE=AUDIO,VIDEO; LABEL="Web video chat, access code=76543" :https://chat.example.com/audio?id=123456 --- JSCalendar: "virtualLocations": { "67e4a1e9-cffc-5bd4-9602-1a5dfc8e1626": { "@type": "VirtualLocation", "name": "Web video chat, access code=76543", "uri": "https://chat.example.com/audio?id=123456", "features": { "audio": true, "video": true } } } Figure 35: Converting the CONFERENCE property 2.3.11. COORDINATES The COORDINATES property [JSCAL-EXT] (Section 4.1) in a VLOCATION component converts to the "coordinates" property [JSCALENDAR] (Section 3.2.5) of the Location object. Stepanek Expires 6 May 2027 [Page 45] Internet-Draft JSCalendar November 2026 The following example illustrates how to convert the COORDINATES property: --- iCalendar: BEGIN:VEVENT BEGIN:VLOCATION COORDINATES;VALUE=URI:geo:48.198634,16.371648;crs=wgs84;u=40 ... --- JSCalendar: "locations": { "B995322D-2C00-4DE0-8958-DB6687CF3DB3": { "@type": "Location", "coordinates": "geo:48.198634,16.371648;crs=wgs84;u=40", "...": "" } } Figure 36: Converting the COORDINATES property 2.3.12. CREATED The CREATED property [RFC5545] (Section 3.8.7.1) in a VEVENT, VTODO, or VCALENDAR component converts to the "created" property [JSCALENDAR] (Section 3.1.5) of the Event, Task, or Group object. The following example illustrates how to convert the CREATED property: --- iCalendar: CREATED:20240329T133000Z --- JSCalendar: "created": "2024-03-29T13:30:00Z" Figure 37: Converting the CREATED property 2.3.13. DESCRIPTION The DESCRIPTION property [RFC5545] (Section 3.8.1.5) in a VEVENT, VTODO, VCALENDAR, or PARTICIPANT component converts to the "description" property [JSCALENDAR] (Section 3.2.2) of the Event, Task, Group, or Participant object, unless its DERIVED parameter value is TRUE. Stepanek Expires 6 May 2027 [Page 46] Internet-Draft JSCalendar November 2026 If the DERIVED parameter value is TRUE, then the property does not convert to the "description" property. Instead, a non-derived STYLED-DESCRIPTION property is expected to contain the description. Implementations MAY preserve the property in the "iCalendar" property (Section 5.1.1). The following example illustrates how to convert the DESCRIPTION property: --- iCalendar: DESCRIPTION:Pancakes are delicious\; they are fluffy and sweet. --- JSCalendar: "description": "Pancakes are delicious; they are fluffy and sweet." Figure 38: Converting the DESCRIPTION property 2.3.14. DTEND The DTEND property [RFC5545] (Section 3.8.2.2) in a VEVENT component converts to the "duration" property [JSCALENDAR] (Section 4.1.2) of the Event object. If the value type of the DTEND property is DATE, then the duration is the number of days or weeks between the DTSTART and DTEND property values. If the value type is DATE-TIME, then the duration is the timespan between the DTSTART and DTEND property values when converted to UTC time. If the timezone identifier (Section 2.1.4) of the DTEND property differs from that of the DTSTART property, then it converts to the Event's "endTimeZone" property [JSCALENDAR] (Section 4.1.3). Implementations MAY preserve the fact that the duration got determined by the DTEND property. How to do this depends on the timezone identifiers of the DTSTART and DTEND properties: If the time zone identifiers are not equal, then the presence of the "endTimeZone" property implies that it converted from the DTEND property. If the time zone identifiers are equal, then implementations MAY set the "iCalendar" property (Section 5.1.1) in the Event object and there add an entry for the path "duration" in the "convertedProperties" property. The value MUST be an ICalProperty object with the "name" property set to "dtend". The following example illustrates how to convert the DTEND property with a different timezone than the DTSTART property: Stepanek Expires 6 May 2027 [Page 47] Internet-Draft JSCalendar November 2026 --- iCalendar: DTSTART;TZID=Europe/Berlin:20241017T130000 DTEND;TZID=Asia/Bangkok:20241018T040000 --- JSCalendar: "start": "2024-10-17T13:00:00", "timeZone": "Europe/Berlin", "duration": "PT10H", "endTimeZone": "Asia/Bangkok" Figure 39: Converting the DTEND property with different timezone The following example illustrates how to convert the DTEND property with the same timezone as the DTSTART property: --- iCalendar: DTSTART;TZID=Australia/Melbourne:20241002T130000 DTEND;TZID=Australia/Melbourne:20241002T140000 --- JSCalendar: "start": "2024-10-02T13:00:00", "timeZone": "Australia/Melbourne", "duration": "PT1H", "iCalendar": { "@type": "ICalComponent", "name": "vevent", "convertedProperties": { "duration": { "@type": "ICalProperty", "name": "dtend" } } } Figure 40: Converting the DTEND property with same timezone The following example illustrates how to convert the DTEND property with value type DATE: Stepanek Expires 6 May 2027 [Page 48] Internet-Draft JSCalendar November 2026 --- iCalendar: DTSTART;VALUE=DATE:20240102 DTEND;VALUE=DATE:20240107 --- JSCalendar: "start": "2024-01-02T00:00:00", "duration": "P5D", "showWithoutTime": true, "iCalendar": { "@type": "ICalComponent", "name": "vevent", "convertedProperties": { "duration": { "@type": "ICalProperty", "name": "dtend" } } } Figure 41: Converting the DTEND property with value type DATE 2.3.15. DTSTAMP The DTSTAMP property [RFC5545] (Section 3.8.7.2) in a VEVENT or VTODO component converts to the "updated" property [JSCALENDAR] (Section 3.1.6) of the Event or Task object. The following example illustrates how to convert the DTSTAMP property: Stepanek Expires 6 May 2027 [Page 49] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VCALENDAR METHOD:REPLY BEGIN:VEVENT DTSTAMP:20240304T132000Z ... --- JSCalendar: { "@type": "Group", "entries": [ { "@type": "Event", "method": "reply", "updated": "2024-03-04T13:20:00Z", "...": "" } ], "...": "" } Figure 42: Converting the DTSTAMP property in a VEVENT component 2.3.16. DTSTART The DTSTART property [RFC5545] (Section 3.8.2.4) in a VEVENT or VTODO component converts to the Event or Task object's "start" property (Sections 4.1.1 and 4.2.2 of [JSCALENDAR]). See Section 2.1.5 how to convert DATE and DATE-TIME values. For VEVENT and VTODO components, the timezone identifier (Section 2.1.4) of the DTSTART property converts to the Event or Task object's "timeZone" property [JSCALENDAR] (Section 3.6.1). In addition, if the value type of the DTSTART property is DATE, then the value of the "showWithoutTime" property [JSCALENDAR] (Section 3.2.4) is "true". The following example illustrates how to convert the DTSTART property with a TZID parameter: --- iCalendar: DTSTART;TZID=Europe/Berlin:20240921T105302 --- JSCalendar: "start": "2024-09-21T10:53:02", "timeZone": "Europe/Berlin", "showWithoutTime": false Stepanek Expires 6 May 2027 [Page 50] Internet-Draft JSCalendar November 2026 Figure 43: Converting the DTSTART property with TZID parameter The following example illustrates how to convert the DTSTART property with a UTC time: --- iCalendar: DTSTART:20240921T105302Z --- JSCalendar: "start": "2024-09-21T10:53:02", "timeZone": "Etc/UTC", "showWithoutTime": false Figure 44: Converting the DTSTART property with UTC time The following example illustrates how to convert the DTSTART property with a floating time: --- iCalendar: DTSTART:20240921T105302 --- JSCalendar: "start": "2024-09-21T10:53:02", "showWithoutTime": false Figure 45: Converting the DTSTART property with floating time The following example illustrates how to convert the DTSTART property with value type DATE: --- iCalendar: DTSTART;VALUE=DATE:20240921 --- JSCalendar: "start": "2024-09-21T00:00:00", "showWithoutTime": true Figure 46: Converting the DTSTART property with value type DATE 2.3.17. DUE The DUE property [RFC5545] (Section 3.8.2.3) in a VTODO component converts to the "due" property [JSCALENDAR] (Section 4.2.1) of the Task object. See Section 2.1.5 how to convert DATE and DATE-TIME values. Stepanek Expires 6 May 2027 [Page 51] Internet-Draft JSCalendar November 2026 If the VTODO component does not contain a DTSTART property, then the timezone identifier (Section 2.1.4) of the DUE property converts to the Task object's "timeZone" property [JSCALENDAR] (Section 3.6.1). If it contains both the DUE and DTSTART properties and the timezone identifier of the DUE property differs from that of the DTSTART property, then the "due" date-time property value MUST be relative to the time zone of DTSTART. If the value type of the DUE property is DATE, then the value of the "showWithoutTime" property [JSCALENDAR] (Section 3.2.4) is "true". The following example illustrates how to convert the DUE property with a TZID parameter: --- iCalendar: BEGIN:VTODO DUE;TZID=Europe/Berlin:20240921T105302 ... --- JSCalendar: "@type": "Task", "due": "2024-09-21T10:53:02", "timeZone": "Europe/Berlin", "showWithoutTime": false Figure 47: Converting the DUE property with TZID parameter The following example illustrates how to convert the DUE property with a UTC time: --- iCalendar: BEGIN:VTODO DUE:20240921T105302Z ... --- JSCalendar: "@type": "Task", "due": "2024-09-21T10:53:02", "timeZone": "Etc/UTC", "showWithoutTime": false Figure 48: Converting the DUE property with UTC time The following example illustrates how to convert the DUE property with a floating time: Stepanek Expires 6 May 2027 [Page 52] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VTODO DUE:20240921T105302 ... --- JSCalendar: "@type": "Task", "due": "2024-09-21T10:53:02", "showWithoutTime": false Figure 49: Converting the DUE property with floating time The following example illustrates how to convert the DUE property with value type DATE: --- iCalendar: BEGIN:VTODO DUE;VALUE=DATE:20240921 ... --- JSCalendar: "@type": "Task", "due": "2024-09-21T00:00:00", "showWithoutTime": true Figure 50: Converting the DUE property with value type DATE The following example illustrates how to convert the DUE property with value type DATE in combination with a DTSTART property with value type DATE: --- iCalendar: BEGIN:VTODO DTSTART;VALUE=DATE:20250220 DUE;VALUE=DATE:20250221 ... --- JSCalendar: "@type": "Task", "start": "2025-02-20T00:00:00", "due": "2025-02-21T00:00:00", "showWithoutTime": true Figure 51: Converting the DUE and DTSTART properties with value type DATE Stepanek Expires 6 May 2027 [Page 53] Internet-Draft JSCalendar November 2026 2.3.18. DURATION The DURATION property [RFC5545] (Section 3.8.2.5) in a VEVENT or VTODO component converts to the "duration" property [JSCALENDAR] (Section 4.1.2) of the Event or Task object. The following example illustrates how to convert the DURATION property: --- iCalendar: DURATION:PT1H --- JSCalendar: "duration": "PT1H" Figure 52: Converting the DURATION 2.3.19. ESTIMATED-DURATION The ESTIMATED-DURATION property [RFC10051] (Section 10.1) in a VTODO component converts to the "estimatedDuration" property [JSCALENDAR] (Section 4.2.3) of the Task object. The following example illustrates how to convert the ESTIMATED- DURATION property: --- iCalendar: BEGIN:VTODO ESTIMATED-DURATION:P2D ... --- JSCalendar: "@type": "Task", "estimatedDuration": "P2D" Figure 53: Converting the ESTIMATED-DURATION 2.3.20. EXDATE The EXDATE property [RFC5545] (Section 3.8.5.1) in a VEVENT or VTODO component converts to a PatchObject value [JSCALENDAR] (Section 1.5.9). The converted object is set in the Event or Task object's "recurrenceOverrides" property. Stepanek Expires 6 May 2027 [Page 54] Internet-Draft JSCalendar November 2026 The property value converts to the key in the "recurrenceOverrides" property value. See Section 2.1.5 how to convert DATE and DATE-TIME values. The date-time MUST be relative to the timezone identified by the Event or Task's "timeZone" property. The PatchObject value MUST set the "excluded" member to "true" and MUST NOT set any other property. The following example illustrates how to convert the EXDATE property: --- iCalendar: DTSTART:20230101T130000Z RRULE:FREQ=MONTHLY EXDATE:20230801T130000Z --- JSCalendar: "start": "2023-01-01T13:00:00", "timeZone": "Etc/UTC", "recurrenceRule": { "@type": "RecurrenceRule", "frequency": "monthly" }, "recurrenceOverrides": { "2023-08-01T13:00:00": { "excluded": true } } Figure 54: Converting the EXDATE property 2.3.21. GEO A GEO property with the DERIVED parameter value "TRUE" does not convert to JSCalendar. For non-derived GEO properties, the following rules apply: The GEO property [RFC5545] (Section 3.8.1.6) in a VEVENT or VTODO component converts to a Location object [JSCALENDAR] (Section 3.2.5). If the VEVENT or VTODO component also contains the LOCATION property (Section 2.3.25), then the GEO and LOCATION properties convert to the same Location object. The converted object is set in the Event or Task object's "locations" property. Stepanek Expires 6 May 2027 [Page 55] Internet-Draft JSCalendar November 2026 The key of the Location object MUST be the value of the JSID parameter (Section 4.2.1), if set. If no JSID parameter is set, then the key MAY be the UUIDv5 generated from the property value (see Section 2.1.3). When converting to iCalendar, implementations MAY omit setting the JSID parameter if the key matches the UUIDv5 of the GEO property value and the key is not part of a JSON pointer in any JSPTR parameter value. The GEO property [RFC5545] (Section 3.8.1.6) in a VLOCATION component converts to the "coordinates" property [JSCALENDAR] (Section 3.2.5) of the Location object. The pair of FLOAT values converts to a URI with the "geo" scheme ([RFC5870]). The first FLOAT value converts to the "coord-a" part of the URI, the second FLOAT value to the "coord-b" part. A preceding plus sign (+) of the FLOAT value MUST be omitted, a preceding minus sign (-) MUST be preserved. The optional "coord-c" part of the URI MUST be omitted. Implementations MAY preserve the fact that the coordinates converted from a GEO property by setting the JSON pointer path to the "coordinates" property in the "iCalendar/convertedProperties" property. If the GEO property converted from a VEVENT or VTODO component, then the "iCalendar" property MUST be that of the Event or Task object, for the VLOCATION component it MUST be the Location object's "iCalendar" property. The following example illustrates how to convert the GEO property in a VEVENT component. The JSID parameter is set to simplify testing. Stepanek Expires 6 May 2027 [Page 56] Internet-Draft JSCalendar November 2026 --- iCalendar: GEO;JSID=loc1:45.5;-93.3 --- JSCalendar: "locations": { "loc1": { "@type": "Location", "coordinates": "geo:45.5,-93.3" } }, "iCalendar": { "@type": "ICalComponent", "name": "vevent", "convertedProperties": { "locations/loc1/coordinates": { "@type": "ICalProperty", "name": "geo" } } } Figure 55: Converting the GEO property in a VEVENT The following example illustrates how to convert the GEO and LOCATION properties in a VEVENT component. The JSID parameters are set to simplify testing. Stepanek Expires 6 May 2027 [Page 57] Internet-Draft JSCalendar November 2026 --- iCalendar: LOCATION;JSID=loc1:Taj Mahal GEO;JSID=loc1:27.175;78.041944 --- JSCalendar: "locations": { "loc1": { "@type": "Location", "name": "Taj Mahal", "coordinates": "geo:27.175,78.041944", "...": "" } }, "iCalendar": { "@type": "ICalComponent", "name": "vevent", "convertedProperties": { "locations/loc1/coordinates": { "@type": "ICalProperty", "name": "geo" } } } Figure 56: Converting the GEO and LOCATION properties in a VEVENT The following example illustrates how to convert the GEO property in a VLOCATION component: Stepanek Expires 6 May 2027 [Page 58] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VEVENT BEGIN:VLOCATION NAME:Eiffel Tower GEO:48.858222;2.2945 ... --- JSCalendar: "locations": { "8FC58765-4559-49BC-8718-A5E46FC433B9": { "@type": "Location", "name": "Eiffel Tower", "coordinates": "geo:48.858222,2.2945", "iCalendar": { "@type": "ICalComponent", "name": "vlocation", "convertedProperties": { "coordinates": { "@type": "ICalProperty", "name": "geo" } }, "...": "" } } } Figure 57: Converting the GEO property in a VLOCATION 2.3.22. IMAGE The IMAGE property [RFC7986] (Section 5.10) in a VEVENT, VTODO, VLOCATION, PARTICIPANT, or VCALENDAR component converts to a Link object [JSCALENDAR] (Section 1.5.11). The converted object is set in the Event, Task, Location, Participant, or Group object's "links" property. The "rel" property value is set to "icon". The key of the Link object MUST be the value of the JSID parameter (Section 4.2.1), if set. If no JSID parameter is set, then the key MAY be the UUIDv5 generated from the property value (see Section 2.1.3). When converting to iCalendar, implementations MAY omit setting the JSID parameter if the key matches the UUIDv5 of the IMAGE property value and the key is not part of a JSON pointer in any JSPTR parameter value. The IMAGE property value converts to the Link object's "href" property. A value of type URI converts as-is. See Section 2.3.3 how to convert a BINARY value. Stepanek Expires 6 May 2027 [Page 59] Internet-Draft JSCalendar November 2026 Its parameters convert as follows: +=====================+=====================+ | iCalendar parameter | JSCalendar property | +=====================+=====================+ | DISPLAY | display | +---------------------+---------------------+ | FILENAME | title | +---------------------+---------------------+ | FMTTYPE | contentType | +---------------------+---------------------+ | SIZE | size | +---------------------+---------------------+ Table 16: Parameters of the IMAGE property These parameters are defined in [RFC7986]: DISPLAY (Section 6.1); and in [RFC8607]: FILENAME (Section 4.2), SIZE (Section 4.1); and in [RFC5545]: FMTTYPE (Section 3.2.8). The following example illustrates how to convert the IMAGE property: --- iCalendar: IMAGE;VALUE=URI;DISPLAY=BADGE,THUMBNAIL;FILENAME=An image; FMTTYPE=image/png:https://example.com/images/party.png --- JSCalendar: "links": { "2c42ac17-1eaf-5a75-a216-aef848785d79": { "@type": "Link", "href": "https://example.com/images/party.png", "rel": "icon", "display": { "badge": true, "thumbnail": true }, "contentType": "image/png", "title": "An image" } } Figure 58: Converting the IMAGE property 2.3.23. LAST-MODIFIED The LAST-MODIFIED property [RFC5545] (Section 3.8.7.3) in a VCALENDAR component converts to the "updated" property [JSCALENDAR] (Section 3.1.6) of the Group object. Stepanek Expires 6 May 2027 [Page 60] Internet-Draft JSCalendar November 2026 The LAST-MODIFIED property [RFC5545] (Section 3.8.7.3) in a VEVENT or VTODO component does _not_ convert to the "updated" property [JSCALENDAR] (Section 3.1.6) of the Event or Task object. Implementations MAY instead preserve the LAST-MODIFIED property in the "iCalendar" property. The following example illustrates how to convert the LAST-MODIFIED property: --- iCalendar: BEGIN:VCALENDAR LAST-MODIFIED:20240914T231257Z ... --- JSCalendar: "@type": "Group", "updated": "2024-09-14T23:12:57Z" Figure 59: Converting the IMAGE property 2.3.24. LINK A LINK property [RFC9253] (Section 8.2) with value type URI in a VEVENT, VTODO, PARTICIPANT, VLOCATION, or VCALENDAR component converts to a Link object [JSCALENDAR] (Section 1.5.11). The converted object is set in the Event, Task, Participant, Location, or Group object's "links" property. The key of the Link object MUST be the value of the JSID parameter (Section 4.2.1), if set. If no JSID parameter is set, then the key MAY be the UUIDv5 generated from the property value (see Section 2.1.3). When converting to iCalendar, implementations MAY omit setting the JSID parameter if the key matches the UUIDv5 of the LINK property value and the key is not part of a JSON pointer in any JSPTR parameter value. The LINK property value converts to the Link object's "href" property. The LINK property parameters convert as follows: Stepanek Expires 6 May 2027 [Page 61] Internet-Draft JSCalendar November 2026 +=====================+=====================+ | iCalendar parameter | JSCalendar property | +=====================+=====================+ | FMTTYPE | contentType | +---------------------+---------------------+ | LABEL | title | +---------------------+---------------------+ | LINKREL | rel | +---------------------+---------------------+ Table 17: Parameters of the LINK property These parameters are defined in [RFC5545]: FMTTYPE (Section 3.2.8); and in [RFC7986]: LABEL (Section 6.4); and in [RFC9253]: LINKREL (Section 6.1). A LINK property with any other value type does not convert to a standard JSCalendar element. Implementations MAY convert it to the "iCalendar" property (Section 5.1.1). The following example illustrates how to convert the LINK property: --- iCalendar: LINK;LINKREL="https://example.com/linkrel/source";LABEL=Venue; VALUE=URI:https://example.com/events --- JSCalendar: "links": { "63023b12-fcf4-53fa-841d-8c1684b9f80b": { "@type": "Link", "href": "https://example.com/events", "title": "Venue", "rel": "https://example.com/linkrel/source" } } Figure 60: Converting the LINK property 2.3.25. LOCATION The LOCATION property [RFC5545] (Section 3.8.1.7) in a VEVENT or VTODO component converts to a Location object [JSCALENDAR] (Section 3.2.5), unless its DERIVED parameter value is TRUE. The converted object is set in the Event or Task's "locations" property. The key of the Location object MUST be the value of the JSID parameter (Section 4.2.1), if set. If no JSID parameter is set, then the key MAY be the UUIDv5 generated from the property value (see Stepanek Expires 6 May 2027 [Page 62] Internet-Draft JSCalendar November 2026 Section 2.1.3). When converting to iCalendar, implementations MAY omit setting the JSID parameter if the key matches the UUIDv5 of the LOCATION property value and the key is not part of a JSON pointer in any JSPTR parameter value. The LOCATION property value converts to the Location object's "title" property. If the calendar component contains multiple VLOCATION components, then the LOCATION property also converts to the Event or Task object's "mainLocationId" property. If the LOCATION property does not have the DERIVED parameter set to TRUE, then the "mainLocationId" is set to the key of the Location object of the LOCATION property. If instead the LOCATION property is derived and its property value matches the NAME property value of a VLOCATION component, then the "mainLocationId" is the identifier of the Location object of that VLOCATION component. The following example illustrates how to convert the LOCATION property: --- iCalendar: LOCATION:Conference Room - F123\, Bldg. 002 --- JSCalendar: "locations": { "adde7a5b-2fb5-52aa-b760-595ea9edb80a": { "@type": "Location", "name": "Conference Room - F123, Bldg. 002", "...": "" } } Figure 61: Converting the LOCATION property The following example illustrates how to convert the LOCATION property and multiple VLOCATION components: Stepanek Expires 6 May 2027 [Page 63] Internet-Draft JSCalendar November 2026 --- iCalendar: LOCATION;DERIVED=TRUE:Fred's Bar BEGIN:VLOCATION UID:12D2B3EC-AC84-4B70-9EB6-CFE6AD5830B0 NAME:Fred's Bar LOCATION-TYPE:bar ... END:VLOCATION BEGIN:VLOCATION UID:6B1C3968-38D2-46AF-B436-BF3F72D459D4 NAME:XYZ Parking LOCATION-TYPE:parking COORDINATES;VALUE=URI:geo:40.71427,-74.00597 ... END:VLOCATION ... --- JSCalendar: "locations": { "12D2B3EC-AC84-4B70-9EB6-CFE6AD5830B0": { "@type": "Location", "name": "Fred's Bar", "locationTypes": { "bar": true }, "...": "" }, "6B1C3968-38D2-46AF-B436-BF3F72D459D4": { "@type": "Location", "name": "XYZ Parking", "locationTypes": { "parking": true }, "coordinates": "geo:40.71427,-74.00597", "...": "" } }, "mainLocationId": "12D2B3EC-AC84-4B70-9EB6-CFE6AD5830B0" Figure 62: Converting the LOCATION property and multiple VLOCATION components 2.3.26. LOCATION-TYPE The LOCATION-TYPE property [RFC9073] (Section 6.1) in a VLOCATION component converts to the "locationTypes" property [JSCALENDAR] (Section 3.2.5) of the Location object. Stepanek Expires 6 May 2027 [Page 64] Internet-Draft JSCalendar November 2026 The list of location type values converts to a set of location types. The values convert case-sensitively. All LOCATION-TYPE properties in the same VLOCATION convert to the "locationTypes" property in the Location object. The following example illustrates how to convert the LOCATION-TYPE property: --- iCalendar: BEGIN:VEVENT BEGIN:VLOCATION LOCATION-TYPE:hotel,restaurant ... --- JSCalendar: "locations": { "0EA3F99A-835E-49CC-970C-8A4707A4C076": { "@type": "Location", "locationTypes": { "hotel": true, "restaurant": true }, "...": "" } } Figure 63: Converting the LOCATION property 2.3.27. METHOD The METHOD property [RFC5545] (Section 3.7.2) in a VCALENDAR component converts to the "method" property [JSCALENDAR] (Section 3.1.8) of all Event or Task objects that are listed in the Group object's "entries" property. The property value converts in lowercase. The following example illustrates how to convert the METHOD property: Stepanek Expires 6 May 2027 [Page 65] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VCALENDAR METHOD:REQUEST BEGIN:VEVENT ... --- JSCalendar: { "@type": "Group", "entries": [ { "@type": "Event", "method": "request", "...": "" } ], "...": "" } Figure 64: Converting the METHOD property 2.3.28. NAME The NAME property [RFC7986] (Section 5.1) in a VLOCATION component converts to the Location [JSCALENDAR] (Section 3.2.5) object's "name" property. The NAME property [RFC7986] (Section 5.1) in a VCALENDAR component converts to the "title" property [JSCALENDAR] (Section 3.2.1) of the Group object. If the LANGUAGE parameter is set, then the parameter value converts to the "locale" property [JSCALENDAR] (Section 3.2.9) of the same object. The following example illustrates how to convert the NAME property in a VCALENDAR component: --- iCalendar: BEGIN:VCALENDAR NAME;LANGUAGE=de:Feiertage Deutschland 2025 ... --- JSCalendar: { "@type": "Group", "title": "Feiertage Deutschland 2025", "locale": "de", "...": "" } Stepanek Expires 6 May 2027 [Page 66] Internet-Draft JSCalendar November 2026 Figure 65: Converting the NAME property in a VCALENDAR The following example illustrates how to convert the NAME property in a VLOCATION component: --- iCalendar: BEGIN:VEVENT BEGIN:VLOCATION NAME:Room B ... END:VLOCATION ... --- JSCalendar: "locations": { "8DE8404B-3BFA-443F-92B4-C678AD0F67DB": { "@type": "Location", "name": "Room B", "iCalendar": { "@type": "ICalComponent", "name": "vlocation" } } } Figure 66: Converting the NAME property in a VLOCATION 2.3.29. ORGANIZER The ORGANIZER property [RFC5545] (Section 3.8.4.3) in a VEVENT or VTODO component converts to the "organizerCalendarAddress" property [JSCALENDAR] (Section 3.4.4) of the Event or Task object. It also converts to a Participant object in the "participants" property [JSCALENDAR] (Section 3.4.6), if any of its parameters convert to a Participant object property (see Table 18), or if none of the ATTENDEE properties in the iCalendar component have the ROLE parameter set to "OWNER". The ORGANIZER property value converts to the Participant's "calendarAddress" property, the "owner" role is set in Participant "roles" property. The key of the Participant object MUST be the value of the JSID parameter (Section 4.2.1), if set. If no JSID parameter is set, then the key MAY be the UUIDv5 generated from the ORGANIZER property value (see Section 2.1.3). When converting to iCalendar, implementations MAY omit setting the JSID parameter if the key matches the UUIDv5 of the ORGANIZER property value and the key is not part of a JSON pointer in any JSPTR parameter value. Stepanek Expires 6 May 2027 [Page 67] Internet-Draft JSCalendar November 2026 The ORGANIZER property parameters convert to the Participant object as follows: +=====================+=====================+ | iCalendar parameter | JSCalendar property | +=====================+=====================+ | CN | name | +---------------------+---------------------+ | EMAIL | email | +---------------------+---------------------+ | SENT-BY | sentBy | +---------------------+---------------------+ Table 18: Parameters of the ORGANIZER property These parameters are defined in [RFC5545]: CN (Section 3.2.2), SENT- BY (Section 3.2.18); and in [RFC7986]: EMAIL (Section 6.2). In addition, the SENT-BY parameter also converts to the "sentBy" property [JSCALENDAR] (Section 3.4.5) in the Event or Task object. An ORGANIZER property, an ATTENDEE property, and a PARTICIPANT component in the same iCalendar component all convert to the same Participant object, if their converted "calendarAddress" property values are equal. How to deal with conflicting property values is implementation-specific. The following example illustrates how to convert the ORGANIZER property: Stepanek Expires 6 May 2027 [Page 68] Internet-Draft JSCalendar November 2026 --- iCalendar: ORGANIZER:mailto:organizer@example.com ATTENDEE;RSVP=TRUE:mailto:foo@example.com --- JSCalendar: "organizerCalendarAddress": "mailto:organizer@example.com", "participants": { "251d3e9f-d83f-534c-8c45-c2896c75670c": { "@type": "Participant", "calendarAddress": "mailto:organizer@example.com", "roles": { "owner": true } }, "59eb121c-e8f2-558a-9049-ef750a5976bd": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "expectReply": true, "...": "" } } Figure 67: Converting the ORGANIZER property The following example illustrates how to convert the ORGANIZER property together with an ATTENDEE property for the same calendar address: Stepanek Expires 6 May 2027 [Page 69] Internet-Draft JSCalendar November 2026 --- iCalendar: ORGANIZER;CN=Jane Doe:mailto:organizer@example.com ATTENDEE;PARTSTAT=ACCEPTED;CN=Jane Doe:mailto:organizer@example.com ATTENDEE;RSVP=TRUE;PARTSTAT=TENTATIVE:mailto:foo@example.com --- JSCalendar: "organizerCalendarAddress": "mailto:organizer@example.com", "participants": { "251d3e9f-d83f-534c-8c45-c2896c75670c": { "@type": "Participant", "calendarAddress": "mailto:organizer@example.com", "name": "Jane Doe", "participationStatus": "accepted", "roles": { "owner": true } }, "59eb121c-e8f2-558a-9049-ef750a5976bd": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "expectReply": true, "participationStatus": "tentative", "...": "" } } Figure 68: Converting the ORGANIZER and related ATTENDEE property The following example illustrates how to convert the ORGANIZER property with a CN parameter if another participant has the OWNER role: Stepanek Expires 6 May 2027 [Page 70] Internet-Draft JSCalendar November 2026 --- iCalendar: ORGANIZER;CN=Jane Doe:mailto:organizer@example.com ATTENDEE;ROLE=OWNER;RSVP=TRUE:mailto:foo@example.com --- JSCalendar: "organizerCalendarAddress": "mailto:organizer@example.com", "participants": { "251d3e9f-d83f-534c-8c45-c2896c75670c": { "@type": "Participant", "calendarAddress": "mailto:organizer@example.com", "name": "Jane Doe", "roles": { "owner": true } }, "59eb121c-e8f2-558a-9049-ef750a5976bd": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "expectReply": true, "roles": { "owner": true }, "...": "" } } Figure 69: Converting the ORGANIZER property with CN parameter and another owner The following example illustrates how to convert the ORGANIZER property if another participant has the OWNER role: Stepanek Expires 6 May 2027 [Page 71] Internet-Draft JSCalendar November 2026 --- iCalendar: ORGANIZER:mailto:organizer@example.com ATTENDEE;ROLE=OWNER;RSVP=TRUE:mailto:foo@example.com --- JSCalendar: "organizerCalendarAddress": "mailto:organizer@example.com", "participants": { "59eb121c-e8f2-558a-9049-ef750a5976bd": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "expectReply": true, "roles": { "owner": true }, "...": "" } } Figure 70: Converting the ORGANIZER property with another owner 2.3.30. PERCENT-COMPLETE The PERCENT-COMPLETE property [RFC5545] (Section 3.8.1.8) in a VTODO component converts to the "percentComplete" property [JSCALENDAR] (Section 4.2.4) of the Task object. The following example illustrates how to convert the PERCENT-COMPLETE property: --- iCalendar: BEGIN:VCALENDAR BEGIN:VTODO PERCENT-COMPLETE:53 ... --- JSCalendar: { "@type": "Group", "entries": [ { "@type": "Task", "percentComplete": 53, "...": "" } ], "...": "" } Stepanek Expires 6 May 2027 [Page 72] Internet-Draft JSCalendar November 2026 Figure 71: Converting the PERCENT-COMPLETE property in a VTODO component 2.3.31. PRIORITY The PRIORITY property [RFC5545] (Section 3.8.1.9) in a VEVENT or VTODO component converts to the "priority" property [JSCALENDAR] (Section 3.4.1) of the Event or Task object. The following example illustrates how to convert the PRIORITY property: --- iCalendar: PRIORITY:3 --- JSCalendar: "priority": 3 Figure 72: Converting the PRIORITY property 2.3.32. PRODID The PRODID property [RFC5545] (Section 3.7.3) in a VCALENDAR component converts to the Group object's "prodId" property [JSCALENDAR] (Section 3.1.4). Implementations MAY additionally convert it also to the "prodId" property of all Event or Task objects that are listed in the Group object's "entries" property. The property value converts verbatim. The following example illustrates how to convert the PRODID property: Stepanek Expires 6 May 2027 [Page 73] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VCALENDAR PRODID:-//BAZ//bam//EN BEGIN:VEVENT ... --- JSCalendar: { "@type": "Group", "prodId": "-//BAZ//bam//EN", "entries": [ { "@type": "Event", "prodId": "-//BAZ//bam//EN", "...": "" } ], "...": "" } Figure 73: Converting the PRODID property 2.3.33. RDATE A RDATE property [RFC5545] (Section 3.8.5.2) in a VEVENT or VTODO component converts to a PatchObject value [JSCALENDAR] (Section 1.5.9). The converted object is set in the Event or Task object's "recurrenceOverrides" property. The property value converts to the key in the "recurrenceOverrides" property value, for values of type PERIOD this only applies to the period start. The date-time value MUST be relative to the timezone identified by the Event or Task object's "timeZone" property [JSCALENDAR] (Section 3.6.1), see Section 2.1.5 how to convert DATE and DATE-TIME values. The duration of a PERIOD converts to the PatchObject's "duration" property, otherwise the PatchObject value MUST be an empty JSON object. Implementations MAY indicate that the recurrence override was converted from an RDATE in the iCalendar (Section 5.1.1) property. The following example illustrates how to convert the RDATE property with value type DATE-TIME: Stepanek Expires 6 May 2027 [Page 74] Internet-Draft JSCalendar November 2026 --- iCalendar: DTSTART:20230101T130000Z RRULE:FREQ=MONTHLY RDATE:20230805T170000Z --- JSCalendar: "start": "2023-01-01T13:00:00", "timeZone": "Etc/UTC", "recurrenceRule": { "@type": "RecurrenceRule", "frequency": "monthly" }, "recurrenceOverrides": { "2023-08-05T17:00:00": {} } Figure 74: Converting the RDATE property The following example illustrates how to convert the RDATE property with value type PERIOD: Stepanek Expires 6 May 2027 [Page 75] Internet-Draft JSCalendar November 2026 --- iCalendar: DTSTART:20230101T130000Z DURATION:PT1H RRULE:FREQ=MONTHLY RDATE;VALUE=PERIOD:20231223T150000Z/PT2H --- JSCalendar: "start": "2023-01-01T13:00:00", "duration": "PT1H", "timeZone": "Etc/UTC", "recurrenceRule": { "@type": "RecurrenceRule", "frequency": "monthly" }, "recurrenceOverrides": { "2023-12-23T15:00:00": { "duration": "PT2H" } }, "iCalendar": { "@type": "ICalComponent", "convertedProperties": { "recurrenceOverrides/2023-12-23T15:00:00": { "@type": "ICalProperty", "name": "rdate", "valueType": "period" } }, "...": "" } Figure 75: Converting the RDATE property with value type PERIOD 2.3.34. RECURRENCE-ID The RECURRENCE-ID property [RFC5545] (Section 3.8.4.4) in a VEVENT or VTODO component converts to the "recurrenceId" property [JSCALENDAR] (Section 3.3.1) of the Event or Task object. The timezone identifier (Section 2.1.4) of the RECURRENCE-ID property converts to the "recurrenceIdTimeZone" property [JSCALENDAR] (Section 3.3.2). See Section 2.1.5 how to convert DATE and DATE-TIME values. The RANGE parameter [RFC5545] (Section 3.2.13) does not convert to a standard JSCalendar element. Implementations MAY preserve it in the iCalendar (Section 5.1.1) property. See Section 2.1.2 for further requirements and examples. Stepanek Expires 6 May 2027 [Page 76] Internet-Draft JSCalendar November 2026 2.3.35. RELATED-TO The RELATED-TO property [RFC5545] (Section 3.8.4.5) in a VEVENT, VTODO, or VALARM component converts to a Relation object [JSCALENDAR] (Section 1.5.10). The converted object is set in the "relatedTo" property of the Event or Task object [JSCALENDAR] (Section 3.1.3), or the Alert object [JSCALENDAR] (Section 3.5.1). The property value in a VEVENT or VTODO converts as-is to the id of the Relation object in the "relatedTo" property. The property value in a VALARM converts to the same value as the id of that Alert object, which represents the VALARM component having that property value set in the UID property. Any RELTYPE parameters convert to the "relation" property in that Relation object. The parameter values convert in lowercase. The following example illustrates how to convert the RELATED-TO property in a VEVENT component: --- iCalendar: BEGIN:VEVENT RELATED-TO;RELTYPE=CHILD:4E05861C-A0C9-46AC-9A66-760FC1E0E167 RELATED-TO:4120A9B1-1133-4AC0-9185-C4C8396048ED ... --- JSCalendar: "relatedTo": { "4E05861C-A0C9-46AC-9A66-760FC1E0E167": { "@type": "Relation", "relation": { "child": true } }, "4120A9B1-1133-4AC0-9185-C4C8396048ED": { "@type": "Relation" } } Figure 76: Converting the RELATED-TO property in a VEVENT The following example illustrates how to convert the RELATED-TO property in a VALARM component: Stepanek Expires 6 May 2027 [Page 77] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VEVENT ... BEGIN:VALARM UID:8297C37D-BA2D-4476-91AE-C1EAA364F8E1 JSID:alert1 TRIGGER:-PT15M DESCRIPTION:Event reminder ACTION:DISPLAY ACKNOWLEDGED:20210302T151514Z END:VALARM ... BEGIN:VALARM UID:DE7B5C34-83FF-47FE-BE9E-FF41AE6DD097 JSID:alert2 TRIGGER;VALUE=DATE-TIME:20210302T152000Z RELATED-TO;RELTYPE=SNOOZE:8297C37D-BA2D-4476-91AE-C1EAA364F8E1 DESCRIPTION:Event reminder ACTION:DISPLAY END:VALARM ... --- JSCalendar: "alerts": { "alert1": { "@type": "Alert", "trigger": { "@type": "OffsetTrigger", "offset": "-PT15M" }, "acknowledged": "2021-03-02T15:15:14Z", "iCalendar": { "@type": "ICalComponent", "name": "valarm", "properties": [ [ "description", {}, "text", "Event reminder" ], [ "uid", {}, "text", "8297C37D-BA2D-4476-91AE-C1EAA364F8E1" ] ] Stepanek Expires 6 May 2027 [Page 78] Internet-Draft JSCalendar November 2026 }, "...": "" }, "alert2": { "@type": "Alert", "trigger": { "@type": "AbsoluteTrigger", "when": "2021-03-02T15:20:00Z" }, "relatedTo": { "alert1": { "@type": "Relation", "relation": { "snooze": true } } }, "iCalendar": { "@type": "ICalComponent", "name": "valarm", "properties": [ [ "description", {}, "text", "Event reminder" ], [ "uid", {}, "text", "DE7B5C34-83FF-47FE-BE9E-FF41AE6DD097" ] ] }, "...": "" } } Figure 77: Converting the RELATED-TO property in a VALARM 2.3.36. RRULE The RRULE property [RFC5545] (Section 3.8.5.3) in a VEVENT or VTODO component converts to a RecurrenceRule object [JSCALENDAR] (Section 3.3.3). The converted object is set in the Event or Task object's "recurrenceRule" property. Stepanek Expires 6 May 2027 [Page 79] Internet-Draft JSCalendar November 2026 The RECUR value type converts to a RecurrenceRule object as follows: +=======================+====================================+ | iCalendar RRULE field | JSCalendar RecurrenceRule property | +=======================+====================================+ | FREQ | frequency | +-----------------------+------------------------------------+ | UNTIL | until | +-----------------------+------------------------------------+ | COUNT | count | +-----------------------+------------------------------------+ | INTERVAL | interval | +-----------------------+------------------------------------+ | BYSECOND | bySecond | +-----------------------+------------------------------------+ | BYMINUTE | byMinute | +-----------------------+------------------------------------+ | BYHOUR | byHour | +-----------------------+------------------------------------+ | BYDAY | byDay | +-----------------------+------------------------------------+ | BYMONTHDAY | byMonthDay | +-----------------------+------------------------------------+ | BYYEARDAY | byYearDay | +-----------------------+------------------------------------+ | BYWEEKNO | byWeekNo | +-----------------------+------------------------------------+ | BYMONTH | byMonth | +-----------------------+------------------------------------+ | BYSETPOS | bySetPosition | +-----------------------+------------------------------------+ | WKST | firstDayOfWeek | +-----------------------+------------------------------------+ | RSCALE [RFC7529] | rscale | +-----------------------+------------------------------------+ | SKIP [RFC7529] | skip | +-----------------------+------------------------------------+ Table 19: Converting the RECUR value type to a RecurrenceRule object The string values of the FREQ, WKST, RSCALE convert to lowercase. The UNTIL part in a VEVENT or VTODO converts to a LocalDateTime value relative to the timezone of the Event or Task object. The following example illustrates how to convert the RRULE property: Stepanek Expires 6 May 2027 [Page 80] Internet-Draft JSCalendar November 2026 --- iCalendar: DTSTART;TZID=Europe/Berlin:20240101T010000 RRULE:FREQ=YEARLY ;INTERVAL=2 ;BYMONTH=1 ;BYDAY=SU ;BYHOUR=8,9 ;BYMINUTE=30 ;UNTIL=20240930T120000Z --- JSCalendar: "recurrenceRule": { "@type": "RecurrenceRule", "frequency": "yearly", "interval": 2, "byMonth": [ "1" ], "byDay": [ { "@type": "NDay", "day": "su" } ], "byHour": [ 8, 9 ], "byMinute": [ 30 ], "until": "2024-09-30T14:00:00" }, "start": "2024-01-01T01:00:00", "timeZone": "Europe/Berlin" Figure 78: Example for converting the RRULE property 2.3.37. SEQUENCE The SEQUENCE property [RFC5545] (Section 3.8.7.4) in a VEVENT or VTODO component converts to the "sequence" property [JSCALENDAR] (Section 3.1.7) of the Event or Task object. The following example illustrates how to convert the SEQUENCE property: Stepanek Expires 6 May 2027 [Page 81] Internet-Draft JSCalendar November 2026 --- iCalendar: SEQUENCE:3 --- JSCalendar: "sequence": 3 Figure 79: Example for converting the SEQUENCE property 2.3.38. SHOW-WITHOUT-TIME The SHOW-WITHOUT-TIME property [JSCAL-EXT] (Section 4.2) in a VEVENT or VTODO component converts to the "showWithoutTime" property [JSCALENDAR] (Section 3.2.4) of the Event or Task object. As outlined in the definition of the SHOW-WITHOUT-TIME property, the property MUST be ignored if the temporal value type of the VEVENT or VTODO component is DATE, or if the property value is "FALSE". The following example illustrates how to convert the SHOW-WITHOUT- TIME property: --- iCalendar: DTSTART;TZID=America/Chicago:20250521T080000 DURATION:PT12H SHOW-WITHOUT-TIME;VALUE=BOOLEAN:TRUE --- JSCalendar: "start": "2025-05-21T08:00:00", "timeZone": "America/Chicago", "duration": "PT12H", "showWithoutTime": true Figure 80: Example for converting the SHOW-WITHOUT-TIME property 2.3.39. STATUS The STATUS property [RFC5545] (Section 3.8.1.11) in a VEVENT component converts to the "status" property [JSCALENDAR] (Section 4.1.4) of the Event object. The STATUS property in a VTODO component converts to the "progress" property [JSCALENDAR] (Section 4.2.5) of the Task object. The property value converts in lowercase. The following example illustrates how to convert the STATUS property in a VEVENT component: Stepanek Expires 6 May 2027 [Page 82] Internet-Draft JSCalendar November 2026 --- iCalendar: STATUS:TENTATIVE --- JSCalendar: "status": "tentative" Figure 81: Converting the STATUS property in a VEVENT The following example illustrates how to convert the STATUS property in a VTODO component: --- iCalendar: BEGIN:VTODO STATUS:IN-PROCESS ... --- JSCalendar: { "@type": "Task", "progress": "in-process", "...": "" } Figure 82: Converting the STATUS property in a VTODO 2.3.40. SOURCE The SOURCE property [RFC7986] (Section 5.8) in a VCALENDAR component converts to the "source" property [JSCALENDAR] (Section 4.3.2) of the Group object. The following example illustrates how to convert the SOURCE property: --- iCalendar: BEGIN:VCALENDAR SOURCE;VALUE=URI:https://example.com/holidays.ics ... --- JSCalendar: { "@type": "Group", "source": "https://example.com/holidays.ics", "...": "" } Figure 83: Example for converting the SOURCE property Stepanek Expires 6 May 2027 [Page 83] Internet-Draft JSCalendar November 2026 2.3.41. STYLED-DESCRIPTION The STYLED-DESCRIPTION property [RFC9073] (Section 6.5) in a PARTICIPANT, VEVENT or VTODO component converts to the "description" property [JSCALENDAR] (Section 3.2.2) of the Participant, Event or Task object under the following conditions: * The property value type MUST be TEXT. * The FMTTYPE parameter either MUST NOT be set, or its value MUST be a media type [RFC6838] with top-level type "text". * Its DERIVED parameter value MUST NOT be TRUE. If the value is TRUE, then another property in the same component is expected to contain the description. If these conditions are not met, implementations MAY preserve the property in the "iCalendar" property (Section 5.1.1). Its FMTTYPE parameter [RFC5545] (Section 3.2.8) converts to the "descriptionContentType" property [JSCALENDAR] (Section 3.2.3). The following example illustrates how to convert the STYLED- DESCRIPTION property: --- iCalendar: STYLED-DESCRIPTION;VALUE=TEXT;FMTTYPE=text/html: hello\,world --- JSCalendar: "description": "hello,world", "descriptionContentType": "text/html" Figure 84: Converting the STYLED-DESCRIPTION property 2.3.42. SUMMARY The SUMMARY property [RFC5545] (Section 3.8.1.12) in a VEVENT or VTODO component converts to the "title" property [JSCALENDAR] (Section 3.2.1) of the Event or Task object. If the LANGUAGE parameter is set, then the parameter value converts to the "locale" property [JSCALENDAR] (Section 3.2.9) of the same object. The SUMMARY property [RFC5545] (Section 3.8.1.12) in a PARTICIPANT component converts to the "name" property [JSCALENDAR] (Section 3.4.6) of the Participant object. Stepanek Expires 6 May 2027 [Page 84] Internet-Draft JSCalendar November 2026 The following example illustrates how to convert the SUMMARY property in a VEVENT component: --- iCalendar: SUMMARY:Birthday Party --- JSCalendar: "title": "Birthday Party" Figure 85: Converting the SUMMARY property in a VEVENT The following example illustrates how to convert the SUMMARY property with a LANGUAGE parameter: --- iCalendar: SUMMARY;LANGUAGE=fr:Fête d'anniversaire --- JSCalendar: "title": "Fête d'anniversaire", "locale": "fr" Figure 86: Converting the SUMMARY property with LANGUAGE parameter The following example illustrates how to convert the SUMMARY property in a PARTICIPANT component: --- iCalendar: BEGIN:VEVENT BEGIN:PARTICIPANT SUMMARY:John ... --- JSCalendar: "participants": { "858DA9AE-695B-43CD-BA4E-294C945356BC": { "@type": "Participant", "name": "John", "...": "" } } Figure 87: Converting the SUMMARY property in a PARTICIPANT 2.3.43. TRANSP The TRANSP property [RFC5545] (Section 3.8.2.7) in a VEVENT or VTODO component converts to the "freeBusyStatus" property [JSCALENDAR] (Section 3.4.2) of the Event or Task object. Stepanek Expires 6 May 2027 [Page 85] Internet-Draft JSCalendar November 2026 Its values convert as follows: +=============+================+ | TRANSP | freeBusyStatus | +=============+================+ | OPAQUE | busy | +-------------+----------------+ | TRANSPARENT | free | +-------------+----------------+ Table 20: Values of the TRANSP property The following example illustrates how to convert the TRANSP property: --- iCalendar: TRANSP:TRANSPARENT --- JSCalendar: "freeBusyStatus": "free" Figure 88: Converting the TRANSP property 2.3.44. TRIGGER The TRIGGER property [RFC5545] (Section 3.8.6.3) in a VALARM component converts to either an AbsoluteTrigger or OffsetTrigger object. The converted object is set in the "trigger" property [JSCALENDAR] (Section 3.5.1) of the Alert object. A property of value type DURATION converts an OffsetTrigger object. The property value converts to its "offset" property. A value of type DATE-TIME converts to an AbsoluteTrigger object. The property value converts to its "when" property. Its parameters convert as follows: +=====================+=====================+===================+ | iCalendar parameter | JSCalendar property | Note | +=====================+=====================+===================+ | RELATED | relativeTo | If VALUE=DURATION | +---------------------+---------------------+-------------------+ Table 21: Parameters of the TRIGGER property These parameters are defined in [RFC5545]: RELATED (Section 3.2.14). Stepanek Expires 6 May 2027 [Page 86] Internet-Draft JSCalendar November 2026 The following example illustrates how to convert the TRIGGER property to an OffsetTrigger object: --- iCalendar: BEGIN:VEVENT ... BEGIN:VALARM TRIGGER;RELATED=END:PT5M ... --- JSCalendar: "alerts": { "2D3D674B-E3E4-4C63-BBF5-4582ED49BCB7": { "@type": "Alert", "trigger": { "@type": "OffsetTrigger", "offset": "PT5M", "relativeTo": "end" }, "...": "" } } Figure 89: Converting the TRIGGER property to an OffsetTrigger The following example illustrates how to convert the TRIGGER property to an AbsoluteTrigger object: --- iCalendar: BEGIN:VEVENT ... BEGIN:VALARM TRIGGER;VALUE=DATE-TIME:20250302T010203Z ... --- JSCalendar: "alerts": { "6AB751CF-515B-4925-9B8D-5AA2185F3E64": { "@type": "Alert", "trigger": { "@type": "AbsoluteTrigger", "when": "2025-03-02T01:02:03Z" }, "...": "" } } Figure 90: Converting the TRIGGER property to an AbsoluteTrigger Stepanek Expires 6 May 2027 [Page 87] Internet-Draft JSCalendar November 2026 2.3.45. UID The UID property [RFC5545] (Section 3.8.4.7) in a VEVENT, VTODO, or VCALENDAR component converts to the "uid" property [JSCALENDAR] (Section 3.1.1) of the Event, Task, or Group object. The following example illustrates how to convert the UID property: --- iCalendar: UID:5ACEA86F-40CF-47EE-9CCA-7C85588A589F --- JSCalendar: "uid": "5ACEA86F-40CF-47EE-9CCA-7C85588A589F" Figure 91: Converting the UID property 2.3.46. URL The URL property [RFC5545] (Section 3.8.4.6) in a VEVENT, VTODO, PARTICIPANT, VLOCATION, or VCALENDAR component converts to a Link object [JSCALENDAR] (Section 1.5.11). The converted object is set in the Event, Task, Participant, Location, or Group object's "links" property. The "rel" property value is set to "describedby". The key of the Link object MUST be the value of the JSID parameter (Section 4.2.1), if set. If no JSID parameter is set, then the key MAY be the UUIDv5 generated from the property value (see Section 2.1.3). When converting to iCalendar, implementations MAY omit setting the JSID parameter if the key matches the UUIDv5 of the URL property value and the key is not part of a JSON pointer in any JSPTR parameter value. The URL property value converts to the Link object's "href" property. The following example illustrates how to convert the URL property: --- iCalendar: URL:https://example.com/myurl --- JSCalendar: "links": { "6669391a-2c73-5b89-9cfe-7a6c95a855e3": { "@type": "Link", "href": "https://example.com/myurl", "rel": "describedby" } } Stepanek Expires 6 May 2027 [Page 88] Internet-Draft JSCalendar November 2026 Figure 92: Converting the URL property 3. Converting JSCalendar to iCalendar 3.1. Alert The Alert object [JSCALENDAR] (Section 3.5.1) converts to a VALARM component (Section 2.2.2). Its properties convert as follows: +=====================+====================+===============+ | JSCalendar property | iCalendar property | Section | | | (or other) | | +=====================+====================+===============+ | acknowledged | ACKNOWLEDGED | 2.3.1 | +---------------------+--------------------+---------------+ | action | ACTION | 2.3.2 | +---------------------+--------------------+---------------+ | relatedTo | RELATED-TO | 2.3.35, and | | | | remarks below | +---------------------+--------------------+---------------+ | trigger | TRIGGER | 2.3.44 | +---------------------+--------------------+---------------+ Table 22: Properties of the Alert object Remarks: * The value of the RELATED-TO property is the UID property value of that VALARM component, to which the related Alert object converts to. Consequently, the UID property for such a VALARM MUST be set, otherwise the UID property MAY be set. Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the VALARM component. 3.2. Event and Task The Event object [JSCALENDAR] (Section 2.1) converts to a VEVENT component (Section 2.2.3), the Task object [JSCALENDAR] (Section 2.2) converts to a VTODO component (Section 2.2.5). In the iCalendar component, the value data types of the DTSTART, DUE and RECURRENCE-ID properties all MUST be of the same form, either DATE, or DATE WITH LOCAL TIME, or DATE WITH UTC TIME (see Section 3.3.5 of [RFC5545]). It MUST be DATE if the "showWithoutTime" property value is "true", the "timeZone" property value is not set, and the time component is zero in the values of the "start", "due", "duration", "estimatedDuration", "recurrenceId" Stepanek Expires 6 May 2027 [Page 89] Internet-Draft JSCalendar November 2026 properties, and the RecurrenceRule object's "until" property, and in any key of the "recurrenceOverrides" property value. Otherwise, it MAY be DATE WITH UTC TIME if the "timeZone" property value is "Etc/ UTC" and the "endTimeZone" property value is not set. It MUST be DATE WITH LOCAL TIME in all other cases. The following table defines how to convert properties that are common to both the Event and Task object types. Table 24 and Table 25 later in this section define how to convert properties specific to either Event or Task objects. +==========================+====================+===================+ | JSCalendar property | iCalendar property | Section | | | (or other) | | +==========================+====================+===================+ | alerts | VALARM (component) | 3.1 | +--------------------------+--------------------+-------------------+ | categories | CONCEPT | 2.3.9 | +--------------------------+--------------------+-------------------+ | color | COLOR | 2.3.8 | +--------------------------+--------------------+-------------------+ | created | CREATED | 2.3.12 | +--------------------------+--------------------+-------------------+ | description | DESCRIPTION, or | 2.3.13, | | | STYLED-DESCRIPTION | 2.3.41, and | | | | remarks below | +--------------------------+--------------------+-------------------+ | descriptionContentType | FMTTYPE | 2.3.41, and | | | (parameter) of | remarks below | | | STYLED-DESCRIPTION | | +--------------------------+--------------------+-------------------+ | freeBusyStatus | TRANSP | 2.3.43 | +--------------------------+--------------------+-------------------+ | keywords | CATEGORIES | 2.3.6 | +--------------------------+--------------------+-------------------+ | links | ATTACH, or other | 3.4 | +--------------------------+--------------------+-------------------+ | locale | LANGUAGE | 2.3.42, | | | (parameter) of | 2.3.13, | | | SUMMARY property | 2.3.41 | +--------------------------+--------------------+-------------------+ | locations | LOCATION, GEO, or | 3.5 | | | VLOCATION | | | | (component) | | +--------------------------+--------------------+-------------------+ | mainLocationId | LOCATION | 3.5 | +--------------------------+--------------------+-------------------+ | method | METHOD of | 2.3.27, and | Stepanek Expires 6 May 2027 [Page 90] Internet-Draft JSCalendar November 2026 | | iCalendar object | 3.3 | +--------------------------+--------------------+-------------------+ | organizerCalendarAddress | ORGANIZER | 2.3.29 | +--------------------------+--------------------+-------------------+ | participants | ATTENDEE, or | 3.6 | | | PARTICIPANT | | | | (component) | | +--------------------------+--------------------+-------------------+ | priority | PRIORITY | 2.3.31 | +--------------------------+--------------------+-------------------+ | privacy | CLASS | 2.3.7, and | | | | remarks below | +--------------------------+--------------------+-------------------+ | prodId | PRODID of | 2.3.32, and | | | iCalendar object | 3.3 | +--------------------------+--------------------+-------------------+ | recurrenceId | RECURRENCE-ID | 2.3.34 | +--------------------------+--------------------+-------------------+ | recurrenceIdTimeZone | TZID (parameter) | 2.3.34 | | | of RECURRENCE-ID | | +--------------------------+--------------------+-------------------+ | recurrenceOverrides | RDATE, EXDATE or | 2.1.2, and | | | recurrence | remarks below | | | override component | | +--------------------------+--------------------+-------------------+ | recurrenceRule | RRULE | 2.3.36 | +--------------------------+--------------------+-------------------+ | relatedTo | RELATED-TO | 2.3.35 | +--------------------------+--------------------+-------------------+ | sentBy | SENT-BY | 2.3.29 | | | (parameter) of | | | | ORGANIZER | | +--------------------------+--------------------+-------------------+ | sequence | SEQUENCE | 2.3.37 | +--------------------------+--------------------+-------------------+ | showWithoutTime | SHOW-WITHOUT-TIME | 2.3.38, and | | | | remarks below | +--------------------------+--------------------+-------------------+ | timeZone | TZID (parameter) | 2.3.16, | | | of DTSTART and DUE | 2.3.17 | +--------------------------+--------------------+-------------------+ | title | SUMMARY | 2.3.42 | +--------------------------+--------------------+-------------------+ | uid | UID | 2.3.45 | +--------------------------+--------------------+-------------------+ | updated | DTSTAMP, and LAST- | 2.3.15, | | | MODIFIED | 2.3.23 | +--------------------------+--------------------+-------------------+ Stepanek Expires 6 May 2027 [Page 91] Internet-Draft JSCalendar November 2026 | virtualLocations | CONFERENCE | 2.3.10 | +--------------------------+--------------------+-------------------+ Table 23: Properties of the Event and Task object Remarks: * The "descriptionContentType" property value determines if the "description" property converts to the DESCRIPTION or STYLED- DESCRIPTION property. A description of content type "text/plain" converts to the DESCRIPTION property. Any other description converts to the STYLED-DESCRIPTION property, in which case a plain text version of the rich-text description MAY be set additionally in the DESCRIPTION property, having its DERIVED parameter set to "TRUE". How to derive plain text from rich-text is implementation-specific. * The "privacy" property converts to the CLASS property of the main component and all recurrence overrides. If the property value is "private" and the iCalendar/properties property (Section 5.1.1) contains a CLASS property with an unknown value, then implementations MAY convert that preserved property rather than setting the PRIVATE classification. In any case they MUST NOT set more than one CLASS property per calendar component. * The entries in the "recurrenceOverrides" property convert depending on the contents of the PatchObject value. A PatchObject that sets the "excluded" member to "true" converts to an EXDATE property for the date-time of that recurrence instance. An empty PatchObject converts to an RDATE property. Any other PatchObject converts to a recurrence override component in the embedding VCALENDAR component. * The "showWithoutTime" property only converts to the SHOW-WITHOUT- TIME property if the value data type of the DTSTART or DUE properties is of form DATE WITH UTC TIME or DATE WITH LOCAL TIME. Properties specific to the Event object type convert to iCalendar properties as follows: Stepanek Expires 6 May 2027 [Page 92] Internet-Draft JSCalendar November 2026 +=====================+===============================+=========+ | JSCalendar property | iCalendar property (or other) | Section | +=====================+===============================+=========+ | duration | DURATION, or DTEND | 2.3.18, | | | | 2.3.14 | +---------------------+-------------------------------+---------+ | endTimeZone | TZID parameter of DTEND | 2.3.14, | | | | 2.3.17 | +---------------------+-------------------------------+---------+ | start | DTSTART | 2.3.16 | +---------------------+-------------------------------+---------+ | status | STATUS | 2.3.39 | +---------------------+-------------------------------+---------+ Table 24: Properties of the Event object Properties specific to the Task object type convert to iCalendar properties as follows: +=====================+===============================+=========+ | JSCalendar property | iCalendar property (or other) | Section | +=====================+===============================+=========+ | due | DUE | 2.3.17 | +---------------------+-------------------------------+---------+ | estimatedDuration | ESTIMATED-DURATION | 2.3.19 | +---------------------+-------------------------------+---------+ | percentComplete | PERCENT-COMPLETE | 2.3.30 | +---------------------+-------------------------------+---------+ | progress | STATUS | 2.3.39 | +---------------------+-------------------------------+---------+ | start | DTSTART | 2.3.16 | +---------------------+-------------------------------+---------+ Table 25: Properties of the Task object Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the VEVENT or VTODO component. 3.3. Group The Group object [JSCALENDAR] (Section 2.3) converts to a VCALENDAR component (Section 2.1.1). The Event and Task objects in its "entries" property [JSCALENDAR] (Section 4.3.1) convert to VEVENT and VTODO components, see Section 3.2. Its properties convert as follows: Stepanek Expires 6 May 2027 [Page 93] Internet-Draft JSCalendar November 2026 +=============+=============================+===================+ | JSCalendar | iCalendar property (or | Section | | property | other) | | +=============+=============================+===================+ | categories | CONCEPT | 2.3.9 | +-------------+-----------------------------+-------------------+ | color | COLOR | 2.3.8 | +-------------+-----------------------------+-------------------+ | created | CREATED | 2.3.12 | +-------------+-----------------------------+-------------------+ | description | DESCRIPTION, or STYLED- | 2.3.13, 2.3.41, | | | DESCRIPTION | and remarks below | +-------------+-----------------------------+-------------------+ | entries | VEVENT or VTODO (component) | 3.2, and remarks | | | | below | +-------------+-----------------------------+-------------------+ | keywords | CATEGORIES | 2.3.6 | +-------------+-----------------------------+-------------------+ | links | ATTACH, or other | 3.4 | +-------------+-----------------------------+-------------------+ | locale | LANGUAGE (parameter) of | 2.3.28, 2.3.13 | | | either NAME, or DESCRIPTION | | | | (in order of preference) | | +-------------+-----------------------------+-------------------+ | prodId | PRODID | 2.3.32, and | | | | remarks below | +-------------+-----------------------------+-------------------+ | source | SOURCE | 2.3.40 | +-------------+-----------------------------+-------------------+ | title | NAME | 2.3.28 | +-------------+-----------------------------+-------------------+ | uid | UID | 2.3.45 | +-------------+-----------------------------+-------------------+ | updated | LAST-MODIFIED | 2.3.23 | +-------------+-----------------------------+-------------------+ Table 26: Properties of the Group object Remarks: Stepanek Expires 6 May 2027 [Page 94] Internet-Draft JSCalendar November 2026 * The "descriptionContentType" property value determines if the "description" property converts to the DESCRIPTION or STYLED- DESCRIPTION property. A description of content type "text/plain" converts to the DESCRIPTION property. Any other description converts to the STYLED-DESCRIPTION property, in which case a plain text version of the rich-text description MAY be set additionally in the DESCRIPTION property, having its DERIVED parameter set to "TRUE". How to derive plain text from rich-text is implementation-specific. * The "prodId" property value of the Group object is expected to be equal to the "prodId" property value of all the Group entries. They all convert to the same, single PRODID property in the VCALENDAR component. How to convert unequal "prodId" property values is implementation-specific. * The "method" property value in all the Group entries is expected to be equal. How to convert entries with unequal "method" property values is implementation-specific. Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the VCALENDAR component. 3.4. Link The Link object [JSCALENDAR] (Section 1.5.11) in the "links" property [JSCALENDAR] (Section 3.2.8) of an Event, Task, Group, Location, or Participant object converts to either an ATTACH property (Section 2.3.3) or an IMAGE property (Section 2.3.22), or a LINK property (Section 2.3.24), or an URL property (Section 2.3.46). Which iCalendar property to choose is implementation-specific. As a guideline, stopping at the first matching criteria: 1. Choose ATTACH if the "rel" property value is "enclosure". 2. Choose IMAGE if the "rel" property value is "icon". 3. Choose URL if the "rel" property value is "describedby" and no URL property is set in the iCalendar component. 4. Choose LINK otherwise. The "href" property converts to the property value. The other Link properties convert as follows: Stepanek Expires 6 May 2027 [Page 95] Internet-Draft JSCalendar November 2026 +=============+=====================+===========================+ | JSCalendar | iCalendar parameter | Section | | property | (or other) | | +=============+=====================+===========================+ | contentType | FMTTYPE | 2.3.3 | +-------------+---------------------+---------------------------+ | display | DISPLAY | 2.3.22 | +-------------+---------------------+---------------------------+ | rel | LINKREL, or none | Section 6.1 of [RFC9253], | | | | and remarks below | +-------------+---------------------+---------------------------+ | size | SIZE | 2.3.3 | +-------------+---------------------+---------------------------+ | title | FILENAME or LABEL | 2.3.3, 2.3.24, and | | | | remarks below | +-------------+---------------------+---------------------------+ Table 27: Properties of the Link object Remarks: * The LINKREL parameter is not specified for the ATTACH, IMAGE and URL properties. For interoperability, implementations SHOULD NOT set the LINKREL parameter on these properties. Instead, implementations SHOULD only set the LINKREL parameter on the LINK property, or any future property that explicitly names the LINKREL parameter in its Property Parameters definition. As an exception to this rule, implementations MAY set the LINKREL parameter on ATTACH or IMAGE if the iCalendar property value type is BINARY. * The "title" property converts to the FILENAME parameter for the ATTACH and IMAGE properties. It converts to the LABEL parameter for the LINK and URL properties. Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the same component to which the Link object converts to as a property. 3.5. Location The Location object [JSCALENDAR] (Section 3.2.5) converts to either a LOCATION (Section 2.3.25) or GEO (Section 2.3.21) property, or it converts to a VLOCATION component (Section 2.2.4). Which iCalendar element to choose is implementation-specific. As a guideline: Stepanek Expires 6 May 2027 [Page 96] Internet-Draft JSCalendar November 2026 * If the "iCalendar" property on the Location object is set, or the parent JSCalendar object contains an entry for that Location in the "convertedProperties" property of its "iCalendar" property, then convert the object back to the named iCalendar component or property. * Choose LOCATION if the key of the Location object in the "locations" property matches the "mainLocationId" property [JSCALENDAR] (Section 3.2.6), or if the "name" property is set and the iCalendar component does not already contain a LOCATION property. The "name" property converts to the LOCATION property value. * Choose the VLOCATION component otherwise. Implementations MAY convert one of the Location objects to both a VLOCATION component and the LOCATION and GEO properties of the component that contains the VLOCATION component. In this case, the DERIVED parameter MUST be set on the LOCATION and GEO properties with value "TRUE". The properties convert to a VLOCATION component as follows: +=====================+===============================+=========+ | JSCalendar property | iCalendar property (or other) | Section | +=====================+===============================+=========+ | coordinates | COORDINATES | 2.3.11, | | | | 2.3.21 | +---------------------+-------------------------------+---------+ | links | ATTACH, or other | 3.4 | +---------------------+-------------------------------+---------+ | locationTypes | LOCATION-TYPE | 2.3.26 | +---------------------+-------------------------------+---------+ | name | NAME | 2.3.28 | +---------------------+-------------------------------+---------+ Table 28: Properties of the Location object Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the VLOCATION component, or the component which the Location converts to as a property. 3.6. Participant The Participant object [JSCALENDAR] (Section 3.4.6) converts to an ATTENDEE property (Section 2.3.4) and PARTICIPANT component (Section 2.2.1), unless it is fully represented by the ORGANIZER property (Section 2.3.29): Stepanek Expires 6 May 2027 [Page 97] Internet-Draft JSCalendar November 2026 * It if fully represented by the ORGANIZER property if its "calendarAddress" property value matches the "organizerCalendarAddress" property value, and it does not have any role but the "owner" role set, and it only has properties set that convert to ORGANIZER parameters (see Table 18). * Otherwise, it converts to an ATTENDEE property if the "calendarAddress" property is set. The "calendarAddress" converts to the ATTENDEE property value. * It converts to a PARTICIPANT component if any of the Participant properties in Table 30 are set. If the Participant object also converts to an ATTENDEE property, then the CALENDAR-ADDRESS property value of the PARTICIPANT component MUST match the ATTENDEE property value. The following Participant properties convert to parameters of the ATTENDEE property. How to convert these if the Participant "calendarAddress" property is not set is implementation-specific. Stepanek Expires 6 May 2027 [Page 98] Internet-Draft JSCalendar November 2026 +=====================+=====================+===============+ | JSCalendar property | iCalendar parameter | Section | | | (or other) | | +=====================+=====================+===============+ | delegatedFrom | DELEGATED-FROM | 2.3.4 | +---------------------+---------------------+---------------+ | delegatedTo | DELEGATED-TO | 2.3.4 | +---------------------+---------------------+---------------+ | email | EMAIL | 2.3.4, and | | | | remarks below | +---------------------+---------------------+---------------+ | expectReply | RSVP | 2.3.4 | +---------------------+---------------------+---------------+ | kind | CUTYPE | 2.3.4 | +---------------------+---------------------+---------------+ | memberOf | MEMBER | 2.3.4 | +---------------------+---------------------+---------------+ | name | CN | 2.3.4, and | | | | remarks below | +---------------------+---------------------+---------------+ | participationStatus | PARTSTAT | 2.3.4 | +---------------------+---------------------+---------------+ | progress | PARTSTAT | 2.3.4, and | | | | remarks below | +---------------------+---------------------+---------------+ | roles | ROLE | 2.3.4, and | | | | remarks below | +---------------------+---------------------+---------------+ | sentBy | SENT-BY | 2.3.4, and | | | | remarks below | +---------------------+---------------------+---------------+ Table 29: Properties of the Participant object that convert to the ATTENDEE property Remarks: * The "owner" role needs not convert to the ROLE parameter of the ATTENDEE property if the Participant object converts to both the ATTENDEE and ORGANIZER property. * The "name", "email" and "sentBy" properties also convert to parameters of the ORGANIZER property, if the Participant converts to the ORGANIZER property. * The "progress" property converts to the PARTSTAT parameter as outlined in Table 13. Stepanek Expires 6 May 2027 [Page 99] Internet-Draft JSCalendar November 2026 The following Participant properties convert to the PARTICIPANT component: +========================+====================+===================+ | JSCalendar property | iCalendar property | Section | | | (or other) | | +========================+====================+===================+ | description | DESCRIPTION, or | 2.3.13, 2.3.41, | | | STYLED-DESCRIPTION | and remarks below | +------------------------+--------------------+-------------------+ | descriptionContentType | FMTTYPE | 2.3.41 | | | (parameter) of | | | | STYLED-DESCRIPTION | | +------------------------+--------------------+-------------------+ | links | ATTACH, or other | 3.4 | +------------------------+--------------------+-------------------+ | name | SUMMARY | 2.3.42 | +------------------------+--------------------+-------------------+ | percentComplete | PERCENT-COMPLETE | 2.3.30 | +------------------------+--------------------+-------------------+ Table 30: Properties of the Participant object that convert to the PARTICIPANT component Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the PARTICIPANT component, or the component which the Participant converts to as a property. 3.7. VirtualLocation The VirtualLocation object [JSCALENDAR] (Section 3.2.7) converts to a CONFERENCE property (Section 2.3.10). The "uri" property converts to the CONFERENCE property value. The following properties convert to parameters of the CONFERENCE property: +=====================+================================+=========+ | JSCalendar property | iCalendar parameter (or other) | Section | +=====================+================================+=========+ | features | FEATURE | 2.3.10 | +---------------------+--------------------------------+---------+ | name | LABEL | 2.3.10 | +---------------------+--------------------------------+---------+ Table 31: Properties of the VirtualLocation object Stepanek Expires 6 May 2027 [Page 100] Internet-Draft JSCalendar November 2026 4. Updates to iCalendar 4.1. New Properties 4.1.1. JSID Property Name: JSID Purpose: This property preserves the identifier of a JSCalendar object value in iCalendar. Value type: TEXT; also see "Format Definition" below for value restrictions. Property Parameters: IANA and non-standard property parameters can be specified on this property. Conformance: This property can be specified at most once in any calendar component. Description: This property specifies the JSON object key of the JSCalendar object to which an iCalendar component converts to. For example, this property set in a VALARM component within a VEVENT component defines the key of the Alert object in the Event object's "alerts" property (see Figure 93). The value of the JSID property MUST be a valid object key according to the definition of the JSCalendar property to which the component converts to. Format Definition: This property is defined by the following notation: jsid-prop = "JSID" *(";" other-param) ":" TEXT CRLF Example(s): The following example illustrates how to convert the JSID property set in a VALARM component. Stepanek Expires 6 May 2027 [Page 101] Internet-Draft JSCalendar November 2026 --- iCalendar: BEGIN:VEVENT ... BEGIN:VALARM UID:52DFB000-3C49-4577-8003-3086001BD26A JSID:myalert ... END:VALARM --- JSCalendar: "@type": "Event", "alerts": { "myalert": { "@type": "Alert", "iCalendar": { "@type": "ICalComponent", "name": "valarm", "properties": [ [ "uid", {}, "text", "52DFB000-3C49-4577-8003-3086001BD26A" ] ] }, "...": "" } } Figure 93: Converting the JSID property of a VALARM component 4.1.2. JSPROP Property Name: JSPROP Purpose: This property represents a JSCalendar property in iCalendar. Value type: TEXT; also see "Format Definition" below for value restrictions. Property Parameters: The JSPTR parameter (Section 4.2.2) MUST be specified on this property. Other IANA and non-standard property parameters can be specified on this property. Stepanek Expires 6 May 2027 [Page 102] Internet-Draft JSCalendar November 2026 Conformance: This property can be specified multiple times in any calendar component. Description: This property converts an arbitrary JSCalendar property from and to iCalendar. The iCalendar property value is the JSON-encoded value of the JSCalendar property, represented as a TEXT value. The JSON value MUST NOT be the null value, and it SHOULD NOT contain insignificant whitespace as defined in Section 2 of [RFC8259]. The value of the JSPTR parameter points to the JSCalendar property within the JSCalendar object and MUST NOT start with the SOLIDUS (U+002F) character. The pointer MUST NOT reference into an array. All JSPROP properties in a calendar component together form a PatchObject [JSCALENDAR] (Section 1.5.9): the JSPTR parameter of a JSPROP property corresponds to a key in the PatchObject, the property value corresponds to the JSON value for that key. When converting from iCalendar to JSCalendar, the PatchObject MUST only be applied after all other iCalendar elements of the component have been converted. Only new properties are allowed to be set, a JSON pointer in the PatchObject that points to an existing property MUST be ignored. Format Definition: This property is defined by the following notation: jsprop = "JSPROP" jsprop-param ":" TEXT CRLF jsprop-param = *( ; The following are MANDATORY and MUST NOT ; occur more than once ( ";" jsptr-param ) ; ; The following is OPTIONAL ; and MAY occur more than once. ; (";" other-param) ; ) Example(s): The following example illustrates how to convert a JSPROP property with a JSON boolean value Stepanek Expires 6 May 2027 [Page 103] Internet-Draft JSCalendar November 2026 --- iCalendar: JSPROP;JSPTR="example.com:foo":true --- JSCalendar: "example.com:foo": true Figure 94: Converting the JSPROP property with a JSON boolean value The following example illustrates how to convert a JSPROP property with a JSON object value --- iCalendar: JSPROP;JSPTR="example.com:foo":{"bar":1234\,"baz":"bam"} --- JSCalendar: "example.com:foo": { "bar": 1234, "baz": "bam" } Figure 95: Converting the JSPROP property with a JSON object value The following example illustrates how to convert a JSPROP property that points to a property within a JSCalendar Alert. The JSON pointer in the JSPTR parameter is relative to the Alert object. --- iCalendar: BEGIN:VEVENT ... BEGIN:VALARM JSPROP;JSPTR="example.com:foo":"bar" ... END:VALARM --- JSCalendar: "@type": "Event", "alerts": { "DB7A8058-2212-46D9-87C2-867C7F65D625": { "@type": "Alert", "example.com:foo": "bar", "...": "" } } Figure 96: Converting the JSPROP property within a VALARM component Stepanek Expires 6 May 2027 [Page 104] Internet-Draft JSCalendar November 2026 The following example illustrates how to convert a JSPROP property that points to a property within a JSCalendar Link. The JSON pointer in the JSPTR parameter is relative to the Event object because the Link object converts to an iCalendar property. The JSID parameter (Section 4.2.1) on the ATTACH property ensures that the JSON path remains valid during conversion. --- iCalendar: BEGIN:VEVENT ... ATTACH;JSID=mylink1:https://www.rfc-editor.org/rfc/rfc8984.html JSPROP;JSPTR="links/mylink1/example.com:foo":"bar" ... --- JSCalendar: "@type": "Event", "links": { "mylink1": { "@type": "Link", "href": "https://www.rfc-editor.org/rfc/rfc8984.html", "example.com:foo": "bar", "...": "" } } Figure 97: Converting the JSPROP property within a Link object 4.2. New Parameters 4.2.1. JSID Parameter Name: JSID Format Definition: jsid-param = "JSID" "=" param-value Description: This parameter specifies the JSON object key of the JSCalendar object to which an iCalendar property converts to. For example, this parameter set on an ATTACH property within a VEVENT component defines the key of the Link object in the Event object's "links" property (see below for an example). The value of the JSID parameter MUST be a valid key according to the definition of the JSCalendar property to which the property that this parameter is set on converts to. Typically, this requires the value to be a valid Id [JSCALENDAR] (Section 1.5.1). Stepanek Expires 6 May 2027 [Page 105] Internet-Draft JSCalendar November 2026 Example(s): --- iCalendar: ATTACH;JSID=mylink1:https://example.com --- JSCalendar: "links": { "mylink1": { "@type": "Link", "href": "https://example.com" } } Figure 98: Converting the JSID parameter on an ATTACH property 4.2.2. JSPTR Parameter name: JSPTR Purpose: To specify a pointer to a JSCalendar property. Description: This parameter is set on a JSPROP (Section 4.1.2) property. Its value points to a JSCalendar property. The parameter has a single value that MUST be a valid PatchObject key as defined in Section 1.5.9 of [JSCALENDAR]. The parameter value MUST be quoted. Format definition: jsptr-param = "JSPTR" "=" quoted-string Example(s): For further examples, see Section 4.1.2. JSPROP;JSPTR="example.com:foo":"bar" 5. Updates to JSCalendar 5.1. New Properties 5.1.1. iCalendar Name: iCalendar Context: Any JSCalendar object Stepanek Expires 6 May 2027 [Page 106] Internet-Draft JSCalendar November 2026 Type: ICalComponent (optional) Description This property contains information about iCalendar data that got converted to this JSCalendar object. It allows for preserving the name of iCalendar elements, such as a component's name, properties and subcomponents. This specification defines the ICalComponent object type for converting iCalendar components to a JSCalendar object. Future specifications MAY define additional value types for this property. An ICalComponent object has the following properties: @type: String This specifies the type of this object. This MUST be "ICalComponent", if set. name: String (mandatory) This is the name of the iCalendar component in lowercase. components: *[][] (optional) This contains subcomponents of the iCalendar component which did not convert to standard JSCalendar elements. The value MUST be a list of iCalendar components formatted in jCal as defined in Section 3.3 of [RFC7265]. convertedProperties: String[ICalProperty] (optional) This contains conversion-related information about the component's properties that got partially or fully converted to JSCalendar. Each key defines the path to a JSCalendar element. The value for each key contains information about the iCalendar property which converted to the JSCalendar element located at that key. Unless otherwise defined for a specific iCalendar property, the path points to the JSCalendar property that the iCalendar property value converts to. The key MUST be a valid key of a PatchObject as defined in Section 1.5.9 of [JSCALENDAR]. The key MAY point to the key in a nested object if the element at that key was converted from an iCalendar property of the component for which the "iCalendar" property is set. It MUST NOT point into nested objects otherwise. properties: *[][] (optional) This contains properties of the iCalendar component which did not convert to standard JSCalendar elements. The value MUST be a list of iCalendar properties formatted in jCal as defined in Section 3.4 of [RFC7265]. Stepanek Expires 6 May 2027 [Page 107] Internet-Draft JSCalendar November 2026 An ICalProperty object has the following properties: @type: String This specifies the type of this object. This MUST be "ICalProperty", if set. name: String (mandatory) This is the name of the iCalendar property in lowercase. valueType: String (optional) This is the name of the iCalendar property value type in lowercase. parameters: String[String|String[]] (optional) This contains parameters of the iCalendar property. The value MUST comply with iCalendar parameters formatted in jCal as defined in Section 3.5 of [RFC7265]. The example in Figure 99 describes how to convert unknown iCalendar elements to the "iCalendar" property. The X-FOO parameter set on the SUMMARY property illustrates how to preserve an unknown iCalendar parameter on a property that does convert to a standard JSCalendar element. The X-BAR property and X-BAZ component illustrate how to convert entirely unknown iCalendar elements. --- iCalendar: BEGIN:VEVENT SUMMARY;X-FOO=bar:test ... X-BAR:bam ... BEGIN:X-BAZ UID:507A08F9-81D8-4D16-9480-D6D75E977943 END:X-BAZ ... --- JSCalendar: { "@type": "Event", "title": "test", "iCalendar": { "@type": "ICalComponent", "name": "vevent", "convertedProperties": { "title": { "@type": "ICalProperty", "name": "summary", "parameters": { "x-foo": "bar" } Stepanek Expires 6 May 2027 [Page 108] Internet-Draft JSCalendar November 2026 } }, "properties": [ [ "x-bar", {}, "unknown", "bam" ] ], "components": [ [ "x-baz", [ [ "uid", {}, "text", "507A08F9-81D8-4D16-9480-D6D75E977943" ] ], [] ] ] }, "...": "" } Figure 99: Converting unknown iCalendar elements to the "iCalendar" property 6. Security Considerations This specification defines how to convert between the JSCalendar and iCalendar data formats. The security considerations for parsing and formatting such data apply and are outlined in Section 6 of [JSCALENDAR] and Section 7 of [RFC5545]. 7. IANA Considerations 7.1. Changes to the "iCalendar Element Registries" IANA will add the following entries to the "Properties" registry: Property JSID Status Current Stepanek Expires 6 May 2027 [Page 109] Internet-Draft JSCalendar November 2026 Reference Section 4.1.1 Property JSPROP Status Current Reference Section 4.1.2 IANA will add the following entries to the "Parameters" registry: Parameter JSID Status Current Reference Section 4.2.1 Parameter JSPTR Status Current Reference Section 4.2.2 7.2. Changes to the "JSCalendar Registries" IANA will add the following entries to the "JSCalendar Properties" registry: Property Name components Property Type *[][] Property Context ICalComponent Reference/Description Section 5.1.1 Intended Usage common Since Version 2.0 Is Per-User no Change Controller IETF Stepanek Expires 6 May 2027 [Page 110] Internet-Draft JSCalendar November 2026 Property Name convertedProperties Property Type String[ICalProperty] Property Context ICalComponent Reference/Description Section 5.1.1 Intended Usage common Since Version 2.0 Is Per-User no Change Controller IETF Property Name iCalendar Property Type ICalComponent Property Context Event, Location, Participant, Task Reference/Description Section 5.1.1 Intended Usage common Since Version 2.0 Is Per-User no Change Controller IETF Property Name iCalendar Property Type ICalComponent Property Context Alert Reference/Description Section 5.1.1 Intended Usage common Since Version 2.0 Is Per-User yes Stepanek Expires 6 May 2027 [Page 111] Internet-Draft JSCalendar November 2026 Change Controller IETF Property Name name Property Type String Property Context ICalComponent, ICalProperty Reference/Description Section 5.1.1 Intended Usage common Since Version 2.0 Is Per-User no Change Controller IETF Property Name parameters Property Type String[String|String[]] Property Context ICalProperty Reference/Description Section 5.1.1 Intended Usage common Since Version 2.0 Is Per-User no Change Controller IETF Property Name properties Property Type *[][] Property Context ICalComponent Reference/Description Section 5.1.1 Intended Usage common Stepanek Expires 6 May 2027 [Page 112] Internet-Draft JSCalendar November 2026 Since Version 2.0 Is Per-User no Change Controller IETF Property Name valueType Property Type String Property Context ICalProperty Reference/Description Section 5.1.1 Intended Usage common Since Version 2.0 Is Per-User no Change Controller IETF IANA will update the following entry in the "JSCalendar Properties" registry. The entry is identified by its Property Name. The values listed for the other fields are appended to the comma-separated values already set for these fields, unchanged fields are omitted. Property Name @type Property Context ICalComponent, ICalProperty Reference/Description Section 5.1.1 IANA will add the following entries to the "JSCalendar Types" registry: Type Name ICalComponent Reference/Description Section 5.1.1 Intended Usage common Since Version 2.0 Stepanek Expires 6 May 2027 [Page 113] Internet-Draft JSCalendar November 2026 Change Controller IETF Type Name ICalProperty Reference/Description Section 5.1.1 Intended Usage common Since Version 2.0 Change Controller IETF 8. References 8.1. Normative References [JSCAL-EXT] Stepanek, R., "iCalendar Format Extensions for JSCalendar", Work in Progress, Internet-Draft, draft-ietf- calext-icalendar-jscalendar-extensions-09, 29 October 2026, . [JSCALENDAR] Jenkins, N. and R. Stepanek, "JSCalendar 2.0: A JSON Representation of Calendar Data", Work in Progress, Internet-Draft, draft-ietf-calext-jscalendarbis-22, 4 October 2026, . [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, . [RFC2397] Masinter, L., "The "data" URL scheme", RFC 2397, DOI 10.17487/RFC2397, August 1998, . [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", STD 68, RFC 5234, DOI 10.17487/RFC5234, January 2008, . Stepanek Expires 6 May 2027 [Page 114] Internet-Draft JSCalendar November 2026 [RFC5545] Desruisseaux, B., Ed., "Internet Calendaring and Scheduling Core Object Specification (iCalendar)", RFC 5545, DOI 10.17487/RFC5545, September 2009, . [RFC5870] Mayrhofer, A. and C. Spanring, "A Uniform Resource Identifier for Geographic Locations ('geo' URI)", RFC 5870, DOI 10.17487/RFC5870, June 2010, . [RFC6047] Melnikov, A., Ed., "iCalendar Message-Based Interoperability Protocol (iMIP)", RFC 6047, DOI 10.17487/RFC6047, December 2010, . [RFC6638] Daboo, C. and B. Desruisseaux, "Scheduling Extensions to CalDAV", RFC 6638, DOI 10.17487/RFC6638, June 2012, . [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type Specifications and Registration Procedures", BCP 13, RFC 6838, DOI 10.17487/RFC6838, January 2013, . [RFC7265] Kewisch, P., Daboo, C., and M. Douglass, "jCal: The JSON Format for iCalendar", RFC 7265, DOI 10.17487/RFC7265, May 2014, . [RFC7529] Daboo, C. and G. Yakushev, "Non-Gregorian Recurrence Rules in the Internet Calendaring and Scheduling Core Object Specification (iCalendar)", RFC 7529, DOI 10.17487/RFC7529, May 2015, . [RFC7953] Daboo, C. and M. Douglass, "Calendar Availability", RFC 7953, DOI 10.17487/RFC7953, August 2016, . [RFC7986] Daboo, C., "New Properties for iCalendar", RFC 7986, DOI 10.17487/RFC7986, October 2016, . [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, . Stepanek Expires 6 May 2027 [Page 115] Internet-Draft JSCalendar November 2026 [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", STD 90, RFC 8259, DOI 10.17487/RFC8259, December 2017, . [RFC9073] Douglass, M., "Event Publishing Extensions to iCalendar", RFC 9073, DOI 10.17487/RFC9073, August 2021, . [RFC9074] Daboo, C. and K. Murchison, Ed., ""VALARM" Extensions for iCalendar", RFC 9074, DOI 10.17487/RFC9074, August 2021, . [RFC9253] Douglass, M., "Support for iCalendar Relationships", RFC 9253, DOI 10.17487/RFC9253, August 2022, . [RFC9562] Davis, K., Peabody, B., and P. Leach, "Universally Unique IDentifiers (UUIDs)", RFC 9562, DOI 10.17487/RFC9562, May 2024, . [RFC10051] Apthorp, A. and M. Douglass, "Task Extensions to iCalendar", RFC 10051, DOI 10.17487/RFC10051, October 2026, . [TZDB] "IANA Time Zone Database", . 8.2. Informative References [JMAP-CAL] Jenkins, N. and M. Douglass, "JSON Meta Application Protocol (JMAP) for Calendars", Work in Progress, Internet-Draft, draft-ietf-jmap-calendars-33, 13 October 2026, . [RFC8607] Daboo, C., Quillaud, A., and K. Murchison, Ed., "Calendaring Extensions to WebDAV (CalDAV): Managed Attachments", RFC 8607, DOI 10.17487/RFC8607, June 2019, . Appendix A. Discrepancies between iCalendar and JSCalendar This section highlights iCalendar and JSCalendar elements for which no conversion rule to a standard element is defined in this document. This is informational and only complete at the time of publication of this document. Stepanek Expires 6 May 2027 [Page 116] Internet-Draft JSCalendar November 2026 Implementations MAY choose to convert the following elements, for example using the properties defined in Section 4 and Section 5, or they might convert them to some vendor-specific extension properties. Later RFC documents might also define new standard elements and register them at IANA, either extending this list of inconvertible elements, or rather reduce it by introducing a standard element to convert to. A.1. Unsupported iCalendar Elements A.1.1. Components The following components do not convert to a standard element in JSCalendar: * AVAILABLE [RFC7953], Section 3.1 * VAVAILABILITY [RFC7953], Section 3.1 * VFREEBUSY [RFC5545], Section 3.6.4 * VJOURNAL [RFC5545], Section 3.6.3 * VRESOURCE [RFC9073], Section 7.3 * VTIMEZONE [RFC5545], Section 3.6.5 * VSTATUS [RFC10051], Section 12.1 A.1.2. Properties by Component The following components are defined to contain the listed properties. But these properties do not convert to a standard JSCalendar element. A.1.2.1. PARTICIPANT [RFC9073], Section 7.1 * CATEGORIES [RFC5545], Section 3.8.1.2 * COMMENT [RFC5545], Section 3.8.1.4 * CONTACT [RFC5545], Section 3.8.4.2 * CREATED [RFC5545], Section 3.8.7.1 * LAST-MODIFIED [RFC5545], Section 3.8.7.3 * LINK [RFC9253], Section 8.2 Stepanek Expires 6 May 2027 [Page 117] Internet-Draft JSCalendar November 2026 * LOCATION [RFC5545], Section 3.8.1.7 * PARTICIPANT-TYPE [RFC9073], Section 6.2 * PRIORITY [RFC5545], Section 3.8.1.9 * REASON [RFC10051], Section 10.2 * RELATED-TO [RFC5545], Section 3.8.4.5 * REQUEST-STATUS [RFC5545], Section 3.8.8.3 * RESOURCES [RFC5545], Section 3.8.1.10 * STATUS [RFC5545], Section 3.8.1.11 * STRUCTURED-DATA [RFC9074], Section 6.6 * UID [RFC5545], Section 3.8.4.7 A.1.2.2. VALARM [RFC5545], Section 3.6.6 * ATTACH [RFC5545], Section 3.8.1.1 * ATTENDEE [RFC5545], Section 3.8.4.1 * DESCRIPTION [RFC5545], Section 3.8.1.5 * DURATION [RFC5545], Section 3.8.2.5 * PROXIMITY [RFC9074], Section 8.1 * REPEAT [RFC5545], Section 3.8.6.2 * STYLED-DESCRIPTION [RFC9073], Section 6.5 * SUMMARY [RFC5545], Section 3.8.1.12 * UID [RFC5545], Section 3.8.4.7 A.1.2.3. VCALENDAR [RFC5545], Section 3.4 * CALSCALE [RFC5545], Section 3.7.1 * LINK [RFC9253], Section 8.2 * REFRESH-INTERVAL [RFC7986], Section 5.7 Stepanek Expires 6 May 2027 [Page 118] Internet-Draft JSCalendar November 2026 * VERSION [RFC5545], Section 3.7.4 A.1.2.4. VEVENT [RFC5545], Section 3.6.1 * COMMENT [RFC5545], Section 3.8.1.4 * CONTACT [RFC5545], Section 3.8.4.2 * LINK [RFC9253], Section 8.2 * REFID [RFC9253], Section 8.3 * REQUEST-STATUS [RFC5545], Section 3.8.8.3 * RESOURCES [RFC5545], Section 3.8.1.10 * STRUCTURED-DATA [RFC9074], Section 6.6 A.1.2.5. VLOCATION [RFC9073], Section 7.2 * DESCRIPTION [RFC5545], Section 3.8.1.5 * LINK [RFC9253], Section 8.2 * UID [RFC5545], Section 3.8.4.7 * STRUCTURED-DATA [RFC9074], Section 6.6 * STYLED-DESCRIPTION [RFC9073], Section 6.5 A.1.2.6. VTODO [RFC5545], Section 3.6.2 * COMMENT [RFC5545], Section 3.8.1.4 * COMPLETED [RFC5545], Section 3.8.2.1 * CONTACT [RFC5545], Section 3.8.4.2 * LINK [RFC9253], Section 8.2 * REFID [RFC9253], Section 8.3 * REQUEST-STATUS [RFC5545], Section 3.8.8.3 * RESOURCES [RFC5545], Section 3.8.1.10 * STRUCTURED-DATA [RFC9074], Section 6.6 Stepanek Expires 6 May 2027 [Page 119] Internet-Draft JSCalendar November 2026 * TASK-MODE [RFC10051], Section 10.4 A.1.3. Subcomponents by Component The following components are defined to contain the listed subcomponents. But these subcomponents do not convert to a standard JSCalendar element. A.1.3.1. PARTICIPANT [RFC9073], Section 7.1 * VLOCATION [RFC9073], Section 7.2 A.1.4. Properties by Value Type The following properties convert to a standard JSCalendar element for some other value type, but they do not for the listed value types. A.1.4.1. RDATE [RFC5545], Section 3.8.5.2 * PERIOD [RFC5545], Section 3.3.9 A.1.5. Parameters by Property The following properties are defined to contain the listed parameters. But these parameters do not convert to a standard JSCalendar element. A.1.5.1. ATTACH [RFC5545], Section 3.8.1.1 * MANAGED-ID [RFC8607], Section 4.3 A.1.5.2. ATTENDEE [RFC5545], Section 3.8.4.1 * DIR [RFC5545], Section 3.2.6 * SCHEDULE-AGENT [RFC6638], Section 7.1 * SCHEDULE-FORCE-SEND [RFC6638], Section 7.2 * SCHEDULE-STATUS [RFC6638], Section 7.3 * SENT-BY [RFC5545], Section 3.2.18 * LANGUAGE [RFC5545], Section 3.2.10 Stepanek Expires 6 May 2027 [Page 120] Internet-Draft JSCalendar November 2026 A.1.5.3. CATEGORIES [RFC5545], Section 3.8.1.2 * LANGUAGE [RFC5545], Section 3.2.10 A.1.5.4. CONFERENCE [RFC7986], Section 5.11 * LANGUAGE [RFC5545], Section 3.2.10 A.1.5.5. DESCRIPTION [RFC5545], Section 3.8.1.5 * ALTREP [RFC5545], Section 3.2.1 * LANGUAGE [RFC5545], Section 3.2.10 A.1.5.6. IMAGE [RFC7986], Section 5.10 * ALTREP [RFC5545], Section 3.2.1 * DISPLAY [RFC7986], Section 6.1 (if the parameter value contains more than one "displayval"). A.1.5.7. LINK [RFC9253], Section 8.2 * LANGUAGE [RFC5545], Section 3.2.10 A.1.5.8. LOCATION [RFC5545], Section 3.8.1.7 * ALTREP [RFC5545], Section 3.2.1 * LANGUAGE [RFC5545], Section 3.2.10 A.1.5.9. NAME [RFC7986], Section 5.1 * ALTREP [RFC5545], Section 3.2.1 A.1.5.10. ORGANIZER [RFC5545], Section 3.8.4.3 * DIR [RFC5545], Section 3.2.6 * SENT-BY [RFC5545], Section 3.2.18 * LANGUAGE [RFC5545], Section 3.2.10 * SCHEDULE-AGENT [RFC6638], Section 7.1 * SCHEDULE-FORCE-SEND [RFC6638], Section 7.2 * SCHEDULE-STATUS [RFC6638], Section 7.3 Stepanek Expires 6 May 2027 [Page 121] Internet-Draft JSCalendar November 2026 A.1.5.11. RECURRENCE-ID [RFC5545], Section 3.8.4.4 * RANGE [RFC5545], Section 3.2.13 A.1.5.12. RELATED-TO [RFC5545], Section 3.8.4.5 * GAP [RFC9253], Section 6.2 A.1.5.13. REQUEST-STATUS [RFC5545], Section 3.8.8.3 * LANGUAGE [RFC5545], Section 3.2.10 A.1.5.14. RESOURCES [RFC5545], Section 3.8.1.10 * ALTREP [RFC5545], Section 3.2.1 * LANGUAGE [RFC5545], Section 3.2.10 A.1.5.15. STYLED-DESCRIPTION [RFC9073], Section 6.5 * ALTREP [RFC5545], Section 3.2.1 * DERIVED [RFC9073], Section 5.3 * LANGUAGE [RFC5545], Section 3.2.10 A.1.5.16. SUMMARY [RFC5545], Section 3.8.1.12 * ALTREP [RFC5545], Section 3.2.1 A.1.5.17. TZNAME [RFC5545], Section 3.8.3.2 * LANGUAGE [RFC5545], Section 3.2.10 Author's Address Robert Stepanek Fastmail PO Box 234 Collins St West Melbourne VIC 8007 Australia Email: rsto@fastmailteam.com URI: https://www.fastmail.com Stepanek Expires 6 May 2027 [Page 122]