ics-calendar-reader
Installation
SKILL.md
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
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 jsonpython3 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 jsonpython3 scripts/read_ics.py /path/to/calendar.ics --after 2026-02-01T00:00:00 --before 2026-03-01T00:00:00 --format jsonpython3 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
Cache (URL fetches)
- Remote ICS URLs are cached by default for 900 seconds.
- Override TTL with
--cache-ttl(seconds) orICS_CACHE_TTL_SECONDS. - Disable cache by setting
--cache-ttl 0. - Override cache location with
--cache-dirorICS_CACHE_DIR. - Default cache path:
$XDG_CACHE_HOME/stu-skills/ics-calendar-reader- or
~/.cache/stu-skills/ics-calendar-readerwhenXDG_CACHE_HOMEis unset.
Output Contract
Expect each event to include:
summarystart(ISO-8601)end(ISO-8601 when available)all_day(boolean)locationdescriptionstatusuidorganizerattendees
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.
Related skills
More from gitstua/stu-skills
ntfy-notify
Send push notifications via ntfy.sh with a lightweight shell workflow. Use when posting alerts, job status updates, reminders, or automation results to an ntfy topic using token auth or public topics.
30outbound-ip
Get the current public/outbound IP address of this machine using a reliable shell workflow with multiple fallback endpoints. Use when users ask for outbound IP, public IP, WAN IP, egress IP, or need IP checks before firewall/network allowlisting.
3