Elixir
ephemeris
Recurrence rules that read and write both RFC 5545 RRULE and plain English, with an occurrence engine to compute when they fire.
Intention
RRULE is the standard — portable, precise, what a calendar speaks — and unreadable in a config file; plain English is the opposite on every count. One structure behind both means a rule can be written the readable way, stored the portable way, and shown back either way, without two implementations that disagree. A rule says when, nothing else: no process, no timer, no implicit current time.
Example
{:ok, rule} = Ephemeris.parse("every last sunday of the month")
Ephemeris.to_rrule(rule) #=> "FREQ=MONTHLY;BYDAY=-1SU"
Ephemeris.to_sentence(rule) #=> "every last Sunday of the month"
Ephemeris.next(rule, ~U[2026-01-01 09:00:00Z])
#=> {:ok, ~U[2026-01-25 09:00:00Z]}Install
{:ephemeris, "~> 0.1"}