Skip to content

feat(devtoberfest): iCal + RSS calendar feeds and add-to-calendar links (#1714) - #1721

Merged
jung-thomas merged 2 commits into
mainfrom
worktree-devtoberfest-calendar-feeds
Aug 13, 2026
Merged

jung-thomas merged 2 commits into
mainfrom
worktree-devtoberfest-calendar-feeds

Conversation

@jung-thomas

Copy link
Copy Markdown
Contributor

Closes #1714.

Adds public iCal and RSS calendar feeds for the Devtoberfest schedule, plus per-session add-to-calendar links (Google/Outlook) and a page-level Subscribe (webcal) / RSS affordance.

What's included

New public, anonymous endpoints (reuse the existing assembleFeed; ?edition=<id> override, current edition default):

  • GET /api/devtoberfest/feed.ics — whole-schedule VCALENDAR, subscribable via webcal:// (text/calendar, public, max-age=300)
  • GET /api/devtoberfest/feed.xml — RSS 2.0 of sessions (application/rss+xml)
  • GET /api/devtoberfest/session/:id.ics — single-session download; ?to=google|outlook 302-redirects to the provider's add-event page (targets built server-side → no open-redirect surface)

Backend — pure helpers + thin routes, matching the devtoberfest-feed.js pattern:

  • parse-session-length.js (free-text SESSIONLENGTH → minutes, default 60 — the facade has no end time)
  • devtoberfest-ical.js (RFC 5545: UTC Z-form DTSTART/DTEND, CRLF line-folding that never splits a multi-byte char, text escaping)
  • devtoberfest-rss.js (RSS 2.0, RFC-822 dates, XML escaping)
  • assembleFeed now carries sessionLength + sessionCode

Approuter: feed routes added to the anonymous /api/devtoberfest/* alternation; new anonymous session/:id rule — both above the /api catch-all.

Frontend: edition-aware href builder (calendar-links.ts) keeps the client trivial (all date/URL logic stays server-side); DetailPanel gains Download .ics / Google / Outlook per scheduled session; the calendar header gains Subscribe + RSS.

Design decisions

  • UTC Z-form DTSTART/DTEND rather than TZID+VTIMEZONE — RFC-valid, unambiguous, clients localize automatically; avoids hand-authoring DST rules.
  • iCal is the universal calendar file format — no other file format adds value. "Add to calendar" is Google + Outlook deep links. RSS 2.0 for syndication (Atom/JSON Feed skipped).
  • CALENDARINVITE pass-through intentionally not used (parse+default chosen).

Testing

  • 83 unit tests: pure helpers (ICS structure/escaping/folding, RSS well-formedness, length parsing), route registration/anonymity, client href builder, DetailPanel + calendar App Vue specs — all green.
  • vite build (island gate) green.
  • Smoke tests added for the live feeds (test:smoke, post-deploy).
  • Docs: cdn-caching.md updated.

Deploy notes

  • srv-qa cp-list audit: no change needed — new srv/lib/* files are only reachable from the main srv routes, not from content-store.js's graph (which is what srv-qa copies).
  • Frontend touches app/island code → full deploy + content publish per the usual rules.

…ks (#1714)

Add public, anonymous calendar/syndication feeds for the Devtoberfest
schedule, plus per-session add-to-calendar affordances.

Backend (pure helpers + thin routes, mirroring devtoberfest-feed.js):
- srv/lib/parse-session-length.js: free-text SESSIONLENGTH -> minutes (default 60)
- srv/lib/devtoberfest-ical.js: RFC 5545 VCALENDAR (buildICS/buildEventICS),
  UTC Z-form DTSTART/DTEND, CRLF folding, text escaping, addToCalendarLinks
- srv/lib/devtoberfest-rss.js: RSS 2.0 (buildRSS)
- assembleFeed now carries sessionLength + sessionCode
- New anonymous routes reusing assembleFeed (?edition override):
  GET /api/devtoberfest/feed.ics (text/calendar, public max-age=300)
  GET /api/devtoberfest/feed.xml (application/rss+xml)
  GET /api/devtoberfest/session/:id.ics (single-session download;
      ?to=google|outlook 302-redirects via server-built links)

Approuter: feed.ics/feed.xml added to the anonymous alternation; new
anonymous session/:id rule (both above the /api catch-all).

Frontend:
- calendar-links.ts: edition-aware href builders (client stays trivial;
  all date/URL logic stays server-side)
- DetailPanel: Download .ics / Google / Outlook per scheduled session
- Calendar App: webcal Subscribe + RSS links in the header

Tests: 83 unit tests (pure helpers, routes, client helper, Vue) + smoke
tests for the live feeds. Docs: cdn-caching.md updated.
…nels

Per-session .ics / add-to-calendar links now carry the active edition in
the schedule and sessions-grid views too (previously calendar-only), so a
download while browsing a past edition resolves the correct session.
Closes the known limitation noted in #1714.
@jung-thomas
jung-thomas marked this pull request as ready for review August 13, 2026 14:43
@jung-thomas
jung-thomas merged commit 0557e95 into main Aug 13, 2026
5 checks passed
@jung-thomas
jung-thomas deleted the worktree-devtoberfest-calendar-feeds branch August 13, 2026 14:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

iCal and other Calendar Feeds (including RSS) for Devtoberfest

1 participant