Talks: one page per talk, generated from TOML records - #48
Conversation
Talks were only recorded in the Google Calendar, so links pointed at calendar entries and nothing about a past talk survived on the site. Each talk now has a record in `_data/talks/*.toml` (title, speakers, bios, abstract, location, Zoom, slides, recording, ...) and its own page under `/talks/<date>-<speaker>/`. GitHub Pages builds Jekyll in safe mode, so the pages cannot be produced by a plugin at build time: `scripts/generate_talks.py` turns the TOML records into `_talks/*.md` and both are committed. A new workflow re-runs the generator with `--check` on every PR so the two can't drift apart. - `scripts/import_calendar_talks.py` seeds records from the public calendar feed (178 talks, 2020-2026); imported records are flagged `needs_review = true` - `_layouts/talk.html` renders a talk: abstract, speaker bios and links, slides, recording; Zoom links are only shown while a talk is still upcoming - `/talks/` lists upcoming talks, then past talks by year - `seminar.md` and `_includes/next_talks.html` now read from these records instead of fetching the Google Calendar with JavaScript - `future: true` in `_config.yml`, otherwise Jekyll hides upcoming talks - README documents how to add a talk Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Set up Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: "3.11" | ||
|
|
||
| - name: Check that _talks/ matches _data/talks/ | ||
| run: python3 scripts/generate_talks.py --check |
- every record gets tags from a fixed ~20-term vocabulary (23 topics);
scripts/tag_talks.py fills them in from the title, abstract, and bio, and
never touches tags that were set by hand
- /talks/ gains a search box (title, speaker, affiliation, abstract, location,
date), plus tag, speaker, and year filters, all running in the browser over
the list the page already ships -- no index, no service, and the full list
still renders without JavaScript
- filters are shareable as links (/talks/?tag=robotics), and the tags on a talk
page link back into the filtered archive
- speaker websites now show as an explicit link on the talk page, not only as a
hyperlink on the name
Also fixes calendar-import parsing that had been mangling records: summaries
shaped "Data Science Lecture Series. Speaker: Name, Affiliation" (all of fall
2023) lost their speaker, logistics lines ("Zoom link: ...", "Talks will be
held in LNCO 1100") were being read as talk titles, and "A and B" speaker pairs
were mistaken for titles. Non-talks (orientations, info sessions) are skipped,
and a talk whose title is genuinely unknown is now titled "Talk by <speaker>"
rather than "TBA".
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Pushed the follow-ups from review: Speaker websites. The talk page now shows an explicit link ( Tags. Every record now carries
Search. Verified against a local build: 176 talk pages, searching "robot" narrows to 9, the robotics tag to 8, "measles" finds the one talk that mentions it only in its abstract, and the speaker dropdown carries 169 names. One thing worth flagging: wiring up the tags surfaced parsing bugs in the calendar import that I had missed on the first pass, so this push also re-imports the records. All of fall 2023 had |
Talks only existed in the Google Calendar: the site linked out to calendar entries, and nothing about a past talk (abstract, speaker bio, slides, recording) survived anywhere. This adds a small pipeline so every talk gets a permanent page on the site.
How it works
_data/talks/, e.g.2026-09-04-george-vega-yon.toml— title, date/time, location, Zoom, slides, recording, abstract, and one[[speakers]]block per speaker (name, affiliation, website, photo, bio).make talks(scripts/generate_talks.py) turns each record into_talks/<name>.md, published at/talks/<name>/..github/workflows/talks.ymlre-runs the generator with--checkon every PR, so the pages can never drift from the records.Why generate instead of reading TOML at build time? GitHub Pages builds Jekyll in safe mode, so custom plugins (the usual way to read TOML) are unavailable — the pages have to exist in the repo.
What is in this PR
_data/talks/*.toml_data/talks/_TEMPLATE.tomlscripts/generate_talks.py_talks/*.md; validates records, removes orphans,--checkmode for CIscripts/import_calendar_talks.py_layouts/talk.htmltalks.md/talks/— upcoming talks, then past talks grouped by year_includes/next_talks.htmlseminar.md_config.ymltalkscollection, andfuture: true(Jekyll hides future-dated documents otherwise, which would have hidden every upcoming talk)README.mdVerified by building the site with Jekyll 3.10 (the GitHub Pages version): 178 talk pages + the archive, no warnings.
About the seeded records
The 178 records were parsed from the calendar's iCal feed. Calendar descriptions are free-form, so this is a first pass: every imported record carries
needs_review = trueunder[meta]. What came through well: titles, speaker names, dates, locations, and most abstracts and bios. What needs a human pass:TBA,Orientation,VLM Agents)Re-running
make import-talksnever overwrites an existing file, so corrections are safe.Two things worth a decision:
_layouts/talk.htmlif you disagree.make talksis all it takes.🤖 Generated with Claude Code