Content model
The front-matter fields for every content type. Identical across Hugo (TOML) and Astro (YAML, zod-validated), content moves between the two freely.
Blog posts
title, date, description, image, tags[], plus authorship (see below) and an optional speaker block (name, title, photo, bio) for recap posts.
Authors
Posts support three levels of authorship, mix and match:
- Simple byline:
author = "Nadia"(plain text, no page). - Author profiles: create
authors/<slug>entries (name,role,photo,bio,website,social[]), then reference them from posts:authors = ["nadia", "tom"]. Bylines link to the author’s profile page, which shows their bio card and everything they’ve written. - Guest authors: one-off writers who don’t need a profile page: an inline
guestAuthorslist on the post (same fields as a profile). They get a “Guest” badge and a full bio card at the end of the post.
authors = ["nadia"]
[[guestAuthors]]
name = "Wren Alvarez"
title = "Guest writer · reef keeper"
photo = "images/wren.png"
bio = "Keeps a 90-gallon reef."
website = "https://example.com"
authors: ["nadia"]
guestAuthors:
- name: "Wren Alvarez"
title: "Guest writer · reef keeper"
photo: /images/wren.png
bio: "Keeps a 90-gallon reef."
website: https://example.com
Events
title, date (the event’s start, decides upcoming vs past automatically), description, image, tags[], time, rsvp, and venueWanted = true for a “Venue wanted” badge.
Where: either venueRef = "slug" pointing at a venue page (inherits its name, address and arrival notes), or the flat venue + address fields for a one-off location.
Who: either speakers = ["slug"] referencing speaker profiles (rendered as bio cards, multiple supported), or the plain speaker string for a one-liner.
Getting in: checkin (“Bring your registration email, print or phone, and photo ID.”) and venueNotes (“Buzz 204 at the side door; elevator to level 2.”) render in a “Before you arrive” box on the event page; venueNotes overrides the venue page’s own notes.
Set buildFuture = true in your hugo.toml. Upcoming events have a future date, and without it Hugo treats that as a future publish date and drops them from the build.
Organizers
title (name), weight (ordering), role, photo, description (card bio), social[]. Each organizer gets a profile page (linked from their card) showing the bio card and any page body.
Speakers
Speaker profiles live in content/speakers/ with the same fields as authors: title (name), role, photo, bio, website, social[]. Each speaker gets a profile page listing every session they’ve led; events reference them with speakers = ["slug"].
Venues
Venue pages live in content/venues/: title (name), address, photo, notes (arrival instructions like a buzzer code, inherited by every event held there), accessibility, website. Each venue page lists the events it has hosted; events reference one with venueRef = "slug".
Importing content
Events, speakers and venues can be bulk-imported from Sessionize or from a spreadsheet with one command each, cross-references included. See Importing content.
Sponsors & other directories
The organizers layout is a general-purpose “people/partner directory”, a photo-card grid built from a content section. You can reuse it for any list your community keeps:
Create a new section and point it at the organizers layout with type:
# content/sponsors/_index.md
+++
title = "Our sponsors"
type = "organizers"
eyebrow = "Sponsors"
lead = "The organizations that keep our events free."
+++
Then add one file per sponsor (same fields as organizers: role, photo, description, social, weight) and link /sponsors/ from your menu or About page; use the photo slot for a logo. (Speakers and venues no longer need this trick, they’re first-class content types above.)
Copy the organizers pattern: duplicate the organizers collection in src/content.config.ts under a new name (e.g. sponsors), add src/content/sponsors/*.md, and copy src/pages/organizers/[...page].astro to a new route, swapping the collection name and header text.
Docs pages (handbook / runbooks)
Long-form pages with an auto-generated scroll-tracking table of contents from your ## headings. Use the callout and checklist components inside.
Set type = "docs" in front matter; write callouts/checklists with the theme’s shortcodes.
Put the file in src/content/docs/ as MDX; import <Callout> and <Checklist>.
Plain pages
About, code of conduct, get-involved: title, eyebrow, lead + prose.
Nested pages and back links
A page inside a section directory (content/about/financials.md, or on Astro
content/pages/about/financials.mdx) renders a back link to its parent
section. The link text is the parent’s title, or its optional shortTitle
front-matter field when the full title is long:
# content/about/_index.md (Astro: content/pages/about.mdx)
title = "About Our Community and How We Run It"
shortTitle = "About"
Root-level pages have no parent and show no back link.
Venue access & logistics
Venue pages accept optional inclusion fields, rendered as a “Getting there & access” section (omitted entirely when none are set):
wheelchair(true/false): shows a “Wheelchair accessible” badge, on the venue page and on every event held there.transit,parking: short lines.access: a freeform note, the catch-all for washrooms, elevators, a quiet space, childcare, or a scent policy.
The spreadsheet importer has matching columns (see Importing).