All notable changes to this project are documented here. The format follows Keep a Changelog, and this project adheres to Semantic Versioning.
[v0.1.0] — 2026-08-16
Added
First release. Reads and writes RFC 8984 JSCalendar —
Event,TaskandGroup, with theLocation,VirtualLocation,Link,Relation,Participant,RecurrenceRule,NDayandAlertsub-objects.JSCalendar.decode/1dispatches on@type;JSCalendar.encode/1writes it back.No dependencies. Erlang's
:jsonand Elixir'sDurationare both standard library, so values map to standard types —LocalDateTimetoNaiveDateTime,UTCDateTimetoDateTime, and aString[Boolean]set to aMapSet. Requires Elixir 1.17 and OTP 27.Unknown properties round-trip. Anything the specification does not name is kept in each object's
extraand written back untouched, and a group entry of an unrecognised type is ignored rather than rejected or dropped, as RFC 8984 §5.3.1 requires.Properties equal to their RFC default are omitted on encode, so a document does not grow each time it is read and rewritten and encoding is idempotent.
JSCalendar.Patchimplements RFC 8984 §1.4.9 PatchObjects withapply/3andvalidate/1. An invalid pointer rejects the whole patch rather than applying part of it, and:ignoreand:onlyexpress the prefixes and suffixes the specification restricts particular properties to.JSCalendar.Occurrence.at/2builds one instance of a recurring object from its recurrence id, applying any override. It answers:excludeddistinctly from{:error, _}, andoverridden/1lists the ids an object varies.recurrenceOverridesandlocalizationsare typed as patch maps — keyed by recurrence id and language tag respectively — andtimeZonesasJSCalendar.TimeZonewithJSCalendar.TimeZoneRulestandard and daylight rules.