# Offline calendar file — AC021 v1

Save `calendar-file-offline.html` to your device and open that saved file in a
modern browser with JavaScript enabled. No Node.js, installation, account or
internet connection is needed after saving. Keep this README alongside it if
sharing. The HTML includes its MIT license and all runtime code.

1. Paste your own CSV with exact ordered headers `title,start,end,location`.
2. Build the file. A fresh batch is generated automatically each time.
3. Review every title, location and converted UTC time. Download the ICS.
4. In your normal Google Calendar Settings → Import & export workflow, select
   the ICS and intended calendar before confirming. Inspect the imported events
   and remove unwanted entries manually. This file does not perform the import.

The initial fields are blank. The fictional example is explicitly sample use,
and edits remain sample use until “Start with my own events / reset” clears all
fields. Every edit clears the previous result and prevents a stale download.
Invalid input refuses the entire batch; no partial calendar file is offered.

Inputs and outputs remain in the open page's memory until reset or close. The
file makes no network requests, accesses no Google account, reads no calendar,
sends no invitations, and uses no browser storage or telemetry. Browser extensions
or your device's own clipboard/download handling are outside this file's control.
Copied and downloaded outputs contain your event details; protect them accordingly.
A saved HTML file starts blank on reopening and does not save entered event data.

Supply 1–25 rows and at most 100,000 characters. Titles are required; location
may be blank. Quoted commas and multiline text are supported. Timestamps need
seconds with Z or a known explicit ±HH:mm offset; fractional seconds, missing
zones and -00:00 are refused. End must be later and at most seven days later.
Supported UTC years are 0001–9999. Creation time and fresh batch identifiers are generated automatically. Importing
the same file again or rebuilding the same events can create duplicates; check
for existing events before importing. No recurrence,
all-day events, named timezone or daylight-saving rules, attendees or invitations.
Control characters and malformed Unicode are refused. ICS uses UTC, CRLF and
UTF-8 folding within 75 octets. Textarea display normalizes line endings; the
clipboard API and download preserve original ICS bytes. If clipboard access is
unavailable, output is selected for manual copying; prefer download for ICS.

The shared browser CSV, timestamp and calendar cores are bundled unchanged.
Rebuild: `node scripts/build-offline-calendar-file.mjs`. Check parity:
`node scripts/build-offline-calendar-file.mjs --check`. Local fictional QA and
downloads are separate from independent completion, reuse, payment and referrals.
No time saving or actual calendar-import outcome has been established.

## License

MIT License

Copyright (c) 2026 QuasiLife

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
