Skip to content

The monthly meetups: 268 pages and the talks they announced, 2007 to 2026 - #216

Merged
DZPM merged 4 commits into
editionfrom
archive/3-meetups
Oct 16, 2026
Merged

DZPM merged 4 commits into
editionfrom
archive/3-meetups

Conversation

@DZPM

@DZPM DZPM commented Oct 15, 2026

Copy link
Copy Markdown
Member

Part 3 of 5 of the Archive, #213. Stacked on #215: its base is archive/2-model. Retarget it to edition when 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

  • 268 pages, one per meetup, with the date, the venue, and how many people registered. 266 come from the Meetup export, and 2 are the call for papers mentoring sessions of 2017 and 2019, which existed nowhere and were written by hand.
  • The talks those meetups announced, read out of 19 years of descriptions written in three different formats, and the 206 person records they credit.
  • A page per talk, /talks/<event>/<id>/, built by a content adapter from the front matter of its event, so 607 talk pages exist with no 607 files.
  • The layout of a meetup page and the index of the section.

Two things worth knowing while reviewing

The page says registrations, never attendance. The export gives the count of people who said yes on Meetup, attendedCount is 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.

DZPM added 4 commits October 15, 2026 10:04
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.
@DZPM
DZPM requested a review from a team as a code owner October 15, 2026 10:04
@DZPM DZPM self-assigned this Oct 15, 2026

@ber2 ber2 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There seems to be a triplicated speaker; I flagged it in comments.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likely to be duplicated.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch! Yes, it's triplicated. And just found another one.

Will fix in a different PR.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto.

@DZPM
DZPM changed the base branch from archive/2-model to edition October 16, 2026 06:07
@DZPM
DZPM changed the base branch from edition to archive/2-model October 16, 2026 06:07
@DZPM
DZPM changed the base branch from archive/2-model to edition October 16, 2026 06:11
@DZPM DZPM closed this Oct 16, 2026
@DZPM DZPM reopened this Oct 16, 2026
@DZPM
DZPM merged commit 84734de into edition Oct 16, 2026
10 checks passed
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.

2 participants