Turns the Authenticate conference agenda page into an
.ics file you can import into Google Calendar, Outlook or Apple Calendar.
Generated calendars live in calendars/<year>/.
uv. The script declares its own dependencies
(beautifulsoup4, requests), so uv run installs them the first time.
# Full agenda for the default year -> calendars/2026/authenticate-2026.ics
uv run authenticate_ics.py
# A future year (assumes the URL pattern authenticate-u-s-<year> stays the same)
uv run authenticate_ics.py --year 2027
# If the URL or venue changes
uv run authenticate_ics.py --year 2027 --url https://authenticatecon.com/event/<slug>/ \
--venue "Some Hotel, City, ST"
# Preview in the terminal without writing a file
uv run authenticate_ics.py --list --no-breaks
# Personal subset
uv run authenticate_ics.py --no-breaks --search passkey -o calendars/2026/passkeys.ics
uv run authenticate_ics.py --day 2026-10-20 --track "Non-human"Filters can be repeated and combined: --day, --track, --room, --search
(title, abstract or speaker) and --no-breaks. --html saved.html parses a saved
copy of the page instead of fetching it.
- Start/end in
America/Los_Angeles, with an embeddedVTIMEZONE LOCATION: room plus venue addressDESCRIPTION: track, speakers (with company), full abstract, link to the agendaCATEGORIES: the track- Meals and breaks are marked free (
TRANSP:TRANSPARENT) - Stable
UIDs derived from the site's session IDs, so re-importing an updated file updates existing events rather than duplicating them
- Run
uv run authenticate_ics.py --year <year> --listto check the page parses. - If it 404s, find the new agenda URL and pass
--url. - If the venue moved, pass
--venue(and updateDEFAULT_VENUE/DEFAULT_YEARin the script). - If the time zone isn't Pacific, update
TZID/VTIMEZONEin the script. - If it reports "No sessions found", the page markup changed: the parser looks for
div.agenda__day[data-date]and.agenda__mobile-list .item--session[data-session-id]. - Commit the new
calendars/<year>/files.