Skip to content

The listings, and a page per person: /events/, /talks/, /people/ - #217

Merged
DZPM merged 7 commits into
editionfrom
archive/4-listings
Oct 16, 2026
Merged

DZPM merged 7 commits into
editionfrom
archive/4-listings

Conversation

@DZPM

@DZPM DZPM commented Oct 15, 2026

Copy link
Copy Markdown
Member

Part 4 of 5 of the Archive, #213. Stacked on #216: its base is archive/3-meetups. Retarget it to edition when the one before it merges.

The three parts before this put 281 events, 607 talks, and 372 people into the repository. None of them was reachable: there was no page that listed them. This is that page, three times over, plus a page per person.

What it adds

  • /events/: a table of six columns, grouped by year and by month, 281 rows, newest first. A row is the day, the title, the venue, and what that day left behind.
  • /talks/: the same table with one more level, 607 rows under 224 events, each talk credited to a person who has a page.
  • /people/: two lines per person, the name and the social marks, then the roles and the list of events. 250 of the 372 have no photograph and get initials on a colour derived from their name.
  • A page per person, /people/<id>/, which is what Stop publishing the person and sponsor pages until the Archive gives them content #201 stopped until the Archive gave those pages something to say. It now has: a page lists the talks that person gave, the events they were at, and the photographs of their talks. Every one of them has an inbound link, which was the complaint of that issue.
  • The pieces the three listings share: data/venues.yaml (87 venues, 70 short names), the type markers and their legend, the count card, the date partial, and the box of facts a page prints about its subject.
  • The card of a person on the organizers page becomes a link to their page, so the modal goes: 20 dialogs per page, and the organizers page drops from 122 KB to 33 KB.
  • Six person records that no page credits are removed, each with its reason in the commit.
  • The home feed sorts by the day an event happened, not the day it was committed. With 282 events imported in one go, the old sort put all of them on top at once.

On publishing a page per person

Speakers accepted, in the proposal form, to appear in photographs and on social media. Attendees did not, and no attendee gets a page, a name, or a count tied to their identity. A new person record holds a name and nothing else: 240 of the 243 hold only the name their own announcement published.

DZPM added 7 commits October 15, 2026 10:15
The pages that list the whole archive need the same counts in three
places: the total in the h1, the legend above the rows, and the card of
counts on each row. partials/listing_counts.html walks site.RegularPages
once per build, through partialCached with a constant variant, and
returns what the three listings need: how many rows of /events/ and
/talks/ carry each type, how many rows /people/ has, and per row what the
day, the talk, or the person holds. The rule of what is a row is the rule
of the page that draws it, so the legend, the heading, and the rows add
up.

Around it, the parts a listing page draws and no other page has:

- partials/count_card.html, the card of counts of a row, one icon and one
  number per kind (talk, photo, video, links, event), an item with a count
  of zero left out, no card at all for a row with nothing to count. The
  links of a talk are every link of its record that is not its video,
  under one mark: the slides, the code, a notebook, a site.
- partials/listing_total.html, the total of the one page it is on, which
  partials/hero_header.html prints in the h1: "Events (281)".
- partials/jump_bar.html, the bar of links above a long index, one per
  group, which wraps with no script. From the lg breakpoint the bar is
  pinned under the navigation as the page scrolls (main.scss says why not
  below it: on a phone it would hold a quarter of the window), and every
  anchor it points at clears it with scroll-margin-top.
- partials/marker_legend.html, the markers the rows draw with how many
  rows carry each.
- partials/event_type.html and data/event_emoji.yaml, the type of an
  event page from its folder, its title, and its group, and the glyph
  the row prints for it, in one table.
- listing_table.scss, the stylesheet of the table /events/ and /talks/
  share, and the rules of main.scss for the jump bar, the legend, the
  line of facts under a title, and the card.

The photos of a day are counted as zero until the gallery lands; the
partial reads them from the gallery and nothing else counts them.
layouts/_default/events_index.html lists every event the association has
organized, 281 rows in this tree, newest first: the year, the month, the
day, the title with its type glyph, the venue, and the card of counts.
The year and the month print once per group and span the rows under
them. A table and not a grid of list items, because the content is six
facts per row that a reader compares down a column, and a table gives a
screen reader the header cells for free. The day column prints the first
day of an edition that ran more than one day and not its range: the
range stays on the page of the edition, through partials/event_date.html.
content/events/_index.md takes the layout and opens with a line about
what the list is.

