@@ -1,5 +1,10 @@
|
||||
# Changelog
|
||||
|
||||
## 0.2.0 - 2026-09-02
|
||||
|
||||
- Added a bounded multi-participant IANA-zone meeting planner based on explicit recurring work windows.
|
||||
- Added explicit Unix/Vixie, GitHub Actions, Croner, Quartz, and AWS EventBridge cron dialect validation, normalized previews and scheduler caveats, plus iCalendar Toolbox I/O metadata.
|
||||
|
||||
## 0.1.0 - 2026-09-01
|
||||
|
||||
- Added the initial local-first Time Tools workbench.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
==============================================================================
|
||||
@add-ideas/toolbox-contract@0.2.3
|
||||
@add-ideas/toolbox-contract@0.3.0
|
||||
Declared licence: Apache-2.0
|
||||
==============================================================================
|
||||
--- LICENSE ---
|
||||
@@ -198,7 +198,7 @@ Declared licence: Apache-2.0
|
||||
|
||||
|
||||
==============================================================================
|
||||
@add-ideas/toolbox-helpers@0.1.0
|
||||
@add-ideas/toolbox-helpers@0.2.0
|
||||
Declared licence: GPL-3.0-or-later
|
||||
==============================================================================
|
||||
--- LICENSE ---
|
||||
@@ -879,7 +879,7 @@ Public License instead of this License. But first, please read
|
||||
|
||||
|
||||
==============================================================================
|
||||
@add-ideas/toolbox-shell-react@0.2.3
|
||||
@add-ideas/toolbox-shell-react@0.3.0
|
||||
Declared licence: Apache-2.0
|
||||
==============================================================================
|
||||
--- LICENSE ---
|
||||
|
||||
+16
-4
@@ -1,19 +1,31 @@
|
||||
# Time Tools
|
||||
|
||||
Work with dates, time zones and recurrences locally in the browser.
|
||||
Plan across time zones and work with dates and recurrences locally in the browser.
|
||||
|
||||
Time Tools is a standalone local-first application in the [add·ideas Toolbox](https://git.add-ideas.de/lotobo/toolbox-portal). Inputs are processed in the browser and are not uploaded.
|
||||
|
||||
## Version 0.1 scope
|
||||
## Version 0.2 scope
|
||||
|
||||
- Exact signed epoch conversion through nanosecond precision
|
||||
- IANA-zone comparison, skipped/ambiguous local-time resolution and transition inspection
|
||||
- Side-by-side wall-clock and elapsed-duration arithmetic
|
||||
- Bounded 5/6/7-field cron and strict RFC 5545 RRULE occurrence previews
|
||||
- Bounded cron previews with explicit Unix/Vixie, GitHub Actions, Croner, Quartz and AWS EventBridge dialect rules, plus strict RFC 5545 RRULE previews
|
||||
- A bounded multi-participant meeting planner that compares entered recurring local work windows across IANA zones
|
||||
- Weekend/explicit-holiday business-day arithmetic and escaped UTC iCalendar event export
|
||||
- Bounded `.ics` file/paste import with structural validation, multiple-event inventory, VTIMEZONE inspection and recurrence previews that apply EXDATE/RDATE plus moved or cancelled RECURRENCE-ID overrides
|
||||
- Inert URL and attachment inspection: references are reported as data and are never fetched, opened, decoded or rendered
|
||||
|
||||
iCalendar import is limited to 8 MiB, 100,000 content properties, 20,000
|
||||
components, 10,000 events, 16 component levels and 1,000 previewed
|
||||
occurrences. Named TZIDs available to the browser are evaluated with its IANA
|
||||
data. Custom VTIMEZONE observances are inventoried, but recurrence expansion is
|
||||
withheld when the browser cannot execute that TZID rather than guessing an
|
||||
offset.
|
||||
|
||||
Named-zone results use the IANA data supplied by the browser runtime and can therefore vary with browser versions. ECMAScript Temporal does not represent leap seconds. The business-day calculator excludes weekends and only the holiday dates supplied by the user; it does not infer regional calendars. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) and [docs/PRIVACY-SECURITY.md](docs/PRIVACY-SECURITY.md).
|
||||
|
||||
Cron previews intentionally reject fields or extensions outside the selected dialect and show the normalized expression and scheduler caveats. The meeting planner reads no calendar, holiday, travel or presence data: every candidate comes only from the work windows and weekend choices entered in the page.
|
||||
|
||||
## Development
|
||||
|
||||
Requires Node.js 22 and npm 11.
|
||||
@@ -26,7 +38,7 @@ npm run test:browser
|
||||
|
||||
## Release
|
||||
|
||||
`npm run release:artifact` creates a deterministic `release/time-tools-0.1.0.zip` and checksum sidecar.
|
||||
`npm run release:artifact` creates a deterministic `release/time-tools-0.2.0.zip` and checksum sidecar.
|
||||
|
||||
## Licence
|
||||
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
# Corresponding source
|
||||
|
||||
The corresponding source for Time Tools 0.1.0 is available at:
|
||||
The corresponding source for Time Tools 0.2.0 is available at:
|
||||
|
||||
https://git.add-ideas.de/lotobo/time-tools/src/tag/v0.1.0
|
||||
https://git.add-ideas.de/lotobo/time-tools/src/tag/v0.2.0
|
||||
|
||||
Build with Node.js 22, npm 11, `npm ci`, and `npm run release:artifact`.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Third-party notices
|
||||
|
||||
Time Tools 0.1.0 directly depends on these runtime packages:
|
||||
Time Tools 0.2.0 directly depends on these runtime packages:
|
||||
|
||||
| Package | Pinned version | Declared licence |
|
||||
| -------------------------------- | -------------: | ---------------- |
|
||||
| `@add-ideas/toolbox-contract` | 0.2.3 | Apache-2.0 |
|
||||
| `@add-ideas/toolbox-helpers` | 0.1.0 | GPL-3.0-or-later |
|
||||
| `@add-ideas/toolbox-shell-react` | 0.2.3 | Apache-2.0 |
|
||||
| `@add-ideas/toolbox-contract` | 0.3.0 | Apache-2.0 |
|
||||
| `@add-ideas/toolbox-helpers` | 0.2.0 | GPL-3.0-or-later |
|
||||
| `@add-ideas/toolbox-shell-react` | 0.3.0 | Apache-2.0 |
|
||||
| `croner` | 10.0.1 | MIT |
|
||||
| `rrule-temporal` | 2.2.2 | MIT |
|
||||
| `temporal-polyfill` | 1.0.4 | MIT |
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
# Architecture
|
||||
|
||||
Time Tools is a static React/Vite application wrapped in the shared Toolbox shell. Its pure modules separate exact epoch parsing, named-zone resolution/transition inspection, calendar-versus-elapsed arithmetic, bounded recurrence preview, business-day calculation and UTC iCalendar generation.
|
||||
Time Tools is a static React/Vite application wrapped in the shared Toolbox shell. Its pure modules separate exact epoch parsing, named-zone resolution/transition inspection, calendar-versus-elapsed arithmetic, bounded recurrence preview, business-day calculation, UTC iCalendar generation and bounded iCalendar inspection.
|
||||
|
||||
`temporal-polyfill` supplies Temporal semantics while the browser runtime supplies IANA time-zone data. Croner handles explicitly selected 5/6/7-field cron syntax; `rrule-temporal` parses strict RFC 5545 recurrence rules with bounded iterations/candidate evaluations. iCalendar export resolves one named-zone wall time and writes escaped/folded UTC DTSTART/DTEND fields rather than an incomplete `VTIMEZONE`.
|
||||
|
||||
Version 0.1 operations are synchronous and bounded, so the app creates no worker and has no persistence or server API. Relative entry and asset URLs keep the build relocatable below a nested portal path.
|
||||
`time/recurrence.ts` places an explicit dialect adapter in front of Croner. It validates field counts, portable subsets, UTC-only schedulers, day-of-month/day-of-week semantics and scheduler-specific caveats before generating a bounded preview. `time/meeting.ts` advances a bounded instant range at a declared step, projects each candidate into every participant's IANA zone, and accepts it only when the fixed elapsed interval stays inside all entered same-day work windows.
|
||||
|
||||
`time/ics-inspect.ts` unfolds and tokenises imported calendars into a bounded component tree, validates calendar/event structure, inventories `VTIMEZONE` observances, and previews multiple recurring events with `RDATE`, `EXDATE`, and moved or cancelled `RECURRENCE-ID` overrides. It preserves floating/all-day semantics during preview. Unsupported custom-zone recurrence and `RANGE=THISANDFUTURE` overrides produce diagnostics and withheld occurrences instead of guessed instants. URLs and attachments remain inert metadata records.
|
||||
|
||||
Version 0.2 operations are synchronous and bounded, so the app creates no worker and has no persistence or server API. Relative entry and asset URLs keep the build relocatable below a nested portal path.
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
# Privacy and security
|
||||
|
||||
Time values, schedules and calendar fields stay in page memory. There is no telemetry, analytics, account, persistence or runtime network path. Exported ICS text is escaped and UTF-8 line-folded; users choose whether to download/import it into another application.
|
||||
Time values, schedules and imported calendar fields stay in page memory. There is no telemetry, analytics, account, persistence or runtime network path. Exported ICS text is escaped and UTF-8 line-folded; users choose whether to download/import it into another application. Imported URL and ATTACH values are displayed only as inert text/JSON: URIs are never followed and embedded Base64 is inventoried rather than decoded.
|
||||
|
||||
Epoch input uses signed integer arithmetic and rejects exponent/fraction syntax. Recurrence output is limited to 1,000 occurrences, RRULE evaluation uses hard iteration/candidate bounds, business-day movement is limited to ±100,000 days, and explicit holidays to 10,000 bounded ISO dates. Calendar text fields and zone/duration inputs are length-bounded before parsing.
|
||||
Epoch input uses signed integer arithmetic and rejects exponent/fraction syntax. Recurrence output is limited to 1,000 occurrences, RRULE evaluation uses hard iteration/candidate bounds, business-day movement is limited to ±100,000 days, and explicit holidays to 10,000 bounded ISO dates. Calendar imports are limited by source size, line/property/component/event counts, component depth, unfolded-line length and occurrence count; calendar text fields and zone/duration inputs are length-bounded before parsing.
|
||||
|
||||
Named-zone results depend on the IANA data supplied by the browser/runtime and can vary across versions. Temporal does not represent leap seconds. Cron semantics vary by implementation; the selected field count and common Unix day-of-month/day-of-week OR rule are shown. Business days mean Monday–Friday minus only the dates entered, not a regional legal calendar.
|
||||
Named-zone results depend on the IANA data supplied by the browser/runtime and can vary across versions. Temporal does not represent leap seconds. Cron semantics vary by implementation; the chosen dialect, exact field count, normalized expression and day-field rule are shown, while remote delivery/misfire behavior is explicitly outside the preview. Business days mean Monday–Friday minus only the dates entered, not a regional legal calendar.
|
||||
|
||||
Meeting candidates use only the entered participant names, IANA zones, work windows and weekend flags. The search is capped at 24 participants, 31 days and 100 results and performs no calendar lookup. A candidate is scheduling arithmetic, not evidence that a person is actually available.
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
const CACHE_PREFIX = "time-tools-shell-";
|
||||
const CACHE_NAME = CACHE_PREFIX + "0.1.0";
|
||||
const CACHE_NAME = CACHE_PREFIX + "0.2.0";
|
||||
const CORE = ["./", "./manifest.webmanifest", "./favicon.svg"];
|
||||
self.addEventListener("install", (event) => {
|
||||
event.waitUntil(
|
||||
|
||||
+21
-4
@@ -3,12 +3,12 @@
|
||||
"schemaVersion": 1,
|
||||
"id": "de.add-ideas.time-tools",
|
||||
"name": "Time Tools",
|
||||
"version": "0.1.0",
|
||||
"description": "Work with dates, time zones and recurrences locally in the browser.",
|
||||
"version": "0.2.0",
|
||||
"description": "Plan across time zones and preview explicit recurrence dialects locally.",
|
||||
"entry": "./",
|
||||
"icon": "./favicon.svg",
|
||||
"categories": ["time", "developer", "productivity"],
|
||||
"tags": ["timestamp", "timezone", "cron", "rrule", "ics"],
|
||||
"tags": ["timestamp", "timezone", "meeting", "cron", "rrule", "ics"],
|
||||
"integration": {
|
||||
"contextVersion": 1,
|
||||
"launchModes": ["navigate", "new-tab"],
|
||||
@@ -21,9 +21,26 @@
|
||||
"crossOriginIsolated": false,
|
||||
"topLevelContext": false
|
||||
},
|
||||
"io": {
|
||||
"accepts": [
|
||||
{
|
||||
"mediaType": "text/calendar",
|
||||
"extensions": [".ics"],
|
||||
"label": "iCalendar"
|
||||
}
|
||||
],
|
||||
"produces": [
|
||||
{
|
||||
"mediaType": "text/calendar",
|
||||
"extensions": [".ics"],
|
||||
"label": "iCalendar event"
|
||||
}
|
||||
]
|
||||
},
|
||||
"capabilities": { "required": [], "optional": ["clipboard-write"] },
|
||||
"privacy": {
|
||||
"processing": "local",
|
||||
"fileUploads": false,
|
||||
"fileUploads": true,
|
||||
"telemetry": false,
|
||||
"label": "Inputs stay in this browser; nothing is uploaded."
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user