Multi-year static website for the PyOhio conference, hosted on Netlify. The 2026 site uses Rockgarden (Python SSG) with a custom DaisyUI theme. Previous years are archived via a git submodule.
- Python 3.13+
- just (command runner)
- Rockgarden (
pip install rockgarden) - Node.js / npm (theme CSS rebuilds only)
# Start 2026 dev server
just dev
# Build the 2026 site
just build
# Full production build (all years + 2026 preview)
just build-prod
# Clean build output
just clean
# Rebuild theme CSS (after editing theme styles/templates)
just theme-cssThe 2026 site uses a custom theme at 2026/_themes/pyohio/ built with Tailwind CSS v4 + DaisyUI v5.
To modify the theme:
- Edit CSS in
2026/_themes/pyohio/static-src/input.css - Edit templates in
2026/_themes/pyohio/(Jinja2) - Rebuild CSS:
just theme-css - Rebuild site:
just buildorjust dev
Theme CSS must be rebuilt after changing templates (Tailwind scans them for classes).
/2026/— Current year's site (Rockgarden)content/— Markdown content pages (YAML frontmatter)_themes/pyohio/— Custom theme (templates, CSS, static assets)rockgarden.toml— Site configuration
/netlify-static/— Static files copied directly to production build (e.g._redirects,robots.txt)/archive/— All previous years' built sites (git submodule → pyohio/pyohio-website-archive)/scripts/— Python scripts for PreTalx data import
Each year's site is built with whatever tooling that year used (Astro, Rockgarden, etc.) and only the static build output is preserved long-term — not the source. The archive lives in a separate repo (pyohio/pyohio-website-archive) that's pulled in here as a submodule at /archive/.
When a year wraps up:
- Build a final production copy of the year's site (e.g.
just buildfor 2026). - Push the resulting static output (the
_site/contents, renamed to<YEAR>/) to the archive repo. - Update the submodule pointer here:
git submodule update --remote archive, then commit the new pointer. - Remove the year's source directory from this repo (it's no longer needed; the archive is canonical).
The Netlify production build (just build-prod) copies archive/20* into public/ alongside the current year's build, so all archived years are deployed together.
When rolling over to a new year (e.g. archiving 2026 and starting 2027), several things need updating beyond just the year directory:
justfile—dev,build, andbuild-prodrecipes hardcode the current year's directory.netlify.toml— the build command may reference the current year if anything year-specific is needed; double-check.netlify-static/_redirects— the/ /2026 302rule and any year-agnostic short URLs (/about,/coc, etc.) point at the current year and must be bumped.netlify-static/sitemap.xml— the root sitemap index. Add a<sitemap>entry for the new year's sitemap (e.g.https://www.pyohio.org/2027/sitemap.xml) and keep the now-archived previous year listed. If the new year's tooling doesn't generate a sitemap, add its root URL tonetlify-static/sitemap-archives.xmlinstead.