Skip to content

Releases: lukewilliamboswell/roc-time

0.3.1

Choose a tag to compare

@github-actions github-actions released this 24 Oct 05:42
Immutable release. Only release title and notes can be modified.
09a15da

roc-time 0.3.1

This patch release keeps roc-time building with the current Roc nightly. Its
API and behavior are the same as 0.3.0.

With nightly-2026-10-23-18478ff, an optimized build of an application that
calls EventCollection.from_entries could hang, or crash the compiler in a
fuzz build. The collection now records the identities it has seen in a set,
which avoids the compiler defect
(roc-lang/roc#12559). Duplicate
identities are still rejected with the first repeated ID, and events keep their
input order.

The examples archive is bound to this release’s packages.

Packages

app [main!] {
	time: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.3.1/roc-time-EXAwmterdosj35koAhDK795YhRxhCkNM5yS46QuEm1w8.tar.zst",
	zones: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.3.1/roc-time-tzdb-CAwndLnRZKh4cJh6SaPXH6Bx6AnQ3arNn2je66b22gVM.tar.zst",
}

zones is optional: it carries the IANA time-zone data and imports no roc-time modules.

  • time sha256 11ea88a1659b0490c5ccb63de402c91dbab5f3d1c9d1005e1e45b9b23acc446e
  • zones sha256 231853b5b876976eea9a975ade3b685f3bef88e4c541550542073befacca812b

Examples

roc-time-examples-0.3.1.zip holds the repository's example applications bound to these two URLs.

Documentation

API reference · PDF manual · HTML manual archive

Compilers

  • Built and tested with roc version: Roc compiler version nightly-2026-10-23-18478ff
  • Repository tooling ran on roc-stable version: Roc compiler version nightly-2026-10-23-18478ff

The package headers do not pin a compiler. Install the compiler named by roc version above, or a later nightly.

0.3.0

Choose a tag to compare

@github-actions github-actions released this 19 Oct 22:49
Immutable release. Only release title and notes can be modified.
2ec0a0a

roc-time 0.3.0

This release adds date interval descriptions, updates the bundled timezone rules
and makes the manual easier to follow.

CalendarInterval and EdtfInterval preserve independently described endpoints.
For example, 2004-02-01/2005-02 keeps a day at the start and a month at the end.
An unknown end (1985/) stays distinct from an open end (1985/..). Checked
construction, parsing, canonical text and codecs retain those meanings for
storage and exchange. The new archive intervals application shows how to use
them. This is a declared EDTF date-interval subset; interpreting these
descriptions as timeline coverage remains unsupported.

The optional zone package now contains IANA 2026e rules from tzdata 2026.5.
This corrects changed offsets, including a Winnipeg appointment at 09:00 on
2026-11-02: the updated rules resolve it to 14:00 UTC. All previously accepted
zone names remain available.

Recurrence behavior is unchanged. New independent checks cover 108 composed
local-zone schedules, including gaps, folds, exclusions, ending intent and
resumption. They complement the existing UTC fixtures and bounded resource
checks.

The guides now start with concrete tasks and real example output. The HTML and
PDF manual remove repeated chapter-home links and give the supported-format
summary more room. The examples archive includes the new archive intervals
application, bound to this release’s packages.

Thanks to Kip Cole and the Tempo contributors for the ideas behind roc-time’s
interval-oriented model.

Packages

app [main!] {
	time: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.3.0/roc-time-AiV5qBaNksnBWhN6TRqiQJDqBh7iKxnxxAu7J4CBVJ7w.tar.zst",
	zones: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.3.0/roc-time-tzdb-CAwndLnRZKh4cJh6SaPXH6Bx6AnQ3arNn2je66b22gVM.tar.zst",
}

zones is optional: it carries the IANA time-zone data and imports no roc-time modules.

  • time sha256 7b88c6a0a85c7105755bcb89dab46c0f80efc4b1331db188dc6cdad301167704
  • zones sha256 231853b5b876976eea9a975ade3b685f3bef88e4c541550542073befacca812b

Examples

roc-time-examples-0.3.0.zip holds the repository's example applications bound to these two URLs.

Documentation

API reference · PDF manual · HTML manual archive

Compilers

  • Built and tested with roc version: Roc compiler version nightly-2026-10-19-601b54c
  • Repository tooling ran on roc-stable version: Roc compiler version nightly-2026-10-09-258ab27

The package headers do not pin a compiler. Install the compiler named by roc version above, or a later nightly.

0.2.0

Choose a tag to compare

@github-actions github-actions released this 19 Oct 20:45
Immutable release. Only release title and notes can be modified.
4d436b4

roc-time 0.2.0

This release expands calendar, recurrence and interchange support, and runs on
the current Roc nightly. It includes complete example applications bound to the
released packages, plus an archived API reference and an offline HTML/PDF manual.

Calendar APIs now cover Gregorian and Julian conversion, calendar queries and
explicit calendar arithmetic. Recurrence APIs support bounded, resumable date
and timed schedules, with checked iCalendar import and export, exceptions and
cancellations. Interpretation keeps local selections, appointments, gaps and
folds distinct; named-zone data remains an optional companion package.

Additional examples demonstrate meeting exchange, historical archive search,
availability, invoice reporting and named-zone appointments. Download the
examples archive below to run them against this release.

Package headers now float on the nightly compiler. Use the tested compiler
listed below when reproducing a result. Repository automation runs separately
on a Blueprint-pinned compiler. Releases verify every uploaded asset before
publication; versioned API documentation is restored from those same assets.
The guide site now uses the shared native roc-docs renderer, with a linked PDF
containing all eight guides. Existing guide routes and versioned API URLs remain
available.

The supported standard profiles and limits remain documented in each module;
these APIs do not claim complete ISO 8601, EDTF or RFC 5545 support.

Thanks to Kip Cole and the Tempo contributors for the ideas behind roc-time’s
interval-oriented model.

Packages

app [main!] {
	time: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.2.0/roc-time-7QH5VBiCwDLu3UkizpgB3FESJitahxR82Vgg2bWkJvHL.tar.zst",
	zones: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.2.0/roc-time-tzdb-BhQ58Vm59U2L2GHSo8E2gHzvn3PbfmmrMsj22x67SzL4.tar.zst",
}

zones is optional: it carries the IANA time-zone data and imports no roc-time modules.

  • time sha256 a4ac07c63f05024f92b232c8d63a618b7f6218259d8cb85827a6f2a6fef2f6b9
  • zones sha256 26e70efb6ab7cec60fd6a2c6343b3cbed6f95662d5998e84e2ce4e447e7498ce

Examples

roc-time-examples-0.2.0.zip holds the repository's example applications bound to these two URLs.

Documentation

API reference · PDF manual · HTML manual archive

Compilers

  • Built and tested with roc version: Roc compiler version nightly-2026-10-19-601b54c
  • Repository tooling ran on roc-stable version: Roc compiler version nightly-2026-10-09-258ab27

The package headers do not pin a compiler. Install the compiler named by roc version above, or a later nightly.

0.2.0-rc1

0.2.0-rc1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 01 Oct 04:20
bf566b5

Try roc-time

Download the starter kit for booking, reporting, appointment display, schedule exchange, staffing and clock deadline examples. Use Roc nightly-2026-09-27-a3ce7f1; each application declares its compiler in its header. Unzip the kit, enter examples/booking_exchange, and run roc main.roc. Python is not required.

Packages

Copy this into main.roc and run roc main.roc with the compiler linked above:

app [main!] {
	roc: "nightly-2026-09-27-a3ce7f1",
	time: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.2.0-rc1/roc-time-GPETAiR4TeEPxDA1F6qHxbDnFexmj4tYgUrkEryBhtdP.tar.zst",
	zones: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.2.0-rc1/roc-time-tzdb-Ew1nW7PzcwxnidgmDydRHnYyQRB4sjq2dD7H2DDpsyMj.tar.zst",
}
import zones.Database
import time.ZoneRules

main! = |_args| {
	data = Database.get("Australia/Melbourne")?
	rules = ZoneRules.from_database(data)?
	echo!(ZoneRules.name(rules))
	Ok({})
}

The tzdb dependency is optional; omit it when using only core operations.

What's Changed

  • Separate development compiler updates from published examples by @lukewilliamboswell in #2
  • Update docs and published examples for 0.1.0-rc2 by @github-actions[bot] in #10
  • Bump actions/configure-pages from 5.0.0 to 6.0.0 by @dependabot[bot] in #9
  • Bump actions/upload-pages-artifact from 3.0.1 to 5.0.0 by @dependabot[bot] in #8
  • Bump actions/download-artifact from 4.3.0 to 8.0.1 by @dependabot[bot] in #6
  • Bump actions/deploy-pages from 4.0.5 to 5.0.1 by @dependabot[bot] in #7
  • Bump actions/checkout from 4.4.0 to 7.0.1 by @dependabot[bot] in #5
  • Update Roc nightly to nightly-2026-09-06-d85e877 by @github-actions[bot] in #11
  • Update docs and published examples for 0.1.0-rc3 by @github-actions[bot] in #12
  • Bump actions/setup-python from 6.3.0 to 7.0.0 by @dependabot[bot] in #15
  • Bump actions/upload-artifact from 4.6.2 to 7.0.1 by @dependabot[bot] in #14
  • Update docs and published examples for 0.1.0 by @github-actions[bot] in #13
  • Update Roc nightly to nightly-2026-09-08-39a3f89 by @github-actions[bot] in #16
  • Unblock nightly compiler validation by @lukewilliamboswell in #18
  • Update Roc nightly to nightly-2026-09-19-d025939 by @github-actions[bot] in #19
  • Support nightly-2026-09-27: implicit open unions, roc-fuzz 0.4.2, schedule-definition hash by @lukewilliamboswell in #21

New Contributors

Full Changelog: 0.1.0...0.2.0-rc1

Roc API Changes

API comparison failed; API compatibility was not established.
Diagnostic output condensed from 93956 bytes.
Full comparison output: release-metadata artifact (bump-output.txt) and logs at https://github.com/lukewilliamboswell/roc-time/actions/runs/36812895986
Raw output SHA-256: 95574a23ac3577f347c8e03aec11aac4e2c2cbed8e1805f3e2612d8972c78657

Final diagnostic excerpt (preceding output omitted):

This tag union has an explicit `..`, but it is already implicitly open.

database_boundary : I64 -> Try(PosixBoundary, [OutOfRange, ..])
                                                           ^^

Tag unions in output positions, like the return type of a function, are
automatically open. Remove the .. or bind it to a named type variable like
..others if you want to refer to the extension elsewhere.

── ● redundant open tag union ─ ../../../.cache/roc/packages/6gt2mALoAXMVKcQvCpdisfaAU3S9XVdV3vR2CNA7e43t/ZoneRules.roc:202:298

This tag union has an explicit `..`, but it is already implicitly open.

from_database : Database -> Try(ZoneRules, [UnsupportedSchema(U16), UnsupportedAxis(Str), UnsupportedFutureHandling(Str), MissingProvenance, EmptyName, EmptyVersion, TransitionOutsideValidity, UnorderedTransitions, InvalidOffsetBounds, OffsetOutsideBounds, EmptySpan, ReversedBounds, OutOfRange, ..])
                                                                                                                                                                                                                                                                                                        ^^

Tag unions in output positions, like the return type of a function, are
automatically open. Remove the .. or bind it to a named type variable like
..others if you want to refer to the extension elsewhere.

── ● redundant open tag union ─ ../../../.cache/roc/packages/6gt2mALoAXMVKcQvCpdisfaAU3S9XVdV3vR2CNA7e43t/ZoneRules.roc:320:183

This tag union has an explicit `..`, but it is already implicitly open.

choose : Classification, { occurrence : OccurrencePolicy, gap : [RejectGap, UseOffsetBeforeGap] } -> Try(BoundaryChoice, [Gap, Ambiguous, AmbiguousGap, OffsetConflict, OutOfRange, ..])
                                                                                                                                                                                    ^^

Tag unions in output positions, like the return type of a function, are
automatically open. Remove the .. or bind it to a named type variable like
..others if you want to refer to the extension elsewhere.

── ● redundant open tag union ─ ../../../.cache/roc/packages/6gt2mALoAXMVKcQvCpdisfaAU3S9XVdV3vR2CNA7e43t/ZoneRules.roc:504:150

This tag union has an explicit `..`, but it is already implicitly open.

resolve_occurrence : ZoneRules, LocalDateTime, OccurrencePolicy -> Try(PosixBoundary, [Gap, Ambiguous, OffsetConflict, OutsideValidity, OutOfRange, ..])
                                                                                                                                                    ^^

Tag unions in output positions, like the return type of a function, are
automatically open. Remove the .. or bind it to a named type variable like
..others if you want to refer to the extension elsewhere.

── ● redundant open tag union ─ ../../../.cache/roc/packages/6gt2mALoAXMVKcQvCpdisfaAU3S9XVdV3vR2CNA7e43t/ZoneRules.roc:523:199

This tag union has an explicit `..`, but it is already implicitly open.

appointment : ZoneRules, LocalDateTime, OccurrencePolicy, LocalDateTime, OccurrencePolicy -> Try(PosixSpan, [Gap, Ambiguous, OffsetConflict, OutsideValidity, OutOfRange, EmptySpan, ReversedBounds, ..])
                                                                                                                                                                                                     ^^

Tag unions in output positions, like the return type of a function, are
automatically open. Remove the .. or bind it to a named type variable like
..others if you want to refer to the extension elsewhere.

── ✗ cannot extract public api ─────────────────────────────────────────────────

roc bump failed.

The old package's public API references the type `ICalRuleParts.Error`, which is not itself part of the exposed API.

Docs

This release pilots the roc-0.1.x support workflow with
nightly-2026-09-27-a3ce7f1 standing in for a future stable Roc compiler.
It does not claim compatibility with an upstream stable Roc 0.1 release.

0.1.0

Choose a tag to compare

@github-actions github-actions released this 07 Sep 12:40
f3f6ee2

Try roc-time

Download the starter kit for booking, reporting, appointment display, schedule exchange, staffing and clock deadline examples. Use Roc nightly-2026-09-05-b195f5b; each application declares its compiler in its header. Unzip the kit, enter examples/booking_exchange, and run roc main.roc. Python is not required.

Packages

Copy this into main.roc and run roc main.roc with the compiler linked above:

app [main!] {
	roc: "nightly-2026-09-05-b195f5b",
	time: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.1.0/roc-time-6gt2mALoAXMVKcQvCpdisfaAU3S9XVdV3vR2CNA7e43t.tar.zst",
	zones: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.1.0/roc-time-tzdb-3JTmpDV26cHNH7cN1HqHzUWTZKpyaYgLYkWSws8Tqj3e.tar.zst",
}
import zones.Database
import time.ZoneRules

main! = |_args| {
	data = Database.get("Australia/Melbourne")?
	rules = ZoneRules.from_database(data)?
	echo!(ZoneRules.name(rules))
	Ok({})
}

The tzdb dependency is optional; omit it when using only core operations.

Everyday dates, appointments and availability

This release improves ordinary civil-date and clock parsing, canonical text output, English Gregorian presentation, and weekday, ordinal-day and ISO-week queries. Runnable applications cover invoice terms and reporting, overnight staffing, named-zone appointment display, availability and meeting exchange. Zone rules, ambiguous-time choices and calendar arithmetic policies remain explicit.

DATE and timed iCalendar recurrence definitions can be exported as canonical extracted property values without expanding the series. Timed rules support UTC, floating and zoned modes, PERIOD additions, and UTC cancellations for zoned starts. A UTC exclusion matches the selected boundary, including colliding source labels, without replenishing COUNT. ScheduleDefinition separates a checked schedule declaration from the query windows used to execute it.

Changes from rc3

  • Calendar types now live under Calendar.Date, Calendar.Delta, Calendar.Value and Calendar.Arithmetic. Calendar profiles remain Calendar values. Generated API documentation includes the nested types and their methods.
  • The iCalendar adapters use ICalDateRule, ICalDateTime, ICalDuration, ICalPeriod and ICalTimedRule in place of the corresponding Rfc names.
  • The private Persistence archive API has been removed. Store supported canonical standard text directly, with application-owned interpretation context where required. A resolved value or arbitrary native rule is not automatically representable in every text profile.
  • ZoneRules.project combines explicit zone projection with its selected offset; TimedOccurrence.source exposes the original local start label, including when a gap adjustment changes its resolved projection.

Timestamp parsing avoids temporary byte-list allocations. Coverage operations avoid copying unchanged input for empty-operand identities, and sorted construction avoids repeated rebuilding. These changes retain checked errors, microsecond precision and explicit work limits; they are not a claim that every workload is faster.

Supported scope

Timestamp profiles retain up to six fractional digits and reject unsupported precision instead of silently rounding. iCalendar DATE/DATE-TIME values use years 0001–9999; timed iCalendar values use whole seconds. Recurrence adapters accept extracted values, not complete ICS documents, and enforce bounded input/output profiles. EDTF support covers qualified Gregorian dates rather than every EDTF form. IXDTF annotations preserve supported declaration meaning but require explicit matching rules for named-zone interpretation. Leap seconds and unsupported critical annotations remain explicit failures.

Full Changelog: 0.1.0-rc3...0.1.0

Roc API Changes

── ✗ cannot extract public api ─────────────────────────────────────────────────

roc bump failed.

The old package's public API references the type `PersistenceCivil.Error`, which is not itself part of the exposed API.

Docs

This release pilots the roc-0.1.x support workflow with
nightly-2026-09-05-b195f5b standing in for a future stable Roc compiler.
It does not claim compatibility with an upstream stable Roc 0.1 release.

0.1.0-rc3

0.1.0-rc3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 07 Sep 01:17
c4cf2ff

Try roc-time

Download the starter kit for booking, archive search and staffing examples. Use Roc nightly-2026-09-05-b195f5b; each application declares its compiler in its header. Unzip the kit, enter examples/booking_exchange, and run roc main.roc. Python is not required.

Packages

Copy this into main.roc and run roc main.roc with the compiler linked above:

app [main!] {
	roc: "nightly-2026-09-05-b195f5b",
	time: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.1.0-rc3/roc-time-9gC9GQxjZjAaAPGwaGwSYCGfTuN5ED4AstyM9vdCPe5o.tar.zst",
	zones: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.1.0-rc3/roc-time-tzdb-FgMq4S7KKindobxXL7PrFNnbmMqavB4h8ehZKCzE9VGC.tar.zst",
}
import zones.Database
import time.ZoneRules

main! = |_args| {
	data = Database.get("Australia/Melbourne")?
	rules = ZoneRules.from_database(data)?
	echo!(ZoneRules.name(rules))
	Ok({})
}

The tzdb dependency is optional; omit it when using only core operations.

Full Changelog: 0.1.0-rc2...0.1.0-rc3

Docs

This release pilots the roc-0.1.x support workflow with
nightly-2026-09-05-b195f5b standing in for a future stable Roc compiler.
It does not claim compatibility with an upstream stable Roc 0.1 release.

0.1.0-rc2

0.1.0-rc2 Pre-release
Pre-release

Choose a tag to compare

@lukewilliamboswell lukewilliamboswell released this 07 Sep 00:12
6109e07

Try roc-time

Download the starter kit for booking, archive search and staffing examples. Use Roc nightly-2026-09-05-b195f5b; each application declares its compiler in its header. Unzip the kit, enter examples/booking_exchange, and run roc main.roc. Python is not required.

Packages

Copy this into main.roc and run roc main.roc with the compiler linked above:

app [main!] {
	roc: "nightly-2026-09-05-b195f5b",
	time: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.1.0-rc2/roc-time-9gC9GQxjZjAaAPGwaGwSYCGfTuN5ED4AstyM9vdCPe5o.tar.zst",
	zones: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.1.0-rc2/roc-time-tzdb-FgMq4S7KKindobxXL7PrFNnbmMqavB4h8ehZKCzE9VGC.tar.zst",
}
import zones.Database
import time.ZoneRules

main! = |_args| {
	data = Database.get("Australia/Melbourne")?
	rules = ZoneRules.from_database(data)?
	echo!(ZoneRules.name(rules))
	Ok({})
}

The tzdb dependency is optional; omit it when using only core operations.

Compiler-support workflow pilot

This candidate uses nightly-2026-09-05-b195f5b on the roc-0.1.x branch as a stand-in for a future stable compiler. It does not claim compatibility with upstream stable Roc 0.1.

Validation and API comparison

Both package bundles and the starter kit passed the release validation. Publication was recovered from those exact artifacts after release notes exceeded GitHub’s size limit; the original tag and package contents are unchanged.

API compatibility with rc1 could not be established by roc bump: the compiler could not extract the old public API. This prerelease includes a compiler syntax migration; use the declared compiler. Full comparison diagnostics are in that run’s release-metadata artifact.

Documentation · Changes since rc1

0.1.0-rc1

0.1.0-rc1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 06 Sep 20:33
688ce3b

Try roc-time

Download the starter kit for booking, archive search and staffing examples. Use Roc nightly-2026-09-04-c125b82; the kit includes complete applications and checks the compiler version before running.

Packages

Copy this into main.roc and run roc main.roc with the compiler linked above:

app [main!] {
	time: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.1.0-rc1/roc-time-2T6KR7B59FhCSNghyPAgP2j61YiU1F537CkB6UFUwzfY.tar.zst",
	zones: "https://github.com/lukewilliamboswell/roc-time/releases/download/0.1.0-rc1/roc-time-tzdb-5xpCNbPVbrBRi2GC7kKEg91eQVjLQrkAb5F1FHy4THgD.tar.zst",
}
import zones.Database
import time.ZoneRules

main! = |_args| {
	data = Database.get("Australia/Melbourne")?
	rules = ZoneRules.from_database(data)?
	echo!(ZoneRules.name(rules))
	Ok({})
}

The tzdb dependency is optional; omit it when using only core operations.

Full Changelog: https://github.com/lukewilliamboswell/roc-time/commits/0.1.0-rc1

Docs