data/venues.yaml maps the exact venue string of an event to the short
name the list prints: 87 venues, 44 of them shortened, 70 short names.
The page of the meetup keeps the full string; only the column is short,
and it carries the full name as its hover only when that name says more
than the short one once case and accents are folded away, because the
table restores the accents the source lost and a hover that shows the
same name with one accent fewer says nothing.

bin/check-content gains check_venues, which reads the table against the
pages in both directions: every venue string of an event has a row, and
every row is the venue of at least one event. Without the first rule a
long name comes back in the list in silence the day an event arrives
with a venue the table does not know; without the second a row no page
uses is a row nobody checks. The summary line reports the table.
AGENTS.md names the two data files and the two new failures.
layouts/talks/list.html lists every talk of every programme, 607 rows
under 224 events, newest first: the year, the month, the day, the event,
the talk with its type glyph and its speakers, each a link styled as
one, and the card of counts (photos, videos, and the other links of the
record under one mark). It is the table of /events/ with one more group
level, the event, which prints once on the first row of its talks and
spans the rows below. The structure, the roles, the caption, the column
headers, and the stylesheet are the ones events_index.html uses, so the
two pages cannot drift.

partials/person_page_link.html is the one place that decides where the
name of a speaker points. It links to the page of the person when the
build holds one, and to the anchor of the id on /people/ otherwise, so
a row of this table and a credit on a talk page send a name to the same
place, and the page per person can arrive on its own.

content/talks/_index.md is the section page the layout draws, with a
menu entry and a line about what the list is. The fallback list of
layouts/_default/list.html, which the section drew until now, goes.
partials/appearances_index.html used to index the people listed on
/pybcn_association/organizers/ and nobody else, because every other
person was a speaker or a volunteer of one event, whose modal would have
listed that one event and nothing else. The talks ended that: every
speaker of every talks block is indexed under the heading "Speakers",
the heading the curated level of an event page already carries, so a
person a page lists by hand and credits with a talk is kept once. 353
people gave at least one talk, over 544 pairs of a person and an event.

