Welcome to the Google Developer Group Pisa public website ๐ Built with Astro โ fast, mobile-first, and easy to run locally with just Node.js (no Ruby, no gems ๐).
The website is publicly available at https://gdgpisa.it/.
Feel free to fork โธ or star โญ๏ธ this repo! Contributions are really appreciated โ have a look at the Contributing Guidelines or at our Issues.
Don't know where to start? ๐ค Have a look at our help wanted or good first issue tickets.
- โก Astro โ ships (almost) zero JS by default, fast builds, npm/Vite dev server
- ๐ฑ Mobile-first, single-page-first โ most content lives on the homepage, so there's no nav to duplicate or keep in sync
- ๐ Header shrinks into a floating pill on scroll
- ๐ Light & dark theme โ follows system preference, with a manual toggle
- ๐ด Live "next event" widget โ pulls the upcoming event straight from gdg.community.dev, no manual updates needed
- ๐ช DevFest Pisa callout linking to devfest.gdgpisa.it
๐ ฐ๏ธ Google's Product Sans as the site's typeface- ๐งฉ Real icon libraries โ Google's Material Symbols for UI icons, Material Design Icons for social/brand marks
- ๐๐ Seasonal decorations โ Halloween bats & pumpkin, Christmas snow & Santa hat, switched on automatically by date (
src/lib/seasons.ts); preview locally withnpm run dev+?season=halloween/?season=christmas - โฟ WCAG AA color contrast across light and dark themes
You only need Node.js 22+ โ no Ruby, no Bundler, no gems.
git clone https://github.com/gdgpisa/gdgpisa.github.io.git
cd gdgpisa.github.io
npm install
npm run devThe site will be available at http://localhost:4321/ with hot reload. ๐ฅ
docker build -t gdgpisa-site .
docker run --rm -p 4321:4321 gdgpisa-site| Command | What it does |
|---|---|
npm run dev |
Start the local dev server with hot reload |
npm run build |
Build the production site into dist/ |
npm run preview |
Preview the production build locally |
npm run check |
Type-check the whole project |
npm run test:unit |
Run Vitest unit tests |
npm run test:e2e |
Run Playwright end-to-end tests |
src/
โโโ content/ ๐ structured data (heroes.json)
โโโ content.config.ts ๐ Astro content collections + Zod schemas
โโโ data/ ๐งญ social links (TypeScript)
โโโ lib/ ๐ง pure logic: date formatting, live event fetch, chapter stats
โโโ layouts/ ๐๏ธ page shells (BaseLayout, PageLayout)
โโโ components/ ๐งฉ Header (+ nav links), ThemeToggle, HeroCard, UpcomingEvent, Icon, BrandIcon, ...
โโโ styles/ ๐จ design tokens, fonts, resets, global styles
โโโ pages/ ๐ routes (home, heroes, 404)
astro.config.mjs ๐ site config + short-link redirects (/feedbackform, /telegram, /gassistant)
public/
โโโ fonts/product-sans/ ๐
ฐ๏ธ self-hosted Product Sans font files
โโโ static/img/ ๐ผ๏ธ logos, seasonal SVGs (photos live in src/assets/ so Astro can optimize them)
- Heroes (
/heroes/) โ the Hall of Fame, sourced fromsrc/content/heroes/heroes.json. Not in the nav (the homepage already shows the whole team) but linked from there and still a real page. Add someone new by adding an entry there (and their photo insrc/assets/heroes/, where Astro resizes it and converts it to WebP at build time); set"visible": falseto hide someone without deleting their record. - Prossimo evento โ the homepage widget fetches live data from the (unofficial, public) community.dev API for chapter
854โ seesrc/lib/community-event.ts. It always has a graceful fallback if that call fails. - Chapter stats โ the "Cosa รจ un GDG" world/Italy chapter-count boxes are fetched at build time from community.dev's chapter sitemap โ see
src/lib/chapter-stats.ts. Falls back to a static value if the fetch fails. - Icons โ
Icon.astrowraps Google's Material Symbols (generic UI icons);BrandIcon.astrowraps Material Design Icons (mdi, via Iconify) for social/brand marks, with the real brand color by default ormonochrometo match surrounding text.
Feel free to contribute to this project! Have a look at our Contribution guidelines if you're not sure how to proceed.
Open an issue or submit a pull request โค๏ธ โ see CHANGELOG.md for what's already shipped and TODO.md for what's still open.
This project is licensed under the MIT License โ see the LICENSE file for details.