A modern, statically-exported Astro rebuild of the Harvard in Tech website — a faithful reproduction of the original (built on a no-code tool) using modern technology, hostable for free on GitHub Pages.
Page content lives in typed
content collections
(markdown under src/content/) and editable JSON singletons (src/data/), not a
runtime database — so there is no server to run. A built-in CRM edits those
same files: a dashboard at /admin (live content counts) fronting the
Sveltia CMS editor at
/admin/editor/. See CMS_SETUP.md for the two sign-in
paths: Local and Token (paste a fine-grained GitHub PAT).
npm run setup # install dependencies (+ Playwright browser for captures)
npm run dev # http://127.0.0.1:4321
npm run build # type-check + static build into dist/
npm run test # component unit tests (vitest + jsdom)A fresh clone works with: git clone → npm run setup → npm run dev.
src/
pages/index.astro # the landing page — composes the section components
pages/admin/index.astro # the CRM dashboard (/admin) — content counts + editor link
components/landing/ # one component per landing section (Hero, Board, …)
components/admin/ # CRM dashboard sections (count cards, summary, sign-in)
layouts/BaseLayout.astro # site shell: data-driven header/nav + footer + SEO
layouts/AdminLayout.astro # CRM shell: header chrome + noindex + content column
content/ # typed content collections (events, team, chapters, pages, blog)
data/ # editable settings.json + nav.json singletons
lib/ # site.ts, mailto.ts, adminDashboard.ts (count helpers)
styles/tokens.css # design tokens (brand blue, Roboto, spacing)
public/admin/editor/ # Sveltia CMS app (index.html + config.yml) served at /admin/editor/
public/images/ # hero/section backgrounds, board graphic, event gallery
- In
astro.config.mjs, setsiteto your Pages URL andbaseto your repo path (dropbasefor a<user>.github.ioroot site). - Push to
main—.github/workflows/deploy.ymlenables Pages automatically (Source: GitHub Actions), then builds and deploys. No manual Settings → Pages toggle in the common case; seeDEPLOY_SETUP.mdfor the fallback if the first deploy 404s.