A live read on what America's top 50 universities are telling the Class of 2026 — speakers, themes, transcripts, and season trends.
| Path | Description |
|---|---|
/ |
School explorer (list + map) |
/trends |
Season intelligence — archetypes, topics, insight cards |
/map |
Full-screen map drill-down |
/report/2026 |
Printable season report |
/speech/[id] |
Speech detail page |
/admin |
Scrape log (local tool) |
npm install
npm run db:seed # 50 universities
npm run db:seed-speakers # Research-backed speakers (45+)
npm run dev # http://localhost:3000During commencement season, run weekly:
npm run scrape # Fetch new transcripts
npm run db:seed-speakers # Re-apply research overrides if neededThen check /admin and data/scrape-log.json. The transcript count on /trends is the hero metric once ceremonies begin.
npm run scrape # All 50 universities
npm run scrape -- --dry-run # No DB writes
npm run scrape -- --not-found # Only missing speakers
npm run scrape:pending # Universities without a speaker
npm run scrape -- --rank 1-10 # Rank range| File | Purpose |
|---|---|
data/speakers-2026-complete.json |
Master speaker + topic research |
data/speaker-overrides.json |
Scraper manual overrides (protected) |
data/FACT-CHECK.md |
Verification log |
curl http://localhost:3000/api/season-statsReturns { stats, insights, updatedAt }.
| Variable | Required | Description |
|---|---|---|
OPENAI_API_KEY |
No | Better summary/quote extraction |
BRAVE_API_KEY |
No | Scraper search fallback |
REFRESH_SECRET |
No | GET /api/refresh?secret=... cron trigger |
Next.js 14 · SQLite + Drizzle · React Leaflet · Tailwind · TypeScript
PRD.md— Dashboard, detail pages, scraperPRD-4-TRENDS.md— Trends & season intelligence (implemented)