A Next.js 14 (App Router) + TypeScript + Tailwind app that helps California Community College students plan transfers to UC and CSU campuses — modeled after Plan My Transfer / ASSIST.org.
npm install
npm run dev
# open http://localhost:3000- Data layer (
lib/data/*.json) — institutions (10 CCC + 9 UC + 10 CSU sample), 200 seeded courses, 76 majors with articulations. Drop-in replaceable with full ASSIST data following the same schema (types/index.ts). - State — Zustand store (
store/usePlan.ts) persistsactiveColleges,completed,targetMajorsto localStorage. - Logic engine (
lib/logic.ts)evaluateMajor()→ completion %, missing requirements with CCC course suggestions.computeEligibility()→ UC/CSU transferable units, separate UC/CSU GPAs, UC 7-course pattern progress, IGETC + CSU GE Breadth area flags.overlapAcrossMajors()→ highlights shared courses across selected target majors (efficiency algorithm).
- UI (
app/page.tsx)- Sidebar: multi-college academic history, search-to-add course autocomplete, eligibility card with progress bars, major picker (filterable).
- Main: ranked University Cards (% complete, expandable completed/missing reqs with suggested CCC course), side-by-side comparison grid, overlap panel.
- Tailwind dashboard styling, mobile-first responsive grid.
- API routes (
app/api/*) — JSON endpoints ready to swap for a real DB / ASSIST proxy.
institutions(id PK, name, system ENUM('CCC','UC','CSU'), abbreviation)
courses(id PK, college_id FK, department, number, title, units,
transferable_uc BOOL, transferable_csu BOOL, igetc_areas TEXT[], csu_ge_areas TEXT[])
majors(id PK, university_id FK, name)
requirements(id PK, major_id FK, label, units)
articulations(id PK, requirement_id FK, course_id FK) -- "satisfied by"
ge_patterns(id PK, kind ENUM('IGETC','CSU_GE','CAL_GETC'), area, rule_json)
users(id PK, email, ...)
user_plans(user_id FK, college_ids[], target_major_ids[], completed JSONB)
The TypeScript types in types/index.ts map 1:1 to these tables.
- Ingest — scrape/sync ASSIST agreements per (CCC, university, major) tuple into
articulations. The seed loader at the bottom of this README shows the shape. - Auth — add Clerk or Supabase Auth; persist
user_plansserver-side. - Cal-GETC — implement new unified pattern in
lib/logic.ts(replace IGETC + CSU GE Breadth where applicable for Fall 2025+). - TAG / TAP — flag UC Transfer Admission Guarantee programs per major.
app/page.tsx— dashboard layoutcomponents/CourseSearch.tsx— multi-college course autocompletecomponents/UniversityCard.tsx— % complete + missing-requirement suggestionscomponents/OverlapPanel.tsx— efficiency algorithm outputcomponents/EligibilityCard.tsx— units, GPAs, 7-course patternlib/logic.ts— pure functions, unit-testablestore/usePlan.ts— Zustand + persist