Repository navigation
The listings, and a page per person: /events/, /talks/, /people/ - #217
Merged
Merged
Conversation
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.
This was referenced Oct 15, 2026
Closed
ber2
approved these changes
Oct 15, 2026
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 4 of 5 of the Archive, #213. Stacked on #216: its base is
archive/3-meetups. Retarget it toeditionwhen 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./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.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.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.