About UW Compass
A CSS 382 (Intro to AI) project that helps UW students find the right campus resource by describing their situation in plain language.
Overview & motivation
UW has more support services than most students know about — tutoring, counseling, food security, transportation, study spaces, career help, financial aid. The problem isn't availability; it's fragmentation. Each office runs its own site, its own intake form, its own vocabulary. A student in trouble usually knows what's going wrong ("I'm overwhelmed and behind in math"), not which office to email.
UW Compass closes that gap. You type your situation in your own words. The app extracts the underlying needs, matches them against a curated set of 31 official UW resources, and gives you ranked recommendations with a short action plan.
UW community impact
The students hit hardest by resource fragmentation are usually the ones with the least time to navigate it: first-year students, transfer students, commuters, and students juggling academic, financial, and wellness pressure at once. UW Compass benefits them by:
- reducing the time students spend searching for help;
- making existing UW services easier to discover;
- letting students describe needs in plain language instead of office names;
- providing short summaries and direct next-step recommendations;
- supporting students who are overwhelmed and need a clearer path to action.
UW Compass does not replace official UW resources. Every recommendation links out to the corresponding UW office or page. It's a routing layer, not a service of its own. For emergencies, students are pointed at SafeCampus and the Husky HelpLine (24/7).
Architecture
One Next.js application. The frontend is a small client-side form; the backend is a single API route running on Node. There's no separate database server — the curated resource set and its precomputed embeddings live in the deploy bundle as a JSON file, regenerated by npm run seed.
Note: Three OpenAI calls per request: 1 embedding + 2 chat completions. The first two run in parallel. Resource embeddings are computed once at seed time, never per request.
Tech stack
- FrontendNext.js 16 (App Router), React 18, Tailwind CSS
- APINext.js Route Handlers (Node runtime)
- EmbeddingsOpenAI text-embedding-3-small (1536 dim)
- Need extractionOpenAI gpt-4o-mini + function calling (Zod-typed)
- StorageStatic JSON bundled into the deploy
- TestingVitest — 26 tests covering ranker + schema + scenarios
- HostingVercel (frontend + serverless API)
- QualityLink-health checker run before each milestone
How the AI works
1Need extraction
The student's free-text input is sent to GPT-4o-mini with a typed tool definition. The model is required to return structured needs — each one with a category, intensity (1–5), the supporting evidence from the input, fine-grained tags (snake_case), and an urgent boolean for safety-critical situations. No free-form JSON, no parsing fragility.
2Semantic retrieval
The same input is also embedded into a 1536-dimensional vector. Every resource has a precomputed embedding (name + category + description + tags). We compute cosine similarity between the input and every resource — fast because we only have 31 resources, no vector database needed.
3Multi-signal ranking
The final score combines four signals:
- 0.50 × Semantic matchNormalized cosine similarity
- 0.25 × Category matchDoes the category match an extracted need?
- 0.15 × Tag overlapShare of extracted tags present in resource
- 0.10 × Urgency boostStudent is urgent AND resource is urgent
After scoring, the top 5 are picked with category diversification (max 2 from any one category) so a student with multiple needs doesn't get a homogeneous result list.
4Per-resource explanations + next steps
The top 5 resources plus the extracted needs go back to GPT-4o-mini (again with a typed tool) which produces a 1–2 sentence explanation per resource and a 2–4 step ordered action plan referencing the student's words.
User guide
- Go to the home page.
- Describe what's going on in your own words. Be honest about what's hard — "I'm stressed and behind in math" works better than "I need tutoring."
- Click Find resources. The first request takes ~3–5 seconds (three OpenAI calls).
- Read the What we heard section first — that's the AI's interpretation. If it's off, rephrase and try again.
- Click any recommendation to go to the official UW page. The Your next steps list is the recommended order to act on them.
For emergencies call 911. For mental-health support call the Husky HelpLine (24/7). For safety concerns contact SafeCampus.
Categories we cover
- Tutoring & Academic Support
- Wellness & Counseling
- Food & Basic Needs
- Transportation & Commuter
- Study Spaces
- Career & Campus Jobs
- Financial Support
Built by
CSS 382 — Introduction to AI · Spring 2026 · A two-person DYOP team. Source code on GitHub.