A school-agnostic, agent-maintained catalog of free student/alumni perks: searchable list, campus map, scenario guides, and a weekly link verifier. Astro + Supabase, deploys to Vercel. Dartmouth is the reference implementation shipped in this template.
The one rule the whole project is built on: a listing only qualifies if a student can
get it without paying money. See docs/quality-guidelines.md;
it's enforced by tests/free-bar.test.ts and surfaced by agents/audit_free.py.
- Use this template → "Use this template" on GitHub (or clone), giving you your own
repo. Keeping
upstreampointed here lets yougit merge upstream/mainto pull engine fixes later. - Install and run:
npm ci && npm run dev→ http://localhost:4321 with the reference (Dartmouth) data, so you can see what you're editing. - Make it yours — edit only the pack files below. Start with
src/site.config.ts(name, brand, categories, scenarios, map center) andsrc/content/resources.json(your perks). Localize the body prose insrc/pages/*.astro. Regenerate the social card withnpm run og. - Verify before you ship:
npm run test(catalog + free-bar gate),npm run typecheck,npm run build. The free-bar gate will fail if a paid/discount entry slips in — that's the point. - Provision the backend (free tiers): create a Supabase project and a Vercel project,
set
PUBLIC_SUPABASE_URL+SUPABASE_SERVICE_KEY(+ the public anon key), run the schema migration in the Supabase SQL editor, thennpm run seedto load your catalog. - Deploy: push to your repo and connect it to Vercel (or
vercel --prod). Point a subdomain at it. Done — your campus has a catalog.
Note: the catalog renders from Supabase at build time and falls back to
resources.jsonif the DB is empty/unreachable. After editing the catalog, re-runnpm run seedand redeploy or the live site won't reflect your changes.
Everything else is the shared engine. Full walkthrough: recipes/recipe-fork.md.
| Pack file | What it controls |
|---|---|
src/content/resources.json |
the catalog (source of record) |
src/content/building-footprints.json |
campus map polygons |
public/tokens.css --color-accent |
brand color → also drives the OG card |
public/og.png |
social card (generated: npm run og) |
src/site.config.ts |
name/branding, categories, collections, scenarios, map center + optional anchor (MAP block) |
agents/verify.config.json |
verifier school + domains + UA |
narrative copy in src/pages/*.astro |
school-specific body prose (titles already wired to SITE) |
npm run gen:schema— regenerate the DB category CHECK fromCATEGORIES.npm run og— regeneratepublic/og.pngfrom name + brand color.
npm ci && npm run dev. Test: npm run test. Typecheck: npm run typecheck.