Every prior edition lives under /archive/{year}/. The structure mirrors the current edition and stays stable across re-imports, so external links to old talks and speakers never break.
/archive/ # edition index
/archive/{year}/ # one edition (Event JSON-LD, EventCompleted)
/archive/{year}/talks/ # talk list for that edition
/archive/{year}/talks/{slug}/ # one talk (canonical)
/archive/{year}/talks/{CODE}/ # 301 redirect → slug URL (HTML meta-refresh + canonical)
/archive/{year}/speakers/ # speaker list
/archive/{year}/speakers/{CODE}/ # one speaker (Person JSON-LD)
/archive/{year}/tracks/ # track index for the edition
/archive/{year}/tracks/{slug}/ # talks in one track (CollectionPage JSON-LD)
Slugs are derived from titles at migration time and frozen in each talk's contents.lr (slug: field). Pretalx codes remain the stable internal identifier — speakers still reference talks by code, and the redirect from /talks/{CODE}/ to /talks/{slug}/ keeps any externally-shared code URL working.
Editions currently archived: 2018, 2019, 2022, 2023, 2024, 2025. (Gap years had no PyCon DE.)
A talk's content/archive/{year}/talks/{slug}/contents.lr carries:
| Field | Source | Notes |
|---|---|---|
code |
Pretalx | Immutable Pretalx submission code, used for cross-references |
slug |
derived | Slugified title; frozen after first migration |
title, abstract, description, track, room, day, start_time, duration |
Pretalx | Re-imports overwrite |
youtube_id, video_link, video_thumbnail, video_duration_iso, recording_available |
YouTube sync | See docs/recordings.md |
transcript, transcript_status, transcript_language |
transcript import | See docs/transcripts.md |
do_not_record |
Pretalx | Suppresses both video embed and transcript display |
Speakers list talks by slug (post-migration). Talks list speakers via the speakers index (lookup by Pretalx code stored on the speaker record).
| Task | Doc |
|---|---|
| Re-import speakers or talks from Pretalx for an archived year | docs/pretalx.md (use --year YYYY on the importer) |
| Link more YouTube recordings to an archived edition | docs/recordings.md |
| Import transcripts for a previously-skipped edition | docs/transcripts.md |
| Regenerate track pages after the talks list changed | uv run python utils/generate_tracks.py |
| Add a Pretalx-code redirect after renaming a slug | uv run python utils/migrate_pretalx_slugs.py (idempotent) |
| Add a manual /old/ → /new/ redirect | docs/redirects.md |
| Verify cross-edition speaker continuity | speaker.html iterates each year's /speakers/{CODE}/; same Pretalx code in multiple years renders the "Also at PyCon DE & PyData" card |
A few invariants the build relies on:
- Pretalx codes are unique within a single edition but not stable across editions — Pretalx mints fresh codes per event. The "Also at" card on a speaker page therefore only catches direct code matches (which Pretalx does sometimes preserve when a speaker re-applies through the same account). A
databags/speaker_aliases.yamlto bridge non-matching codes is an open item — see docs/seo-crosslinking-concept.md §7. - Track names drift between editions ("DevOps" → "DevOps & MLOps" → "MLOps & DevOps"). Each edition's track index is its own page; tracks are not merged across years.
- Slug URLs are immutable. If a talk title changes after the slug is committed, the slug stays — preventing 404s. The displayed title updates normally.
The 2020 and 2021 editions don't exist (cancelled / online-only). If a prior edition needs to be added retroactively:
- Provide a Pretalx event slug; record it in
databags/pretalx.yamlunder that year alongside the year-specific question and submission-type IDs. - Run
uv run python utils/talks.py --year YYYYanduv run python utils/speakers.py --year YYYY. - Run the slug migration to produce slug URLs + Pretalx-code redirects:
uv run python utils/migrate_pretalx_slugs.py. - Run track generation:
uv run python utils/generate_tracks.py. - Optional: import transcripts and link recordings — same workflow as a post-conference cutover.
- Add the edition to the footer year row in
templates/layout.htmland todatabags/past_editions.yaml(homepage card).