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 46 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 client-side React form; the backend is a set of API routes running on Node. The curated resource set and its precomputed embeddings live in the deploy bundle as a JSON file. Anonymously shared queries and feedback votes are stored in Supabase (Postgres) and accessed via the gallery and feedback API routes.
Supabase (Postgres) — gallery & feedback
Note: Three OpenAI calls per request: 1 embedding + 2 chat completions. The first two run in parallel. Optional two_pass and use_ai_ranker flags add 1–2 extra calls. Resource embeddings are computed once at seed time, never per request. Supabase writes (gallery, feedback) are fire-and-forget and do not block the response. A GitHub Actions CI workflow runs typecheck, lint, tests, and a full build on every push and PR.
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)
- StorageResources: static JSON in deploy bundle · Gallery & feedback: Supabase (Postgres)
- TestingVitest — 83 tests across 7 files (ranker, schema, scenarios, i18n, iCal, rate limiter, campus filter)
- HostingVercel (frontend + serverless API)
- QualityGitHub Actions CI on every push & PR; weekly automated link-health check
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 must return structured needs — each one with a category, an 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 46 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.
5Advanced options: two-pass critique, AI re-rank & iCal export
Three optional flags extend the core pipeline. two_pass sends a second GPT-4o-mini call right after need extraction — the model reviews its own output to catch false-urgent flags and missed categories. use_ai_ranker replaces the cosine ranker with an LLM pass that reads the full need list and selects the best-fitting resources directly (useful for comparing against the classical ranker). Once results arrive, the generated action plan can be downloaded as a standards-compliant .ics calendar file, scheduling each step automatically in any calendar app.
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.