ICS Calendar Reader
Parse .ics files with scripts/read_ics.py instead of hand-parsing text.
Prerequisite
- •Set
ICS_URLSto one or more calendar URLs (comma-separated).- •Example:
export ICS_URLS="https://example.com/a.ics,https://example.com/b.ics"
- •Example:
- •Secrets/defaults file:
~/.config/stu-skills/ics-calendar-reader/.env- •The script reads this path from
ics-calendar-reader/.env-pathautomatically.
- •The script reads this path from
- •If
ICS_URLSis missing and noics_pathis provided, the script exits with an instruction for the agent to ask the user for it. - •Do not paste private calendar URLs in prompts or command lines; run the script and let it read from env.
- •The parser refuses
--urlinputs by design and instructs usingICS_URLSfrom.env. - •
ICS_URLSentries usingwebcal://orwebcals://are normalized tohttps://automatically.
.env Sample
Path: ~/.config/stu-skills/ics-calendar-reader/.env
dotenv
ICS_URLS="https://example.com/a.ics,https://example.com/b.ics"
Workflow
- •Run the parser on the file and request JSON for reliable downstream use:
- •
python3 scripts/read_ics.py /path/to/calendar.ics --format json - •
python3 scripts/read_ics.py --format json
- •
- •Filter to upcoming events or a window:
- •
python3 scripts/read_ics.py /path/to/calendar.ics --after now --limit 20 --format json - •
python3 scripts/read_ics.py /path/to/calendar.ics --after 2026-02-01T00:00:00 --before 2026-03-01T00:00:00 --format json - •
python3 scripts/read_ics.py --after now --limit 20 --format json
- •
- •Use text output for quick human review:
- •
python3 scripts/read_ics.py /path/to/calendar.ics --format text
- •
Output Contract
Expect each event to include:
- •
summary - •
start(ISO-8601) - •
end(ISO-8601 when available) - •
all_day(boolean) - •
location - •
description - •
status - •
uid - •
organizer - •
attendees
Notes
- •Treat parsed JSON as source of truth for further transformations.
- •Keep timezone-aware datetimes intact; do not strip offsets.
- •When presenting datetimes to users, default to local timezone with format
Sat 7 Feb 2026 16:43(%a %-d %b %Y %H:%M). - •For recurring events, treat each VEVENT record present in the file as one parsed item.
- •If needed, read
references/ics-fields.mdfor quick field semantics. - •For private calendar subscriptions, store URLs in
ICS_URLSand avoid inline URLs entirely.