Skip to content
Contributing

Contributing to the Website

How to add blog posts, events, and pages to vancouver.pyladies.com. Anyone can contribute: you don't need special access, just a GitHub account and a pull request.

How the site works

The site is a Hugo project using the Popular theme (bundled in themes/popular), in our GitHub repo. Changes go through a pull request and deploy automatically via Netlify once merged. Every pull request gets a Netlify deploy preview, so you (and reviewers) can see the rendered result before merging.

The theme uses plain CSS: no SCSS, npm, or Hugo modules. A standard Hugo install (v0.126.0 or newer) is all you need.

Getting set up

  1. Fork and clone the repo, or create a branch if you have access.
  2. Run the local dev server:
hugo server
  1. Open http://localhost:1313/ and edit files under content/. The browser reloads as you save.
  2. When it looks right, open a pull request against main.

New to git and GitHub?

Contributing to this website is a great way to get started in open source: the changes are small and low-stakes, the workflow (fork, branch, pull request, review) is exactly what you’ll use on any other open source project, and a friendly organizer reviews every pull request. Some good resources for learning the tools:

Stuck on a git problem? Open an issue describing where you’re stuck and we’ll help you through it. Working in the open like this is normal in open source, and no question is too basic.

Writing a blog post

Blog posts live in content/blog/ as Markdown files:

---
authors: ["mariatta"]
title: "Recap: our amazing workshop"
date: 2026-07-15
description: "One or two sentences shown on the blog cards and in search results."
tags: ["meetup", "events", "pyladies", "vancouver"]
image: img/my-banner.png
---
  • authors refers to author profiles in content/authors/ by filename. First time writing? Add yourself: copy content/authors/mariatta.md and fill in your name, role, bio, and links. One-off guest writers can use guestAuthors in the post instead.
  • image is the banner. It displays at a 16:9 aspect ratio on the post header and the blog cards, so export it at 16:9 (for example, 1600x900 pixels or larger). It is also the social sharing preview, which platforms crop to roughly 2:1, so keep text, logos, and faces centered.
  • Images go in static/img/ and are referenced as img/filename.png.

Adding an event

Each meetup gets a small page in content/events/. Future-dated events show under Upcoming on the Events page and power the “Next meetup” section on the homepage; once the date passes, they move to Past automatically.

+++
title = "August meetup: something wonderful"
date = 2026-08-10T18:00:00-07:00
description = "One or two sentences shown on the event row."
image = "img/august-banner.png"
tags = ["meetup", "talks"]

venue = "Venue name"
address = "123 Street, Vancouver"
time = "6:00 PM"
speaker = "Speaker Name"
rsvp = "https://luma.com/pyladiesvancouver"
+++

A short description of the event. Link to the announcement blog post if there is one.

Field notes:

  • date is the event start time, with the Vancouver UTC offset (-07:00 in summer, -08:00 in winter). It controls the upcoming/past split.
  • rsvp shows an RSVP button; use it for upcoming events only.
  • image is optional and does not appear on the events list or the event page; it is only used as the social sharing preview when the event page is linked. 16:9 with centered content works well.
  • venueWanted = true shows a “Venue wanted” badge while you’re still looking.
  • meetupUrl records the original Meetup page for events from our Meetup era. Our 72 past Meetup events (2015-2025) were imported this way. To link back to Meetup on the event’s detail page, add a button in the body:
{{< button url="https://www.meetup.com/pyladies-vancouver/events/123/" label="View this event on Meetup" variant="outline" icon="fa-brands fa-meetup" >}}

The events list intentionally shows no external links; each row links to the event’s own page, and the linkback to Meetup lives there.

Organizer and author photos

  • Organizer cards (content/organizers/, the photo field) display as a square (1:1), so use a square photo, at least 600x600 pixels, with the face centered.
  • Author photos (content/authors/, shown on blog posts) and persona shortcode photos render as small circles, so a square photo with the face centered works here too; 300x300 pixels is plenty.
  • Like banners, photos go in static/img/ and are referenced as img/filename.jpg.

Shortcodes you can use

The theme ships shortcodes for use in any Markdown page:

  • button: a styled link, as in the example above. Variants: primary, secondary, outline, ghost, dark.
  • callout: an info/tip/warn box. Use the {{% callout %}} form so the body renders as Markdown.
  • persona: a speaker or person card with photo, name, and bio.
  • checklist: a tick-box list that remembers progress in the visitor’s browser (used in the Runbooks).
  • badge: a small label like “Confirmed”.

See the theme’s README for the full syntax of each.

Site configuration

Menus, brand colours, the footer, and social links all live in hugo.toml under [params]. Most content contributions never need to touch it.

Questions and ideas

We work in the open, so the default place for anything website related is GitHub issues: questions, bug reports, typos you don’t have time to fix yourself, and ideas for new content are all welcome there. Issues keep the discussion public and searchable, so the next contributor benefits from the answer too.

For the meetup-organizing side of things, see the Meetup Runbooks; for ways to participate beyond the website, see the Handbook. You can also say hi in the #city-vancouver channel on the PyLadies Slack.