Each appearance now carries the type of its event, resolved in the one
walk through partials/event_type.html, so the row of /people/ and the
page of a person print the glyph of the event next to its name without a
second walk of the site per row. A page with no year carries an empty
type: its marker is the glyph of the role. It also carries the date and
the end_date of the page as the front matter writes them, so the Events
table of a person page can set the month and the day in columns through
partials/event_date.html without reading the page again.
The cascade in config.toml that stopped the person pages (#202) stops
the sponsor pages alone now. #201 set the condition for the return of
the person pages: that they come back with the Archive, when every
person has one worth linking to. The Archive met it, and the content of
a person page is what the Archive says about the person. The header is
the portrait, or the placeholder the row of /people/ draws, with the
social links beside it as the mark of the host and the handle, and under
them the roles and the number of events in one sentence. Then the Bio of
the record; the Roles, one line per level of the association; the
Events, one row per appearance, a talk given with the talk linked to its
page or a role held, grouped by year with the month and the day in
columns as on /talks/, and the card of what each talk left behind; the
Photos of those talks, from the galleries, once the galleries exist; and
a last block that says how the page is made and how to ask for a change.
Every heading over a list carries its count. Six records are credited by
nothing and get a page with what their file carries, until the last
commit of this series takes them out.

layouts/people/single.html is the page, and
partials/person_talks_index.html the index of talk pages by person it
reads. partials/person_appearances.html and partials/person_links.html,
which fed the modal of a person card, now feed the page and nothing
else, and the modal-only fields and the thumbnail index are gone.
partials/person_placeholder.html draws the mark of a record with no
photo, the initials on a colour derived from the name, where the
portrait would be; the row of /people/ takes it too, in the commit that
follows, with the stylesheet of its colours.

The card itself becomes a link to the page. partials/people_summary.html
drew a card with a modal behind it: the photo and the name were two
buttons that opened the same dialog, and the dialog held a heading tree
of its own that bin/check-rendered had to cut out of the outline of the
page. The card is now one anchor around the photo and the name, to
/people/<id>/, which holds everything the modal showed and more. One tab
stop per card instead of two, no JavaScript to read about a person, and
the 22 dialogs of /organizers/ are gone. partials/people-grid.html no
longer hands each card a key for the id of its modal, and people.scss
drops the 500 lines of modal rules with it. README.md indexes the
decision and corrects the list of column counts a level may use (2, not
a second 4).
partials/role_order.html sorts the roles of a person by importance in
the association (Management Board, Permanent Committee, Organizer,
Collaborator, Speaker, Mentor, Volunteer), for the header of this page,
the rows of its Events table, and the row of /people/. people_page.scss
styles the page.

The person pages are in the sitemap and not in the home feed:
layouts/_default/rss.xml leaves the people section out by name, as it
does the talks, because hundreds of pages that arrive in one build are
not that many publications. The feed is ordered by the day the event
happened, .Date, and no longer by the commit date: the archive import
put every page it added on one lastmod, and 268 meetup pages took the
whole window of a reader. config.toml caps the feed at 20 items.
index.llms.txt says where the pages are.
layouts/people/list.html lists the 378 records of the section, one row
per person on two lines: the photo or a placeholder, the name linked to
the page of the person and the social marks, and under them a sentence,
the roles in the order of the association, "at", and the number of
events, then the pages that credit the person, each with the glyph of
its event. A list and not the card grid of /organizers/, because the grid
pays about 230 px per face and 378 faces are 32 screens with no way to
find a name. The order is the first letter of the id, with a jump bar of
letters above, pinned under the navigation from the lg breakpoint,
because the question the page answers starts from a name; an order by
appearances would publish a ranking the association never made.

partials/person_placeholder.html draws the mark of a person with no
photo: the initials on one of ten colours derived from the name, all
above 5:1 against white, in the 48 px slot of the row and at 240 px on
the page of the person. David Arcos compared three options on 2026-10-14
and chose this one. partials/person_social_icons.html prints the links
of a record as a row of brand marks. people_index.scss styles the page,
and content/people/_index.md is the section page with its menu entry.

AGENTS.md says the pages exist, with the command that recounts the
build. README.md describes the list and indexes the two decisions.
Each record below is credited by no talk, no people block, and no
caption, so its row on /people/ and its page carried a name and nothing
else. bin/check-content named the six on every run.

Marc Pomar, Thomas Alisi, and David Blazquez Garcia were added on
2025-11-20 by the commit "Add Speakers PyDay 2025", a record and a
photograph per speaker of that edition. The published programme of that
day credits 20 people and none of the three: their surnames appear
nowhere in the event file. The lineup changed and the records stayed.
David Arcos, 2026-10-15: "si no estan enlazados en nada, debieron caer.
Fuera, eliminalos, foto y todo." The photographs go with them.

Ricardo Martinez held a name and the position Collaborator, with no
photograph, no bio, and no link. The record arrived in December 2020
with the commit that published the new site and was renamed twice since;
no page, no frozen snapshot, and no commit mentions the person under
either id. Peter Krupa was added in June 2025 by the commit that set the
new management board and did not take up the role.

Patricio Reyes Valenzuela was listed among the organizers of PyDay BCN
2022 and taken out ten days later by commit cc1fe52, "Remove Patricio
Reyes as organizer, because he is a volunteer": the correction removed
him from the organizers instead of moving him to a list of volunteers,
which the page does not have. Restoring the fact would mean a volunteers
section with one name in it, and no source we hold says who the
volunteers of that day were. David Arcos: "no puedo saber la lista de
voluntarios de 2022. Anadir la seccion, con solo Patricio, seria
injusto. No vamos a reescribir la historia." The commit stays in the
history for anyone who looks.

The section holds 372 records after this, and bin/check-content counts 373
people with the canary fixture. The build reaches 1364 HTML pages with -D,
one per record, and none for the six.
@DZPM
DZPM changed the base branch from archive/3-meetups to edition October 16, 2026 06:17
@DZPM DZPM closed this Oct 16, 2026
@DZPM DZPM reopened this Oct 16, 2026
@DZPM
DZPM merged commit 3aeac76 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