Repository navigation
The monthly meetups: 268 pages and the talks they announced, 2007 to 2026 - #216
Merged
Merged
Conversation
layouts/_default/meetup.html prints one meetup: the day as the first line, with the weekday, through partials/event_date.html; then the facts the file holds in the box of partials/facts_box.html, the venue, the group, the registrations, and the Meetup announcement the page was read from; then the talks as the rows of partials/talk_rows.html. A row of the box with no value is left out, so a file with no venue or no registrations gets a shorter box and nothing reads "unknown". partials/facts_box.html is the box itself, a description list with a glyph per row, a link when the row has one, and a note behind a disclosure for the caveat a figure needs: the registrations are who said yes on Meetup and not who came, which AGENTS.md requires the page to say. A row may carry the URL of its link instead of a glyph, and then the mark of the host prints in front of the label through partials/link_mark.html, so the Source row of a meetup carries the Meetup mark. facts.scss styles the box, meetup.scss the page. content/events/meetups/_index.md is the section. Its cascade puts every page of the section on the meetup layout, with _target so the index itself keeps the default list, and its comment says what a file of the section carries and what it leaves out: the Meetup description is the door policy and the logistics of signing up, and an archive records what happened. The index has no menu entry and no year, so it takes no row of its own. content/events/monthly_events.md says where the past meetups are, and partials/meetup-events.html no longer sends a reader to Meetup for them: the card is about the meetup that has not happened yet, which no local record can hold.
One file per meetup under content/events/meetups/, 266 of them written by bin/import-meetups from the Meetup export of the python-barcelona and pyladies-bcn groups, and two written by hand, the call for papers mentoring sessions, which the import skips with the large editions. Each file carries the title, the day, the year, the venue, the registrations, the source URL, and the group, every one a copy of one field of the export with canon() as the only transform. The description is not published, and the comment at the top of each file names the record it came from, so a correction goes to the export or to the script and never to the file. attendance is the yesCount of the RSVPs: who said yes, not who came. AGENTS.md updates the figure behind that rule, 282 of the 285 events of the export have an attendedCount of zero, and says why it moved from 205 of 207. Seven files carry no venue and one no registrations, which the page prints as a shorter box. Hugo builds 268 pages from them and the fallback index at /events/meetups/.
The talks a meetup announced, read out of its Meetup description by a model, checked field by field against the normalized source by bin/check-extraction, and written into the page by bin/import-talks. 213 of the 268 pages carry a talks block; the other 55 are the days whose announcement named no session: a study group, a coding dojo, a sprint, a barbecue, or an early meetup whose announcement said only that there would be one. A talk carries its title, its type, and its speakers as person ids. The import resolves an announced name to a record by the same name, ignoring accents and case, and a name that resolves to nothing stays in speaker_names, which no template reads, so the page credits nobody until a human verifies the person (AGENTS.md). The comment above each block says so. 206 person records are new, one per speaker the meetups credit and no edition does, a name and an id each. With them every speaker id of the archive resolves: bin/check-content reads 379 people and 607 talks on 224 pages, and six records are credited by no event and no page.
…s event The talks of the archive live in the front matter of the event that gave them, and that is where they stay. content/talks/_content.gotmpl, a content adapter, reads every file under content/events/ and adds one page per talk with its id and the content path of its event, and nothing else: the record is joined at render time by partials/talk_record.html, out of the event front matter through site.GetPage, so the page of a talk, the grid of its day, and the rows of its meetup print the same facts from one source. The event is part of the path because a talk id is unique inside its event and not across the archive: the closing Kahoot session is a row of PyDay BCN 2022 and of PyDay BCN 2023. The adapter reads the files itself, through resources.FromString so a front matter that opens with a comment is read as YAML and not guessed as CSV, because site.Pages is not available while the content is being assembled. layouts/talks/single.html prints the page: the box of facts (who gave it, at which event and on which day, the type, the language, the topic, the length, and the record it was read from, with the mark of its host in front of the label), the description as a blockquote in italics, the video as a link with the mark in front, and the links the speaker published, each with the mark of its host and the count on the heading. partials/talk_pages_index.html maps each event and talk id to the page the adapter added, so partials/agenda_entry.html and partials/talk_rows.html link a title to its page only when the page exists, and the modal of a grid block gets a way out to it. partials/hero_header.html gives the h1 a lang attribute when the page carries title_lang: 22 of the 607 titles are in Spanish or Catalan. talks.scss styles the page and the rows. Hugo builds 607 talk pages and the fallback index at /talks/, 990 pages in all.
This was referenced Oct 15, 2026
Closed
ber2
approved these changes
Oct 15, 2026
ber2
left a comment
There was a problem hiding this comment.
There seems to be a triplicated speaker; I flagged it in comments.
Member
Author
There was a problem hiding this comment.
Good catch! Yes, it's triplicated. And just found another one.
Will fix in a different PR.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part 3 of 5 of the Archive, #213. Stacked on #215: its base is
archive/2-model. Retarget it toeditionwhen the one before it merges.The monthly meetups, which are most of what the association has done and none of what the site showed. 19 years of them, 2007 to 2026.
What it adds
/talks/<event>/<id>/, built by a content adapter from the front matter of its event, so 607 talk pages exist with no 607 files.Two things worth knowing while reviewing
The page says registrations, never attendance. The export gives the count of people who said yes on Meetup,
attendedCountis zero on almost every record, and nobody counted the room. The page says that in words under the number.The description of a meetup is the door policy and the logistics of signing up, so it is not published. An archive records what happened, not how to register for something that is over. Most of these pages are a day, a place, and a count, and that is the normal case here rather than a failure.