Docs
Changelog
Every notable change to the Popular theme, newest first.
One theme, two implementations: versions are tagged in lockstep in hugo-theme-popular and astro-theme-popular, and this file ships identically in both (PARITY.md Tier 1). Format follows Keep a Changelog; versions follow semver. During 0.x, minor versions may contain breaking changes; they will be called out here.
To hear about new releases: watch either repo on GitHub (Watch → Custom →
Releases) or subscribe to the releases feed
(https://github.com/Mariatta/hugo-theme-popular/releases.atom).
[Unreleased]
[0.7.0] - 2026-07-31
Changed
- The footer shows the theme version (e.g.
v0.7.0) next to the Popular credit, on the demos and the docs site.
Fixed
- The “no upcoming events” empty state no longer renders on event-less sites such as the docs site; it appears only on a community that has an events section but nothing upcoming.
Added
- Recaps toolkit:
gallery+photoandpullquoteshortcodes (Hugo) /Gallery+PhotoandPullquotecomponents (Astro). The gallery is a CSS-grid figure list with no JavaScript and no lightbox (each photo links to its full-size image);altis required and a missing one fails the build. A recap is a blog post taggedrecapthat uses both, with a worked example in the KDrama demo. llms.txt: a build-time plain-text summary for AI agents at/llms.txt, naming the next upcoming event, how to join, and links to the key pages and the calendar feed. Always generated on Astro; on Hugo the site addsLLMSto its home outputs (the demos, exampleSite, and docs site do).- Docs: the deliberate non-features list (job board, member directory, comments, photo lightbox) and the stats strip as the social-proof pattern.
Added
- Talk archive. Events gain optional
recording/slides(single-talk meetups) and atalks[]array (titlerequired;speaker,recording,slidesoptional); whentalks[]is present it wins over the event-level fields. The event page renders a Talks section (or inline links for the simple case), and past-event rows show a recording cue. An opt-in/talks/archive aggregates every talk newest-first, filterable by the parent event’s tags: enable it withcontent/talks/_index.md(Hugo) orSITE.talks = true(Astro). New UI stringswatchRecording,viewSlides,hasRecording,talks,talksLead.
Changed
- Speaker, organizer, and author profile pages no longer repeat the bio: the page hero is now a compact banner (eyebrow, name, back link) and the bio lives only in the persona card below it.
Added
- Community chat bridge and speaker pipeline.
params.community.chat = { url, label }adds a “Join the chat” CTA to the home hero, the footer, and the no-events empty state (platform-agnostic: Discord, Slack, Matrix, Zulip). The starter ships a “Start here” first-timer page (/start/) and a “Speak with us” call-for-speakers page (/speak/).params.speakers.invite = trueappends a “Your name here?” card to the speakers list (new stringsspeakerInviteTitle,speakerInviteBody), off by default.
Fixed
- Astro: the speakers and venues list pages (
/speakers/,/venues/) were missing, so the “All speakers” / “All venues” back links on detail pages led to 404s. Both list pages now exist, mirroring the Hugo templates.
Added
- Notice banner and designed empty states.
params.notice = { text, url? }renders a static, non-dismissible banner above the header (inline-markdown text, an optional link, no JavaScript). When there are no upcoming events, the home page and the events list now render a designed empty state (a message, the community chat CTA if configured, and the calendar-subscribe link) instead of a blank section. New UI stringslearnMore,joinChat.
Added
- Venue access & logistics fields:
wheelchair(a badge on the venue and on events held there),transit,parking, and a freeformaccessnote, shown as a “Getting there & access” section. Inclusion as a data-model concern. Matching spreadsheet-importer columns. New UI stringsgettingThere,wheelchairAccessible,transit,parking.
Added
- Calendar feed: an iCalendar (
.ics) feed of events at/events/calendar.ics, so members subscribe once and every future meetup appears in their calendar app. Reuses the eventtimeparsing (so the feed and the Event structured data agree), marks cancelled events, and adds a “Subscribe to calendar” link to the events list.scripts/check-ics.pyvalidates it in CI. Hugo: addCalendarto the events section outputs.
Fixed
- Speaker, venue and organizer profile pages now show a back link to their
list (matching blog posts and events); the organizer link follows the
renamed team section. New UI strings
allSpeakers,allVenues,allOrganizers.
Added
- Astro package: component overrides.
popular({ overrides: { Header: './src/overrides/Header.astro' } })replaces any of Header, Footer, Hero, EventRow, PostCard, OrganizerCard, AuthorBox, PageHero without forking the theme. (Hugo adopters already override via native template lookup.)
[0.6.0] - 2026-07-23
Search-engine optimisation: structured data, crawl plumbing, Core Web Vitals, and an FAQ block. Zero client JavaScript added.
Added
- Structured data (JSON-LD, byte-identical across both frameworks):
schema.org/Eventon event pages (rich-result eligible, with best-efforttimeparsing; see PARITY.md for the contract),Organizationon home pages,BlogPostingon blog posts, andFAQPagefrom FAQ blocks. - New event fields:
cancelled(a visible danger badge and the structured status, so they never disagree),online(virtual location), andprice/currency/cost(paid-event offers). - FAQ block:
{{< faq >}}/{{< question >}}shortcodes (Astro<FAQ>/<FAQItem>), native<details>with zero JavaScript, answers in the DOM for indexing and AI answer engines. Gated FAQPage JSON-LD viaseo.faqJsonLd(default true). - Crawl plumbing:
robots.txtadvertising the sitemap,og:locale,og:image:alt(optionalimageAltfield), and an opt-innoindexon taxonomy pages (seo.noindexTaxonomies). Astro adds@astrojs/sitemap. - Core Web Vitals: markdown and card/list images lazy-load with async
decoding (hero and event lead stay eager); a
preconnectto the Font Awesome CDN when the default URL is used. - New SEO and FAQ documentation pages;
scripts/check-jsonld.pyvalidates every built JSON-LD block in CI.
[0.5.0] - 2026-07-21
Added
- Computed home-page stats:
@count:<section>(and@count:<section>:rounded) render a live entry count for any section, generalizing@pastEventCount. Factored into a reusable resolver (Hugopartials/stat-value.html, Astrosrc/lib/stats.ts). - Organizer profile pages: each organizer entry renders a bio-card profile
page (Hugo
organizers/single.html, Astroorganizers/[slug]), and organizer cards link to it. NeweyebrowOrganizerUI string. - Back link to the parent section on nested pages, labeled by the parent’s
optional
shortTitlefront-matter field or its title. Astro serves pages through a rest-param route to support nested page ids. - Renameable content sections:
[params.sections](Hugo) /SECTIONS_MAP(Astro) point post-author bylines (authors) and the homepage team grid (team) at differently-named sections, for communities whose people are not “organizers” or whose blog is not written by “authors”. No template overrides needed.
Fixed
- Post cards on date-less pages no longer render “Jan 0001” or a stray eyebrow separator (affects sections of static pages rendered through the default list).
[0.4.0] - 2026-07-14
Added
- Astro package:
popular({ routes: { speakers: false, ... } })disables any injected route group, the supported way to replace part of the content model or provide your own/or/rss.xml. - Astro package: injected slug routes use rest params, so folder-organized
content ids (
2019-pycon-us/cooper-lees) build.
Changed
- Astro: theme pages tolerate undefined or empty collections, rendering no pages instead of failing the build.
- Theme-only CI workflows (deploys, releases, parity checks and reminders) no longer run in forks of either repo.
[0.3.0] - 2026-07-09
Added
- Older/newer post navigation on blog posts, with the cross-framework
ordering contract pinned in PARITY.md (date descending, then title, then
slug;
weighton posts is unsupported). New UI string keys:postNavigation,newerPost,olderPost. - The Sessionize importer can store a site’s endpoint:
--id <embed-id>shorthand, or persist it inpopular-import.toml([sessionize]withidorurl) and run with just--site .. - An updating guide at /docs/updating/: release discovery, per-install-method update steps, and which customization hooks survive updates.
- Astro: phase 1 of npm packaging (PACKAGING.md): the theme as an installable
Astro integration under
package/, with a smoke consumer built in CI. Experimental; the copy-this-repo model is unchanged and remains canonical.
[0.2.0] - 2026-07-08
Fixed
- Query-string URLs no longer double-escape (
&became&amp;, breaking links) in buttons, footer and header links, social icons, and markdown links. CI now fails on any double-escaped ampersand in built output. - Markdown links no longer render a stray space before following punctuation.
- Astro: the RSS
<link rel="alternate">resolves against the configured site instead of hardcoding/rss.xml, fixing subpath deployments.
Changed
- The footer theme credit in demos and starters now links to the project site (mariatta.ca/hugo-theme-popular) instead of the author’s personal site. Adopters control their own credit via footer config.
Added
g-btn--accentbutton variant, with anaccentHoverbrand key (defaults to a darkened accent).--gold-100(card image placeholder tint) now derives frombrand.primarylike its sibling tints, instead of staying champagne on re-branded sites.- Hugo: a
head-extra.htmlhook for analytics or any other head markup, overridable per site without replacing the whole head partial. - Astro: optional
SITE.rssTitlefor the feed link title.
[0.1.0] - 2026-07-08
First public release.
Added
- The theme, in Hugo and Astro parity: events (upcoming/past, venues, speakers, check-in and arrival notes, RSVP, “venue wanted”), multi-author blog with tag filtering and pagination, organizers, sponsors, and a docs area with scroll-tracking TOC and persistent checklists.
- Config-first branding: one
brandblock recolors and retypes the whole site, dark palettes included, pluscustomCSSfor anything further. - Content importers (stdlib-only Python): Sessionize (
sessionize-import.py) and spreadsheet (spreadsheet-import.py, with--make-samplestarter workbook). Unicode-safe slugs, never overwrite, Hugo and Astro output. - Four fictional demos (Rocky Cove Aquarium Club, Lucky Town Foodie Club,
KDrama Fan Club, Truly Madly Riley) plus the neutral “Your Community”
starter (Hugo
exampleSite/, Astrodemos/starter/). - Accessibility groundwork: required alt text enforced in CI, keyboard navigable menus, checklist checkboxes announce state, skip link, WCAG link underlines.
- CI: helper-script tests, image-alt checks (Hugo 0.146 floor + latest), cross-repo parity check, base-path escape scan on deploys.
- Hugo Modules support (
go.mod): import asgithub.com/Mariatta/hugo-theme-popular.